cerebral-tcomb

immutable and type checked model layer for cerebral

Usage no npm install needed!

<script type="module">
  import cerebralTcomb from 'https://cdn.skypack.dev/cerebral-tcomb';
</script>

README

immutable and type checked model layer for cerebral based on tcomb

API

Note. If you don't know how to define types with tcomb you may want to take a look at its README or the GUIDE.

model API

Model(initialState, [State])

Example

var Controller = require('cerebral');
var Model = require('cerebral-tcomb');
var t = Model.t; // the tcomb library is re-exported

// define the state type
var State = t.struct({
  email: t.String,
  profile: t.struct({
    age: t.Number
  }),
  tags: t.list(t.String),
  other: t.Any
});

// the initial state of the application
var initialState = State({
  email: 'a@domain.com',
  profile: {
    age: 41
  },
  tags: ['web developer'],
  other: {a: 1}
});

// any default input you want each action to receive
var defaultInput = {};

// instantiate the controller
// the argument `State` is optional, by default its value
// is the initialState's constructor
var model = Model(initialState, State);

// instantiate the controller
var controller = Controller(model, defaultInput);

controller.signal('test', function (input, state, output) {
  // use the API here
});

state API

Note: a path can be a string or an array.

var Path = union([t.String, t.list(t.String)]);

get(path: Path)

state.get('email'); // => 'a@domain.com'
state.get(['profile', 'age']); // => 41

set(path: Path, value: t.Any)

state.set('email', 'b@domain.com');
state.set(['profile', 'age'], 42);

unset(path: Path)

Same as set(path, null).

state.unset('email'); // it throws if email is not a t.maybe(t.String)
state.unset(['profile', 'age']); // it throws if profile.age is not a t.maybe(t.Number)

concat(path: Path, value: t.Array)

state.concat('tags', ['rock climber', 'SF reader']); // tags will be ['web developer', 'rock climber', 'SF reader']

push(path: Path, value: t.Any)

Same as concat(path, [value]).

splice(path: Path, ...args)

For each item in args call splice() on the target with the parameters provided by the item.

state.set('tags', ['web developer', 'rock climber', 'SF reader']);
state.splice('tags', [1, 1], [1, 1, 'bass player']); // tags will be ['web developer', 'bass player']

pop(path: Path)

state.pop('tags'); // tags will be []

shift(path: Path)

state.shift('tags'); // tags will be []

unshift(path: Path, value: t.Any)

state.unshift('tags', 'rock climber'); // tags will be ['rock climber', 'web developer']

merge(path: Path, value: t.Any)

state.merge(['other'], {b: 2}); // other will be {a: 1, b: 2}

License

The MIT License (MIT)