import { makeGeneric } from "../generics/generics.js"; import { Type } from "../type.js"; import { typedFnType } from "./types.js"; import { prodType } from "./types.js"; // In JS, all products are encoded in the same way: const constructor = left => right => ({left, right}); const getLeft = product => product.left; const getRight = product => product.right; export const ModuleProduct = {l: [ // binary type constructor // Type -> Type -> Type ...typedFnType(prodType, fnType => fnType (Type) (fnType (Type) (Type) ) ), // a -> b -> (a, b) ...typedFnType(constructor, fnType => makeGeneric((a, b) => fnType (a) (fnType (b) (prodType(a)(b)) ) )), // (a, b) -> a ...typedFnType(getLeft, fnType => makeGeneric((a, b) => fnType (prodType(a)(b)) (a) )), // (a, b) -> b ...typedFnType(getRight, fnType => makeGeneric((a, b) => fnType (prodType(a)(b)) (b) )), ]};