// [[file:../README.org::*Other sorts of specializers][Other sorts of specializers:3]] // [[[[file:~/git_repos/git.fiddlerwoaroof.com/js-generic-functions/README.org::imports][imports]]][imports]] import { defgeneric } from "./genfuns.js"; // imports ends here // [[[[file:~/git_repos/git.fiddlerwoaroof.com/js-generic-functions/README.org::specializer-import][specializer-import]]][specializer-import]] import { Shape, Eql } from "./genfuns.js"; // specializer-import ends here describe("defgeneric", () => { test("methods get called appropriately", () => { // [[[[file:~/git_repos/git.fiddlerwoaroof.com/js-generic-functions/README.org::basic-definition][basic-definition]]][basic-definition]] const example1generic = defgeneric("example1", "a", "b") .primary([Number, Object], (n, __) => [1, n]) .primary([Object, Number], (_, n) => [2, n]) .primary([Object, Object], (_, __) => [5, null]); // basic-definition ends here // [[[[file:~/git_repos/git.fiddlerwoaroof.com/js-generic-functions/README.org::call-the-function][call-the-function]]][call-the-function]] const example1 = example1generic.fn; expect(example1(5, {})).toEqual([1, 5]); expect(example1({}, 6)).toEqual([2, 6]); expect(example1("hello", {})).toEqual([5, null]); expect(example1({}, "world")).toEqual([5, null]); expect(example1({}, {})).toEqual([5, null]); // call-the-function ends here // [[[[file:~/git_repos/git.fiddlerwoaroof.com/js-generic-functions/README.org::add-methods][add-methods]]][add-methods]] example1generic .primary([String, Object], (s, __) => [3, s]) .primary([Object, String], (_, s) => [4, s]); expect(example1("hello", {})).toEqual([3, "hello"]); expect(example1({}, "world")).toEqual([4, "world"]); // add-methods ends here }); test ('specializers work as expected', () => { // [[[[file:~/git_repos/git.fiddlerwoaroof.com/js-generic-functions/README.org::specializer-examples][specializer-examples]]][specializer-examples]] const example2 = defgeneric("example2", "inp") .primary([Shape("a", "b")], inp => `a: ${inp.a} b: ${inp.b}`) .primary([Shape("a")], inp => `a: ${inp.a} b: `) .primary([Shape(["c", 1])], inp => `c: one`) .primary([Shape(["c", 2])], inp => `c: two`) .primary([Eql(1)], inp => "one").fn; expect(example2({ a: 3, q: "whatever" })).toEqual("a: 3 b: "); expect(example2({ a: 3, b: 4, q: "whatever" })).toEqual("a: 3 b: 4"); expect(example2({ c: 1, q: "whatever" })).toEqual("c: one"); expect(example2({ c: 2, q: "whatever" })).toEqual("c: two"); expect(example2(1)).toEqual("one"); // specializer-examples ends here }) }); // Other sorts of specializers:3 ends here