import assert from "node:assert"; import { assignFn, unify, UnifyError } from "../lib/generics/generics.js"; import { getDefaultTypeParser } from "../lib/parser/type_parser.js"; import { prettyT } from "../lib/util/pretty.js"; const mkType = getDefaultTypeParser(); // It would be better to compare the types directly with 'compareTypes', but the assert-module does not allow passing a custom comparison function. assert.equal( // actual prettyT( unify( mkType("(a -> Int)"), mkType("[Bool] -> Int"), ) ), // expected "([Bool] -> Int)", ); assert.equal( // actual prettyT( unify( mkType("(a -> a) -> b"), mkType("(Bool -> Bool) -> a"), ) ), // expected "((Bool -> Bool) -> a)", ); assert.equal( // actual prettyT( assignFn( mkType("(a -> b) -> [a] -> [b]"), mkType("a -> a") ) ), // expected "([a] -> [a])", ); assert.equal( // actual prettyT( assignFn( mkType("(a -> Int) -> [a] -> a"), mkType("a -> a") ) ), // expected "([Int] -> Int)", ); assert.throws( () => { unify( mkType("Int"), mkType("Bool") ) }, // expected error UnifyError, ); assert.throws( () => { unify( mkType("((a -> (a -> Ordering)) -> {a})"), mkType("([a] -> a)"), ) }, UnifyError, );