diff --git a/scripts/int_or_bool.js b/scripts/int_or_bool.js new file mode 100644 index 0000000..5d6ff67 --- /dev/null +++ b/scripts/int_or_bool.js @@ -0,0 +1,60 @@ +import { assign, makeGeneric, unify } from "../generics/generics.js"; +import { Bool, Int } from "../primitives/types.js"; +import { constructorLeft, constructorRight, match } from "../structures/sum.js"; +import { fnType, sumType } from "../structures/types.js"; +import { pretty } from "../util.js"; + +const IntOrBool = sumType(Int)(Bool); + + +// console.log(int5); + +console.log(pretty(unify( + makeGeneric(() => IntOrBool), + makeGeneric(a => sumType(Int)(a)), +))); + +const cipFunction = (x) => { + return match(x)({ + left: x_as_int => (x_as_int === 5), + right: x_as_bool => false, + }); +} + +const cipFunctionType = fnType + (IntOrBool) // in + (Bool); + +// console.log(cipFunctionType); +// console.log(IntOrBool); + +console.log(assign( + makeGeneric(() => cipFunctionType), + makeGeneric(() => IntOrBool), +)); + +console.log("calling constructorLeft with Int:"); +const typeAtCallSite = assign( + makeGeneric((a, b) => + fnType + (a) + (sumType(a)(b)) + ), + makeGeneric(() => Int)); +console.log(pretty(typeAtCallSite)); + + +console.log("calling cipFunction:"); +console.log(pretty(assign( + makeGeneric(() => cipFunctionType), + typeAtCallSite, +))); + +console.log("valid function calls:"); +console.log(cipFunction(constructorLeft(5))); +console.log(cipFunction(constructorLeft(7))); +console.log(cipFunction(constructorRight(true))); + +console.log("invalid function calls:"); +console.log(cipFunction(5)); +console.log(cipFunction(constructorLeft("abc"))); diff --git a/main.js b/scripts/main.js similarity index 96% rename from main.js rename to scripts/main.js index 0a3ef9c..37988f6 100644 --- a/main.js +++ b/scripts/main.js @@ -1,10 +1,10 @@ import { select } from '@inquirer/prompts'; -import { ModulePoint } from "./lib/point.js"; -import { DefaultMap, pretty, prettyT } from './util.js'; -import { symbolFunction } from './structures/types.js'; -import { ModuleStd } from './stdlib.js'; -import { Type } from "./primitives/types.js"; -import { assign, makeGeneric, unify } from './generics/generics.js'; +import { ModulePoint } from "../lib/point.js"; +import { DefaultMap, pretty, prettyT } from '../util.js'; +import { symbolFunction } from '../structures/types.js'; +import { ModuleStd } from '../stdlib.js'; +import { Type } from "../primitives/types.js"; +import { assign, makeGeneric, unify } from '../generics/generics.js'; class Context { constructor(mod) {