-
Notifications
You must be signed in to change notification settings - Fork 0
/
moduleFunctions.jsi
82 lines (69 loc) · 1.93 KB
/
moduleFunctions.jsi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
{
function isNumber(x) {
return typeof(x) == "number";
}
function isString(x) {
return typeof(x) == "string";
}
function isBool(x) { // perhaps overly strict, but great for testing
return x === true || x === false;
}
function any(x) { return true; }
function isArray(x) { return x instanceof Array; }
var customArrayOf = function(name) {
return function(eltContract) {
return {
server: function(s) {
return function(val) {
if (val instanceof Array) {
return contracts.map(eltContract.server(s),val);
}
else {
contracts.blame("customArrayOf violated by " + s);
}
};
},
client: function(s) {
return function(val) {
if (val instanceof Array) {
return contracts.map(eltContract.client(s),val);
}
else {
return val;
}
};
}
};
};
};
}
// Prefix a colon to build a flat contract, where the expression on the right
// of the colon is a JavaScript predicate
num = :isNumber;
coords = { x : num,
y : num,
moveRight : -> coords
};
thunk :: -> num;
add1 :: num -> num;
sub1Broken :: num -> num;
add :: num num -> num;
div :: num :function(x) { return x != 0; } -> num;
makeCoords :: num num -> coords;
filter :: (:any -> :isBool) :isArray -> :isArray;
curry :: (:isNumber num -> num) num -> num -> num;
mkPair :: num num -> [ num, num ];
iota :: num -> customArrayOf(num);
sum :: num ... -> num;
reduceNumbers :: num (num num -> num) [ num, ... ] -> num;
// TODO: constructor contract!
instance Coords {
x : num,
y : num
};
// Coords :: num num -> any;
// the arg must be an instanceof coords, but the result is not
moveCoords :: Coords -> { x : num, y : num };
bob = num -> { val : num, next: job };
job = num -> { val : num, next: bob };
forever :: bob;