Proposal: switch expressions
David Koblas
david at koblas.com
Mon Feb 25 14:01:34 UTC 2019
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 <blueshuk2 at 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 <david at 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 at mozilla.org
>> https://mail.mozilla.org/listinfo/es-discuss
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20190225/1f4e29c2/attachment-0001.html>
More information about the es-discuss
mailing list