-
Notifications
You must be signed in to change notification settings - Fork 0
/
continuation.js
74 lines (72 loc) · 1.67 KB
/
continuation.js
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
var FiniteMapping = require("./finiteMapping").FiniteMapping;
function Environment(){
this.map = new FiniteMapping();
}
Environment.prototype.write = function(source, path, destination){
//curry the write to a finite mapping
//push the history (never forget unless asked)
var scurr;
if(!(scurr = this.map.read(source)))
this.map.write(source, scurr = new FiniteMapping());
var pcurr;
if(!(pcurr = scurr.read(path)))
scurr.write(path, pcurr = []);
var result;
if(pcurr.length)
result = pcurr[pcurr.length - 1];
pcurr.push(destination);
return result;
}
Environment.prototype.read = function(source, path){
return (
function(scurr){
if(!scurr) return;
if("read" in scurr)
return (
function(hist){
if(!hist) return;
if(hist.length)
return hist[hist.length - 1];
}
)(scurr.read(path))
}
)(this.map.read(source));
}
Environment.prototype.forgetHistory = function(source, path){
return (
function(scurr){
if(!scurr) return;
return scurr.write(path, []);
}
)(this.map.read(source));
}
Environment.prototype.getKeys = function(){
return this.map.getKeys();
}
Environment.prototype.getKeyKeys = function(source){
return this.map.read(source).getKeys();
}
function Continuation(fn, that, args){
this.fn = fn;
this.that = that;
this.args = args;
}
Continuation.prototype.thunk = function(environment){
var that = this.that;
var args = (
function map(f, xs){
var r = [];
for(var i = 0; i < xs.length; i++)
r[i] = f(xs[i]);
return r;
}
)(
function get(k){
return environment.read(that, k)
},
this.args
);
return this.fn.apply(that, args);
}
this.Continuation = Continuation;
this.Environment = Environment;