Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
it ('should resolve built-in types', () => {
const {types} = resolve ($) ([]) ($.env) ('foo :: Number -> String');
assert.deepEqual (types, [$.Number, $.String]);
});
test ('PairType', () => {
eq (typeof S.PairType) ('function');
eq (S.PairType.length) (1);
eq (S.show (S.PairType)) ('Pair :: Type -> Type -> Type');
eq (S.is (S.PairType ($.String) ($.Number)) (S.Pair ('hi') (0.25))) (true);
eq (S.is (S.PairType ($.String) ($.Number)) (S.Pair ('hi') ('hi'))) (false);
eq (S.is (S.PairType ($.String) ($.Number)) (S.Pair (0.25) (0.25))) (false);
eq (S.is (S.PairType ($.String) ($.Number)) (S.Pair (null) (null))) (false);
eq (S.is (S.PairType ($.String) ($.Number)) (null)) (false);
});
test ('PairType', () => {
eq (typeof S.PairType) ('function');
eq (S.PairType.length) (1);
eq (S.show (S.PairType)) ('Pair :: Type -> Type -> Type');
eq (S.is (S.PairType ($.String) ($.Number)) (S.Pair ('hi') (0.25))) (true);
eq (S.is (S.PairType ($.String) ($.Number)) (S.Pair ('hi') ('hi'))) (false);
eq (S.is (S.PairType ($.String) ($.Number)) (S.Pair (0.25) (0.25))) (false);
eq (S.is (S.PairType ($.String) ($.Number)) (S.Pair (null) (null))) (false);
eq (S.is (S.PairType ($.String) ($.Number)) (null)) (false);
});
test ('EitherType', () => {
eq (typeof S.EitherType) ('function');
eq (S.EitherType.length) (1);
eq (S.show (S.EitherType)) ('Either :: Type -> Type -> Type');
eq (S.is (S.EitherType ($.String) ($.Number)) (S.Left ('Error'))) (true);
eq (S.is (S.EitherType ($.String) ($.Number)) (S.Right (42))) (true);
eq (S.is (S.EitherType ($.String) ($.Number)) (S.Right ('42'))) (false);
eq (S.is (S.EitherType ($.String) ($.Number)) (S.Just (42))) (false);
eq (S.is (S.EitherType ($.String) ($.Number)) (null)) (false);
});
test ('get', () => {
eq (S.show (S.get)) ('get :: (Any -> Boolean) -> String -> a -> Maybe b');
eq (S.get (S.is ($.Number)) ('x') ({x: 0, y: 42})) (S.Just (0));
eq (S.get (S.is ($.Number)) ('y') ({x: 0, y: 42})) (S.Just (42));
eq (S.get (S.is ($.Number)) ('z') ({x: 0, y: 42})) (S.Nothing);
eq (S.get (S.is ($.String)) ('z') ({x: 0, y: 42})) (S.Nothing);
eq (S.get (S.is ($.String)) ('x') ({x: 0, y: 42})) (S.Nothing);
eq (S.get (S.is ($.RegExp)) ('x') ({x: vm.runInNewContext ('/.*/')})) (S.Just (/.*/));
eq (S.get (S.K (true)) ('valueOf') (null)) (S.Nothing);
eq (S.get (S.K (true)) ('valueOf') (undefined)) (S.Nothing);
eq (S.get (S.is ($.Array ($.Number))) ('x') ({x: [1, 2]})) (S.Just ([1, 2]));
eq (S.get (S.is ($.Array ($.Number))) ('x') ({x: [1, 2, null]})) (S.Nothing);
});
test ('EitherType', () => {
eq (typeof S.EitherType) ('function');
eq (S.EitherType.length) (1);
eq (S.show (S.EitherType)) ('Either :: Type -> Type -> Type');
eq (S.is (S.EitherType ($.String) ($.Number)) (S.Left ('Error'))) (true);
eq (S.is (S.EitherType ($.String) ($.Number)) (S.Right (42))) (true);
eq (S.is (S.EitherType ($.String) ($.Number)) (S.Right ('42'))) (false);
eq (S.is (S.EitherType ($.String) ($.Number)) (S.Just (42))) (false);
eq (S.is (S.EitherType ($.String) ($.Number)) (null)) (false);
});
eq (S.is ($.Boolean) (new Boolean (true))) (false);
eq (S.is ($.Boolean) (new Boolean (false))) (false);
eq (S.is ($.Array ($.Integer)) (null)) (false);
eq (S.is ($.Array ($.Integer)) (undefined)) (false);
eq (S.is ($.Array ($.Integer)) (['1', '2', '3'])) (false);
eq (S.is ($.Array ($.Integer)) ([1, 2, 3.14])) (false);
eq (S.is ($.Array ($.Integer)) ([1, 2, 3])) (true);
eq (S.is ($.Array ($.Integer)) ([])) (true);
eq (S.is ($.Maybe ($.Integer)) (S.Nothing)) (true);
eq (S.is ($.Maybe ($.Integer)) (S.Just (0))) (true);
eq (S.is ($.Maybe ($.Integer)) (S.Left (0))) (false);
eq (S.is ($.Maybe ($.Integer)) (S.Right (0))) (false);
eq (S.is ($.Either ($.String) ($.Integer)) (S.Nothing)) (false);
eq (S.is ($.Either ($.String) ($.Integer)) (S.Just (0))) (false);
eq (S.is ($.Either ($.String) ($.Integer)) (S.Left (0))) (false);
eq (S.is ($.Either ($.String) ($.Integer)) (S.Right (''))) (false);
eq (S.is ($.Either ($.String) ($.Integer)) (S.Left (''))) (true);
eq (S.is ($.Either ($.String) ($.Integer)) (S.Right (0))) (true);
const a = $.TypeVariable ('a');
eq (S.is ($.Array (a)) ([])) (true);
eq (S.is ($.Array (a)) ([1, 2, 3])) (true);
eq (S.is ($.Array (a)) (['foo', 'bar', 'baz'])) (true);
eq (S.is ($.Array (a)) (['foo', true, 42])) (false);
eq (S.is ($.Array (a)) ([Sum (1), Sum (2), Sum (3)])) (false);
eq ((S.create ({checkTypes: true, env: []})).is ($.Array (a)) ([])) (false);
eq ((S.create ({checkTypes: true, env: [$.String]})).is ($.Array (a)) ([])) (true);
test ('get', () => {
eq (S.show (S.get)) ('get :: (Any -> Boolean) -> String -> a -> Maybe b');
eq (S.get (S.is ($.Number)) ('x') ({x: 0, y: 42})) (S.Just (0));
eq (S.get (S.is ($.Number)) ('y') ({x: 0, y: 42})) (S.Just (42));
eq (S.get (S.is ($.Number)) ('z') ({x: 0, y: 42})) (S.Nothing);
eq (S.get (S.is ($.String)) ('z') ({x: 0, y: 42})) (S.Nothing);
eq (S.get (S.is ($.String)) ('x') ({x: 0, y: 42})) (S.Nothing);
eq (S.get (S.is ($.RegExp)) ('x') ({x: vm.runInNewContext ('/.*/')})) (S.Just (/.*/));
eq (S.get (S.K (true)) ('valueOf') (null)) (S.Nothing);
eq (S.get (S.K (true)) ('valueOf') (undefined)) (S.Nothing);
eq (S.get (S.is ($.Array ($.Number))) ('x') ({x: [1, 2]})) (S.Just ([1, 2]));
eq (S.get (S.is ($.Array ($.Number))) ('x') ({x: [1, 2, null]})) (S.Nothing);
});
eq (S.is ($.Boolean) (new Boolean (false))) (false);
eq (S.is ($.Array ($.Integer)) (null)) (false);
eq (S.is ($.Array ($.Integer)) (undefined)) (false);
eq (S.is ($.Array ($.Integer)) (['1', '2', '3'])) (false);
eq (S.is ($.Array ($.Integer)) ([1, 2, 3.14])) (false);
eq (S.is ($.Array ($.Integer)) ([1, 2, 3])) (true);
eq (S.is ($.Array ($.Integer)) ([])) (true);
eq (S.is ($.Maybe ($.Integer)) (S.Nothing)) (true);
eq (S.is ($.Maybe ($.Integer)) (S.Just (0))) (true);
eq (S.is ($.Maybe ($.Integer)) (S.Left (0))) (false);
eq (S.is ($.Maybe ($.Integer)) (S.Right (0))) (false);
eq (S.is ($.Either ($.String) ($.Integer)) (S.Nothing)) (false);
eq (S.is ($.Either ($.String) ($.Integer)) (S.Just (0))) (false);
eq (S.is ($.Either ($.String) ($.Integer)) (S.Left (0))) (false);
eq (S.is ($.Either ($.String) ($.Integer)) (S.Right (''))) (false);
eq (S.is ($.Either ($.String) ($.Integer)) (S.Left (''))) (true);
eq (S.is ($.Either ($.String) ($.Integer)) (S.Right (0))) (true);
const a = $.TypeVariable ('a');
eq (S.is ($.Array (a)) ([])) (true);
eq (S.is ($.Array (a)) ([1, 2, 3])) (true);
eq (S.is ($.Array (a)) (['foo', 'bar', 'baz'])) (true);
eq (S.is ($.Array (a)) (['foo', true, 42])) (false);
eq (S.is ($.Array (a)) ([Sum (1), Sum (2), Sum (3)])) (false);
eq ((S.create ({checkTypes: true, env: []})).is ($.Array (a)) ([])) (false);
eq ((S.create ({checkTypes: true, env: [$.String]})).is ($.Array (a)) ([])) (true);
eq ((S.create ({checkTypes: true, env: [$.String]})).is ($.Array (a)) ([1, 2, 3])) (false);
const def = $priv.create ({checkTypes: true, env: $priv.env});
const Parameters = $priv.RecordType ({
$: $priv.Object,
checkTypes: $priv.Boolean,
env: $priv.Array ($priv.Type),
typeClasses: $priv.Array ($priv.TypeClass),
});
export const create = def
('create')
({})
([
Parameters,
$priv.String,
$priv.AnyFunction,
$priv.AnyFunction,
])
(({$, checkTypes, env, typeClasses}) => {
const $def = $.create ({checkTypes, env});
const resovleSig = Sig.resolve ($) (typeClasses) (env);
return $def
('def')
({})
([$.String, $.AnyFunction])
(signature => func => {
const params = resovleSig (signature);
return $def
(params.name)
(params.constraints)