import { typedFnType } from "./function.js"; import { Type } from "../metacircular.js"; import { Int } from "../primitives/symbols.js"; import { DefaultMap } from "../util.js"; import { makeGeneric } from "../generics/generics.js"; const symbolList = Symbol('List'); const listTypeRegistry = new DefaultMap(elementType => ({ symbol: symbolList, params: [elementType], })); // type constructor export const lsType = elementType => listTypeRegistry.getdefault(elementType, true); // 'normal' implementation const emptyList = {l:[]}; const get = ls => i => ls.l[i]; const put = ls => i => elem => ({l: ls.l.with(Number(i), elem)}); // const push = ls => elem => ({l:ls.l.concat([elem])}); export const ModuleList = {l:[ // Type -> Type ...typedFnType(lsType, fnType => fnType /* in */ (Type) /* out */ (Type) ), // [a] {i: emptyList, t: makeGeneric(a => lsType(a))}, // [a] -> Int -> a ...typedFnType(get, fnType => makeGeneric(a => fnType /* in */ (lsType(a)) /* out */ (fnType /* in */ (Int) /* out */ (a) ))), // [a] -> Int -> a -> [a] ...typedFnType(put, fnType => makeGeneric(a => fnType /* in */ (lsType(a)) /* out */ (fnType /* in */ (Int) /* out */ (fnType /* in */ (a) /* out */ (lsType(a)) ) ))), ]};