// Product-type (also called: pair, tuple) // A Product-type always has only two fields, called "left" and "right". // Product-types of more fields (called Structs) can be constructed by nesting Product-types. import { makeGeneric } from "../generics/generics.js"; import { GenericType, Type } from "../primitives/types.js"; import { typedFnType } from "./types.js"; import { prodType } from "./types.js"; // In JS, all products are encoded in the same way: export const constructorProduct = l => r => ({l, r}); export const getLeft = product => product.l; export const getRight = product => product.r; export const ModuleProduct = {l: [ // binary type constructor // Type -> Type -> Type ...typedFnType(prodType, fnType => fnType (Type) (fnType (Type) (Type) ) ), // a -> b -> (a, b) ...typedFnType(constructorProduct, fnType => makeGeneric((a, b) => fnType (a) (fnType (b) (prodType(a)(b)) ) ), GenericType), // (a, b) -> a ...typedFnType(getLeft, fnType => makeGeneric((a, b) => fnType (prodType(a)(b)) (a) ), GenericType), // (a, b) -> b ...typedFnType(getRight, fnType => makeGeneric((a, b) => fnType (prodType(a)(b)) (b) ), GenericType), ]};