UNPKG

1.92 kBJavaScriptView Raw
1
2/* @flow weak */
3"use strict";
4
5/**
6 ### Show functions
7*/
8
9var utils = require("./utils.js");
10
11/**
12 - `show.def(x : a): string`
13
14 Currently implemented as `JSON.stringify`.
15*/
16function showDef(obj) {
17 return JSON.stringify(obj);
18}
19
20/**
21 - `show.pair(showA: a -> string, showB: b -> string, x: (a, b)): string`
22*/
23function showPair(showA, showB) {
24 var result = function (p) {
25 return "(" + showA(p[0]) + ", " + showB(p[1]) + ")";
26 };
27
28 return utils.curried3(result, arguments);
29}
30
31/**
32 - `show.either(showA: a -> string, showB: b -> string, e: either a b): string`
33*/
34function showEither(showA, showB) {
35 function showLeft(value) {
36 return "Left(" + showA(value) + ")";
37 }
38
39 function showRight(value) {
40 return "Right(" + showB(value) + ")";
41 }
42
43 var result = function (e) {
44 return e.either(showLeft, showRight);
45 };
46
47 return utils.curried3(result, arguments);
48}
49
50/**
51 - `show.tuple(shrinks: (a -> string, b -> string...), x: (a, b...)): string`
52*/
53function showTuple(shows) {
54 var result = function (objs) {
55 var strs = [];
56 for (var i = 0; i < shows.length; i++) {
57 strs.push(shows[i](objs[i]));
58 }
59 return strs.join("; ");
60 };
61
62 return utils.curried2(result, arguments);
63}
64
65/**
66 - `show.sum(shrinks: (a -> string, b -> string...), x: (a | b ...)): string`
67*/
68function showSum(shows) {
69 var result = function (sum) {
70 return sum.fold(function (idx, n, value) {
71 return "Sum(" + idx + "/" + n + ": " + shows[idx](value) + ")";
72 });
73 };
74
75 return utils.curried2(result, arguments);
76}
77
78/**
79 - `show.array(shrink: a -> string, x: array a): string`
80*/
81function showArray(show) {
82 var result = function (arr) {
83 return "[" + arr.map(show).join(", ") + "]";
84 };
85
86 return utils.curried2(result, arguments);
87}
88
89module.exports = {
90 def: showDef,
91 pair: showPair,
92 either: showEither,
93 tuple: showTuple,
94 sum: showSum,
95 array: showArray,
96};