ts-union
Version:
ADT (sum type) in typescript inspired by ML language family
248 lines • 26.3 kB
JavaScript
// tslint:disable:no-expression-statement
// tslint:disable-next-line:no-implicit-dependencies
import { of, Union } from './index';
import test from 'ava';
// tslint:disable-next-line:no-object-literal-type-assertion
const U = Union({
Simple: of(),
SuperSimple: of(null),
One: of(),
Const: of(3),
Two: of(),
Three: of(),
});
const { SuperSimple, Simple, One, Two, Three, Const } = U;
test('unpacks simple', t => {
const s = Simple();
const c = Const();
t.is(U.if.Simple(s, () => 4), 4);
t.is(U.if.Simple(c, () => 4), undefined);
t.is(U.if.Simple(c, () => 4, () => 1), 1);
});
test('unpacks const', t => {
const si = Simple();
const c = Const();
t.is(U.if.Const(c, n => n), 3);
t.is(U.if.Const(si, n => n, () => 1), 1);
t.is(U.if.Const(si, n => n), undefined);
});
test('else case accepts the original object', t => {
const simple = Simple();
t.is(U.if.Const(simple, _ => Simple(), v => v), simple);
});
test('unpacks one arg', t => {
const one = One('one');
const c = Const();
t.is(U.if.One(one, s => s), 'one');
t.is(U.if.One(c, s => s, _ => 'els'), 'els');
t.is(U.if.One(c, s => s), undefined);
});
test('unpacks two args', t => {
const f = (s, n) => s + n.toString();
const two = Two('two', 1);
const c = Const();
t.is(U.if.Two(two, f), 'two1');
t.is(U.if.Two(c, f, () => 'els'), 'els');
t.is(U.if.Two(c, f), undefined);
});
test('unpacks three args', t => {
const f = (s, n, b) => s + n.toString() + (b ? 'true' : 'false');
const three = Three('three', 1, true);
const c = Const();
t.is(U.if.Three(three, f), 'three1true');
t.is(U.if.Three(c, f, () => 'els'), 'els');
t.is(U.if.Three(c, f), undefined);
});
const throwErr = () => {
throw new Error('shouldnt happen');
};
test('switch simple case', t => {
t.is(U.match(Simple(), {
Simple: () => 'simple',
default: throwErr,
}), 'simple');
});
test('switch const case', t => {
t.is(U.match(Const(), {
Const: n => n,
default: throwErr,
}), 3);
});
test('switch one case', t => {
t.is(U.match(One('one'), {
One: s => s,
default: throwErr,
}), 'one');
});
test('switch two case', t => {
t.is(U.match(Two('two', 2), {
Two: (s, n) => s + n.toString(),
default: throwErr,
}), 'two2');
});
test('switch three case', t => {
t.is(U.match(Three('three', 1, true), {
Three: (s, n, b) => s + n.toString() + (b ? 'true' : 'false'),
default: throwErr,
}), 'three1true');
});
test('switch deferred eval', t => {
const evalFunc = U.match({
Simple: () => 'simple',
SuperSimple: () => 'super simple',
Const: n => n.toString(),
One: s => s,
Three: (s, n, b) => s + n.toString() + (b ? 'true' : 'false'),
Two: (s, n) => s + n.toString(),
});
t.is(evalFunc(Simple()), 'simple');
t.is(evalFunc(SuperSimple), 'super simple');
t.is(evalFunc(Const()), '3');
t.is(evalFunc(One('one')), 'one');
t.is(evalFunc(Two('two', 2)), 'two2');
t.is(evalFunc(Three('three', 3, true)), 'three3true');
});
test('switch default case', t => {
const three = Three('three', 3, true);
const two = Two('two', 2);
const one = One('one');
const si = Simple();
const co = Const();
const val = 'def';
const justDef = U.match({ default: _ => val });
t.is(justDef(si), val);
t.is(justDef(co), val);
t.is(justDef(one), val);
t.is(justDef(two), val);
t.is(justDef(three), val);
t.is(U.match(si, { default: _ => val }), val);
t.is(U.match(co, { default: _ => val }), val);
t.is(U.match(one, { default: _ => val }), val);
t.is(U.match(two, { default: _ => val }), val);
t.is(U.match(three, { default: _ => val }), val);
});
const Maybe = Union(a => ({
Nothing: of(null),
Just: of(a),
}));
const { Nothing, Just } = Maybe;
test('generic match', t => {
const shouldBeTwo = Maybe.match(Just(1), {
Just: n => n + 1,
default: throwErr,
});
t.is(shouldBeTwo, 2);
const numToStr = Maybe.match({
Just: (n) => n.toString(),
Nothing: () => 'nothing',
});
t.is(numToStr(Just(1)), '1');
t.is(numToStr(Nothing()), 'nothing');
const strLen = Maybe.match({
Just: s => s.length,
Nothing: () => -1,
});
t.is(strLen(Just('a')), 1);
t.is(strLen(Nothing()), -1);
});
test('generic if', t => {
const one = Just(1);
const nothing = Nothing();
t.is(Maybe.if.Just(one, n => n + 1), 2);
t.is(Maybe.if.Just(nothing, n => n), undefined);
t.is(Maybe.if.Nothing(nothing, () => 1), 1);
});
test('if can write a generic func like map or bind', t => {
const map = (val, f) => Maybe.if.Just(val, v => Just(f(v)), n => n);
const maybeOne = map(Just('a'), s => s.length);
t.is(Maybe.if.Just(maybeOne, n => n + 1), 2);
const bind = (val, f) => Maybe.if.Just(val, a => f(a), _ => Nothing());
t.is(Maybe.if.Just(bind(Just(1), n => Just(n.toString())), s => s), '1');
});
// Used for Readme.md example
// const ReqResult = Union(TPayload => ({
// Pending: of<void>(),
// Ok: TPayload,
// Err: of<string | Error>()
// }));
// const res = ReqResult.Ok('this is awesome!');
// const toStr = ReqResult.match(res, {
// Pending: () => 'Thinking...',
// Err: err =>
// typeof err === 'string' ? `Oops ${err}` : `Exception ${err.message}`,
// Ok: str => `Ok, ${str}`
// });
test('we can have boolean and union values for cases', t => {
// related to https://github.com/Microsoft/TypeScript/issues/7294
const T = Union({
Bool: of(),
StrOrNum: of(),
Enum: of(),
Void: of(null),
});
const toStr = T.match({
Void: () => 'void',
Bool: b => (b === true ? 'true' : b === false ? 'false' : throwErr()),
Enum: s => s,
StrOrNum: sn => (typeof sn === 'number' ? sn.toString() : sn),
});
t.is(toStr(T.Void), 'void');
t.is(toStr(T.Bool(true)), 'true');
t.is(toStr(T.Enum('yes')), 'yes');
t.is(toStr(T.StrOrNum(1)), '1');
t.is(toStr(T.StrOrNum('F* yeah!')), 'F* yeah!');
t.is(T.if.Void(T.Void, () => 'void'), 'void');
const G = Union(a => ({
Val: of(a),
Nope: of(),
}));
const valOr = (val, def) => G.if.Val(val, v => v, () => def);
const strOrNumVal = 'v';
t.is(valOr(G.Val(strOrNumVal), 4), 'v');
t.is(valOr(G.Val(1), -1), 1);
t.is(valOr(G.Val(1), -1), 1);
t.is(valOr(G.Nope('nope'), -1), -1);
t.is(valOr(G.Nope(100500), -1), -1);
});
test('shorthand for declaring cases momoizes the value in generics', t => {
const G = Union(a => ({
Val: of(a),
Nope: of(null),
Void: of(),
}));
// not the same reference
t.not(G.Val(1), G.Val(1));
t.not(G.Void(), G.Void());
// but 'of(null)' memoizes it
t.is(G.Nope(), G.Nope());
});
test('it can correctly create matchWith function', t => {
const State = Union({
Loading: of(null),
Loaded: of(),
Err: of(),
});
const Ev = Union({
ErrorHappened: of(),
DataFetched: of(),
});
const { Loaded, Err, Loading } = State;
const transition = State.matchWith(Ev, {
Loading: {
ErrorHappened: (_, err) => Err(err),
DataFetched: (_, data) => Loaded(data),
},
Loaded: {
DataFetched: (loaded, data) => Loaded(loaded + data),
},
default: (prevState, _ev) => prevState,
});
const { ErrorHappened, DataFetched } = Ev;
// declared cases
t.deepEqual(transition(Loading, ErrorHappened('oops')), Err('oops'));
t.deepEqual(transition(Loading, DataFetched(1)), Loaded(1));
t.deepEqual(transition(Loaded(1), DataFetched(1)), Loaded(2));
// fallback to default
t.deepEqual(transition(Loaded(1), ErrorHappened('oops')), Loaded(1));
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbmRleC50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlDQUF5QztBQUN6QyxvREFBb0Q7QUFDcEQsT0FBTyxFQUFrQixFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRXBELE9BQU8sSUFBSSxNQUFNLEtBQUssQ0FBQztBQUV2Qiw0REFBNEQ7QUFDNUQsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ2QsTUFBTSxFQUFFLEVBQUUsRUFBUTtJQUNsQixXQUFXLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQztJQUNyQixHQUFHLEVBQUUsRUFBRSxFQUFVO0lBQ2pCLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ1osR0FBRyxFQUFFLEVBQUUsRUFBa0I7SUFDekIsS0FBSyxFQUFFLEVBQUUsRUFBMkI7Q0FDckMsQ0FBQyxDQUFDO0FBRUgsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBRTFELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsRUFBRTtJQUN6QixNQUFNLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQztJQUNuQixNQUFNLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQztJQUVsQixDQUFDLENBQUMsRUFBRSxDQUNGLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFDdkIsQ0FBQyxDQUNGLENBQUM7SUFFRixDQUFDLENBQUMsRUFBRSxDQUNGLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFDdkIsU0FBUyxDQUNWLENBQUM7SUFFRixDQUFDLENBQUMs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Q0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDdkIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDdkIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDeEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDeEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFFMUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDOUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDOUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDL0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDL0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxD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