I quite aware that it’s covered in do expressions. Personally I find do 
expressions non-JavaScript in style and it’s also not necessarily going to make 
it into the language.  

Hence why I wanted to put out there the idea of switch expressions. 

--David


> On Feb 25, 2019, at 5:28 AM, N. Oxer <bluesh...@gmail.com> wrote:
> 
> Hi,
> 
> This would be covered by do expressions. You could just do:
> 
> ```js
> const category = do {
>   switch (...) {
>     ...
>   };
> };
> ```
> 
>> On Sun, Feb 24, 2019 at 10:42 AM David Koblas <da...@koblas.com> wrote:
>> After looking at a bunch of code in our system noted that there are many 
>> cases where our code base has a pattern similar to this:
>> 
>>      let category = data.category;
>> 
>>      if (category === undefined) {
>>        // Even if Tax is not enabled, we have defaults for incomeCode
>>        switch (session.merchant.settings.tax.incomeCode) {
>>          case TaxIncomeCode.RENTS_14:
>>            category = PaymentCategory.RENT;
>>            break;
>>          case TaxIncomeCode.INDEPENDENT_PERSONAL_SERVICE_17:
>>            category = PaymentCategory.SERVICES;
>>            break;
>>          case TaxIncomeCode.INDEPENDENT_PERSONAL_SERVICE_17:
>>            category = PaymentCategory.SERVICES;
>>            break;
>>        }
>>      }
>> 
>> I also bumped into a block of go code that also implemented similar 
>> patterns, which really demonstrated to me that there while you could go 
>> crazy with triary nesting there should be a better way.  Looked at the 
>> pattern matching proposal and while could possibly help looked like it 
>> was overkill for the typical use case that I'm seeing. The most relevant 
>> example I noted was switch expressions from Java.  When applied to this 
>> problem really create a simple result:
>> 
>>      const category = data.category || switch (setting.incomeCode) {
>>        case TaxIncomeCode.RENTS_14 => PaymentCategory.RENT;
>>        case TaxIncomeCode.ROYALTIES_COPYRIGHTS_12 => 
>> PaymentCategory.ROYALTIES;
>>        case TaxIncomeCode.INDEPENDENT_PERSONAL_SERVICE_17 => 
>> PaymentCategory.SERVICES;
>>        default => PaymentCategory.OTHER;
>>      }
>> 
>> Note; the instead of using the '->' as Java, continue to use => and with 
>> the understanding that the right hand side is fundamentally function.  
>> So similar things to this are natural, note this proposal should remove 
>> "fall through" breaks and allow for multiple cases as such.
>> 
>>      const quarter = switch (foo) {
>>        case "Jan", "Feb", "Mar" => "Q1";
>>        case "Apr", "May", "Jun" => "Q2";
>>        case "Jul", "Aug", "Sep" => "Q3";
>>        case "Oct", "Nov", "Dec" => { return "Q4" };
>>        default => { throw new Error("Invalid Month") };
>>      }
>> 
>> Also compared this to the do expression proposal, it also provides a 
>> substantial simplification, but in a way that is more consistent with 
>> the existing language.  In one of their examples they provide an example 
>> of the Redux reducer 
>> https://redux.js.org/basics/reducers#splitting-reducers -- this would be 
>> a switch expression implementation.
>> 
>>      function todoApp(state = initialState, action) => switch 
>> (action.type) {
>>        case SET_VISIBILITY_FILTER => { ...state, visibilityFilter: 
>> action.filter };
>>        case ADD_TODO => {
>>            ...state, todos: [
>>              ...state.todos,
>>              {
>>                text: action.text,
>>                completed: false
>>              }
>>            ]
>>          };
>>        case TOGGLE_TODO => {
>>            ...state,
>>            todos: state.todos.map((todo, index) => (index === 
>> action.index) ? { ...todo, completed: !todo.completed } : todo)
>>          };
>>        default => state;
>>      }
>> 
>> 
>> 
>> _______________________________________________
>> es-discuss mailing list
>> es-discuss@mozilla.org
>> https://mail.mozilla.org/listinfo/es-discuss
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to