import { Bool, Int } from "../primitives/symbols.js"; import { fnType, lsType } from "../type_registry.js"; import { assign, makeGeneric, matchConcrete, matchGeneric } from "./generics.js"; // a -> Int const a_to_Int = makeGeneric(a => fnType({in: a, out: Int})); // Bool -> Int const Bool_to_Int = fnType({in: lsType(Bool), out: Int}); // should be: Bool -> Int console.log(matchConcrete(a_to_Int, Bool_to_Int)); // (a -> a) -> b const fnType2 = makeGeneric((a,b) => fnType({in: fnType({in: a, out: a}), out: b})); // (Bool -> Bool) -> a const fnType3 = makeGeneric(a => fnType({in: fnType({in: Bool, out: Bool}), out: a})); // should be: (Bool -> Bool) -> a console.log(matchGeneric(fnType2, fnType3)); // (a -> b) -> [a] -> [b] const mapFnType = makeGeneric((a,b) => fnType({ in: fnType({in: a, out: b}), out: fnType({in: lsType(a), out: lsType(b)}), })); // a -> a const idFnType = makeGeneric(a => fnType({in: a, out: a})); // should be: [a] -> [a] console.log(assign(mapFnType, idFnType));