on c19b2a8 help sign in
bridge/src/nockjs/serial.js
167 lines 3.4 kB history raw
1var noun = require('./noun.js'),
2 list = require('./list.js'),
3 Cell = noun.Cell,
4 bits = require('./bits.js'),
5 zero = noun.Atom.yes,
6 one = noun.Atom.no,
7 i = noun.Atom.fromInt,
8 two = i(2),
9 three = i(3),
10 NounMap = require('./hamt.js').NounMap;
12function rub(a, b) {
13 var c, d, e, w, x, y, z, p, q, m;
15 m = bits.add(a, i(bits.met(0, b)));
16 x = a;
18 while ( zero.equals(bits.cut(zero, x, one, b)) ) {
19 y = bits.add(one, x);
21 // Sanity check: crash if decoding more bits than available
22 if ( bits.gth(x, m) ) {
23 throw new Error("Bail");
24 }
26 x = y;
27 }
29 if ( a.equals(x) ) {
30 return new Cell(one, zero);
31 }
33 c = bits.sub(x, a);
34 d = bits.add(x, one);
36 x = bits.dec(c);
37 y = bits.bex(x);
38 z = bits.cut(zero, d, x, b);
40 e = bits.add(y, z);
41 w = bits.add(c, c);
42 y = bits.add(w, e);
43 z = bits.add(d, x);
45 p = bits.add(w, e);
46 q = bits.cut(zero, z, e, b);
48 return new Cell(p, q);
51function cue_in(m, a, b) {
52 var c,l,u,v,w,y,p,q,d,x;
54 if ( zero.equals(bits.cut(zero, b, one, a)) ) {
55 x = bits.add(b, one);
56 c = rub(x, a);
57 p = bits.add(c.head, one);
58 q = c.tail;
59 m.insert(b, q);
60 }
61 else {
62 c = bits.add(two, b);
63 l = bits.add(one, b);
65 if ( zero.equals(bits.cut(zero, l, one, a)) ) {
66 u = cue_in(m, a, c);
67 x = bits.add(u.head, c);
68 v = cue_in(m, a, x);
69 w = new Cell(u.tail.head, v.tail.head);
70 y = bits.add(u.head, v.head);
71 p = bits.add(two, y);
72 q = w;
73 m.insert(b, q);
74 }
75 else {
76 d = rub(c, a);
77 x = m.get(d.tail);
79 if ( undefined === x ) {
80 throw new Error("Bail");
81 }
83 p = bits.add(two, d.head);
84 q = x;
85 }
86 }
87 return new Cell(p, new Cell(q, zero));
90function cue(a) {
91 return cue_in(new NounMap(), a, zero).tail.head;
94function mat(a) {
95 if ( zero.equals(a) ) {
96 return noun.dwim(1, 1);
97 }
98 else {
99 var b = noun.dwim(bits.met(0, a)),
100 c = noun.dwim(bits.met(0, b)),
101 u = bits.dec(c),
102 v = bits.add(c, c),
103 x = bits.end(zero, u, b),
104 w = bits.bex(c),
105 y = bits.lsh(zero, u, a),
106 z = bits.mix(x, y),
107 p = bits.add(v, b),
108 q = bits.cat(zero, w, z);
109 return noun.dwim(p, q);
110 }
113function _jam_in_pair(m, h_a, t_a, b, l) {
114 var w = noun.dwim([2, 1], l),
115 x = bits.add(two, b),
116 d = _jam_in(m, h_a, x, w),
117 y = bits.add(x, d.head),
118 e = _jam_in(m, t_a, y, d.tail.head),
119 z = bits.add(d.head, e.head);
121 return noun.dwim(bits.add(two, z), e.tail.head, zero);
124function _jam_in_ptr(m, u_c, l) {
125 var d = mat(u_c),
126 x = bits.lsh(zero, two, d.tail),
127 y = bits.add(two, d.head);
129 return noun.dwim(y, [[y, bits.mix(three, x)], l], zero);
132function _jam_in_flat(m, a, l) {
133 var d = mat(a),
134 x = bits.add(one, d.head);
136 return noun.dwim(x, [[x, bits.lsh(zero, one, d.tail)], l], zero);
139function _jam_in(m, a, b, l) {
140 var c = m.get(a);
142 if ( undefined === c ) {
143 m.insert(a, b);
144 return a.deep ?
145 _jam_in_pair(m, a.head, a.tail, b, l) :
146 _jam_in_flat(m, a, l);
147 }
148 else if ( !a.deep && bits.met(0, a) <= bits.met(0, c) ) {
149 return _jam_in_flat(m, a, l);
150 }
151 else {
152 return _jam_in_ptr(m, c, l);
153 }
156function jam(n) {
157 var x = _jam_in(new NounMap(), n, zero, zero),
158 q = list.flop(x.tail.head);
160 return bits.can(zero, q);
163module.exports = {
164 cue: cue,
165 mat: mat,
166 jam: jam
167};