imj
    TypeScript icon, indicating that this package has built-in type declarations

    0.0.33 • Public • Published

    imj

    Not fastest but powerful immutable helper

    Simple update

    import imj from "imj";
     
    const Increase = imj({
      count: ({ value }) => value + 1
    });
    const Decrease = imj({
      count: ({ value }) => value - 1
    });
    Increase({ count: 1 }); // { count: 2 }
    Decrease({ count: 1 }); // { count: 0 }

    Retrieve argument values

    import imj from "imj";
     
    const Increase = imj({
      count: ({ value, $1 = 1 }) => value + $1
    });
     
    Increase({ count: 1 }); // { count: 2 }
    Increase({ count: 1 }, 2); // { count: 3 }

    Update array

    import imj from "imj";
     
    const AddTodo = imj({
      // map second argument to $text and the third to $done
      $args: "$text $done",
      todos: ({ $text, $done, push }) =>
        // push new item to todos array
        push({ text: $text, done: $done })
    });
     
    AddTodo({ todos: [{ text: "first", done: false }] }, "second", true);
    // { todos: [ { text: 'first', done: false }, { text: 'second', done: true } ] }

    Update specified items in array

    import imj from "imj";
     
    const ToggleDoneSpecs = { done: ({ toggle }) => toggle() };
     
    const ToggleTodoByIndex = imj({
      $args: "$index",
      // create custom specs
      $extend: ({ $index }) => ({
        todos: {
          // toggle done property of specified item ($index)
          [$index]: ToggleDoneSpecs
        }
      })
    });
     
    const ToggleOneTodoByText = imj({
      $args: "$text",
      todos: {
        // update first match only
        $one: ({ value, $text }) =>
          value.text === $text
            ? // return specs for matched item
              ToggleDoneSpecs
            : // unless do nothing
              null
      }
    });
     
    const ToggleAllTodoByText = imj({
      $args: "$text",
      todos: {
        // update all
        $many: ({ value, $text }) =>
          value.text === $text
            ? // return specs for matched item
              ToggleDoneSpecs
            : // unless do nothing
              null
      }
    });
     
    const ToggleAll = imj({
      todos: {
        $many: ToggleDoneSpecs
      }
    });

    Simple redux reducer

    import imj from "imj";
     
    const IncreaseAction = 1;
    const DecreaseAction = 2;
    const reducer = imj({
      $when: [
        "$1.type",
        {
          [IncreaseAction]: {
            count: ({ value, $1: { payload = 1 } }) => value + payload
          },
          [DecreaseAction]: {
            count: ({ value, $1: { payload = 1 } }) => value - payload
          }
        }
      ]
    });
    reducer({ count: 1 }, { type: IncreaseAction }); // { count: 2 }
    reducer({ count: 1 }, { type: IncreaseAction, payload: 2 }); // { count: 3 }
    reducer({ count: 1 }, { type: DecreaseAction }); // { count: 0 }
    reducer({ count: 1 }, { type: DecreaseAction, payload: 2 }); // { count: -1 }

    Other implementation

    import imj from "imj";
     
    const IncreaseAction = 1;
    const DecreaseAction = 2;
    const reducer = imj({
      // define named $when
      $when_increase: [
        "$1.type",
        IncreaseAction,
        {
          count: ({ value, $1: { payload = 1 } }) => value + payload
        }
      ],
      $when_decrease: [
        "$1.type",
        DecreaseAction,
        {
          count: ({ value, $1: { payload = 1 } }) => value - payload
        }
      ]
    });

    Install

    npm i imj

    DownloadsWeekly Downloads

    1

    Version

    0.0.33

    License

    ISC

    Unpacked Size

    126 kB

    Total Files

    13

    Last publish

    Collaborators

    • linq2js