@@ -40,7 +40,7 @@ module Prelude where
4040 show true = "true"
4141 show false = "false"
4242
43− foreign import showNumber "function numberToString(n) {\
43+ foreign import showNumber "function showNumber(n) {\
4444 \ return n.toString();\
4545 \}" :: Number -> String
4646
@@ -61,6 +61,13 @@ module Prelude where
6161 ret :: forall a. a -> m a
6262 (>>=) :: forall a b. m a -> (a -> m b) -> m b
6363
64+ infixl 5 *
65+ infixl 5 /
66+ infixl 5 %
67+
68+ infixl 7 -
69+ infixl 7 +
70+
6471 class Num a where
6572 (+) :: a -> a -> a
6673 (-) :: a -> a -> a
@@ -69,25 +76,50 @@ module Prelude where
6976 (%) :: a -> a -> a
7077 negate :: a -> a
7178
72− foreign import addNumber "" :: Number -> Number -> Number
79+ foreign import numAdd "function numAdd(n1) {\
80+ \ return function(n2) {\
81+ \ return n1 + n2;\
82+ \ };\
83+ \}" :: Number -> Number -> Number
7384
74− foreign import subNumber "" :: Number -> Number -> Number
85+ foreign import numSub "function numSub(n1) {\
86+ \ return function(n2) {\
87+ \ return n1 - n2;\
88+ \ };\
89+ \}" :: Number -> Number -> Number
7590
76− foreign import mulNumber "" :: Number -> Number -> Number
91+ foreign import numMul "function numMul(n1) {\
92+ \ return function(n2) {\
93+ \ return n1 * n2;\
94+ \ };\
95+ \}" :: Number -> Number -> Number
96+
97+ foreign import numDiv "function numDiv(n1) {\
98+ \ return function(n2) {\
99+ \ return n1 / n2;\
100+ \ };\
101+ \}" :: Number -> Number -> Number
77102
78− foreign import divNumber "" :: Number -> Number -> Number
103+ foreign import numMod "function numMod(n1) {\
104+ \ return function(n2) {\
105+ \ return n1 % n2;\
106+ \ };\
107+ \}" :: Number -> Number -> Number
79108
80− foreign import modNumber "" :: Number -> Number -> Number
81−
82− foreign import negateNumber "" :: Number -> Number
109+ foreign import numNegate "function numNegate(n) {\
110+ \ return -n;\
111+ \}" :: Number -> Number
83112
84113 instance Num Number where
85− (+) = addNumber
86− (-) = subNumber
87− (*) = mulNumber
88− (/) = divNumber
89− (%) = modNumber
90− negate = negateNumber
114+ (+) = numAdd
115+ (-) = numSub
116+ (*) = numMul
117+ (/) = numDiv
118+ (%) = numMod
119+ negate = numNegate
120+
121+ infixl 9 ==
122+ infixl 9 /=
91123
92124 class Eq a where
93125 (==) :: a -> a -> Boolean
@@ -96,13 +128,29 @@ module Prelude where
96128 -- Referential equality
97129 data Ref a = Ref a
98130
99− foreign import refEq "" :: forall a. Ref a -> Ref a -> Boolean
100−
101− foreign import refIneq "" :: forall a. Ref a -> Ref a -> Boolean
131+ foreign import refEq "function refEq(r1) {\
132+ \ return function(r2) {\
133+ \ return r1.value === r2.value;\
134+ \ };\
135+ \}" :: forall a. Ref a -> Ref a -> Boolean
136+
137+ foreign import refIneq "function refIneq(r1) {\
138+ \ return function(r2) {\
139+ \ return r1.value !== r2.value;\
140+ \ };\
141+ \}" :: forall a. Ref a -> Ref a -> Boolean
102142
103− foreign import unsafeRefEq "" :: forall a. a -> a -> Boolean
104−
105− foreign import unsafeRefIneq "" :: forall a. a -> a -> Boolean
143+ foreign import unsafeRefEq "function unsafeRefEq(r1) {\
144+ \ return function(r2) {\
145+ \ return r1 === r2;\
146+ \ };\
147+ \}" :: forall a. a -> a -> Boolean
148+
149+ foreign import unsafeRefIneq "function unsafeRefIneq(r1) {\
150+ \ return function(r2) {\
151+ \ return r1 !== r2;\
152+ \ };\
153+ \}" :: forall a. a -> a -> Boolean
106154
107155 instance Eq (Ref a) where
108156 (==) = refEq
@@ -124,26 +172,55 @@ module Prelude where
124172 (==) = unsafeRefEq
125173 (/=) = unsafeRefIneq
126174
175+ infixl 3 <
176+ infixl 3 >
177+ infixl 3 <=
178+ infixl 3 >=
179+
127180 class Ord a where
128181 (<) :: a -> a -> Boolean
129182 (>) :: a -> a -> Boolean
130183 (<=) :: a -> a -> Boolean
131184 (>=) :: a -> a -> Boolean
132185
133− foreign import numLess "" :: Number -> Number -> Boolean
186+ foreign import numLess "function numLess(n1) {\
187+ \ return function(n2) {\
188+ \ return n1 < n2;\
189+ \ };\
190+ \}" :: Number -> Number -> Boolean
191+
192+ foreign import numLessEq "function numLessEq(n1) {\
193+ \ return function(n2) {\
194+ \ return n1 <= n2;\
195+ \ };\
196+ \}" :: Number -> Number -> Boolean
197+
198+ foreign import numGreater "function numGreater(n1) {\
199+ \ return function(n2) {\
200+ \ return n1 > n2;\
201+ \ };\
202+ \}" :: Number -> Number -> Boolean
134203
135− foreign import numLessEq "" :: Number -> Number -> Boolean
136−
137− foreign import numGreater "" :: Number -> Number -> Boolean
204+ foreign import numGreaterEq "function numGreaterEq(n1) {\
205+ \ return function(n2) {\
206+ \ return n1 >= n2;\
207+ \ };\
208+ \}" :: Number -> Number -> Boolean
138209
139− foreign import numGreaterEq "" :: Number -> Number -> Boolean
140−
141210 instance Ord Number where
142211 (<) = numLess
143212 (>) = numGreater
144213 (<=) = numLessEq
145214 (>=) = numGreaterEq
146215
216+ infixl 8 <<
217+ infixl 8 >>
218+ infixl 8 >>>
219+
220+ infixl 10 &
221+ infixl 10 |
222+ infixl 10 ^
223+
147224 class Bits b where
148225 (<<) :: b -> Number -> b
149226 (>>) :: b -> Number -> b
@@ -153,20 +230,46 @@ module Prelude where
153230 (^) :: b -> b -> b
154231 complement :: b -> b
155232
156− foreign import numShl "" :: Number -> Number -> Number
157−
158− foreign import numShr "" :: Number -> Number -> Number
159−
160− foreign import numZfShr "" :: Number -> Number -> Number
233+ foreign import numShl "function numShl(n1) {\
234+ \ return function(n2) {\
235+ \ return n1 << n2;\
236+ \ };\
237+ \}" :: Number -> Number -> Number
238+
239+ foreign import numShr "function numShr(n1) {\
240+ \ return function(n2) {\
241+ \ return n1 >> n2;\
242+ \ };\
243+ \}" :: Number -> Number -> Number
244+
245+ foreign import numZfShr "function numZfShr(n1) {\
246+ \ return function(n2) {\
247+ \ return n1 >>> n2;\
248+ \ };\
249+ \}" :: Number -> Number -> Number
250+
251+ foreign import numAnd "function numAnd(n1) {\
252+ \ return function(n2) {\
253+ \ return n1 & n2;\
254+ \ };\
255+ \}" :: Number -> Number -> Number
256+
257+ foreign import numOr "function numOr(n1) {\
258+ \ return function(n2) {\
259+ \ return n1 | n2;\
260+ \ };\
261+ \}" :: Number -> Number -> Number
161262
162− foreign import numAnd "" :: Number -> Number -> Number
263+ foreign import numXor "function numXor(n1) {\
264+ \ return function(n2) {\
265+ \ return n1 ^ n2;\
266+ \ };\
267+ \}" :: Number -> Number -> Number
163268
164− foreign import numOr "" :: Number -> Number -> Number
269+ foreign import numComplement "function numComplement(n) {\
270+ \ return ~n;\
271+ \}" :: Number -> Number
165272
166− foreign import numXor "" :: Number -> Number -> Number
167−
168− foreign import numComplement "" :: Number -> Number
169−
170273 instance Bits Number where
171274 (<<) = numShl
172275 (>>) = numShr
@@ -176,28 +279,45 @@ module Prelude where
176279 (^) = numXor
177280 complement = numComplement
178281
282+ infixl 4 !!
283+
179284 foreign import (!!) "function $bang$bang(xs) {\
180285 \ return function(n) {\
181286 \ return xs[n];\
182287 \ };\
183288 \}" :: forall a. [a] -> Number -> a
184289
290+ infixr 11 ||
291+ infixr 11 &&
292+
185293 class BoolLike b where
186294 (&&) :: b -> b -> b
187295 (||) :: b -> b -> b
188296 not :: b -> b
189297
190− foreign import boolAnd "" :: Boolean -> Boolean -> Boolean
191−
192− foreign import boolOr "" :: Boolean -> Boolean -> Boolean
298+ foreign import boolAnd "function boolAnd(b1) {\
299+ \ return function(b2) {\
300+ \ return b1 && b2;\
301+ \ };\
302+ \}" :: Boolean -> Boolean -> Boolean
303+
304+ foreign import boolOr "function boolOr(b1) {\
305+ \ return function(b2) {\
306+ \ return b1 || b2;\
307+ \ };\
308+ \}" :: Boolean -> Boolean -> Boolean
309+
310+ foreign import boolNot "function boolNot(b) {\
311+ \ return !b;\
312+ \}" :: Boolean -> Boolean
193313
194− foreign import boolNot "" :: Boolean -> Boolean
195−
196314 instance BoolLike Boolean where
197315 (&&) = boolAnd
198316 (||) = boolOr
199317 not = boolNot
200318
319+ infixr 6 ++
320+
201321 foreign import (++) "function $plus$plus(s1) {\
202322 \ return function(s2) {\
203323 \ return s1 + s2;\