@@ -40,7 +40,7 @@ module Prelude where
40 show true = "true"
40 show true = "true"
41 show false = "false"
41 show false = "false"
43− foreign import showNumber "function numberToString(n) {\
43+ foreign import showNumber "function showNumber(n) {\
44 \ return n.toString();\
44 \ return n.toString();\
45 \}" :: Number -> String
45 \}" :: Number -> String
@@ -61,6 +61,13 @@ module Prelude where
61 ret :: forall a. a -> m a
61 ret :: forall a. a -> m a
62 (>>=) :: forall a b. m a -> (a -> m b) -> m b
62 (>>=) :: forall a b. m a -> (a -> m b) -> m b
64 class Num a where
71 class Num a where
65 (+) :: a -> a -> a
72 (+) :: a -> a -> a
66 (-) :: a -> a -> a
73 (-) :: a -> a -> a
@@ -69,25 +76,50 @@ module Prelude where
69 (%) :: a -> a -> a
76 (%) :: a -> a -> a
70 negate :: a -> a
77 negate :: a -> a
79+ foreign import numAdd "function numAdd(n1) {\
80+ \ return function(n2) {\
72− foreign import addNumber "" :: Number -> Number -> Number
83+ \}" :: Number -> Number -> Number
85+ foreign import numSub "function numSub(n1) {\
86+ \ return function(n2) {\
74− foreign import subNumber "" :: Number -> Number -> Number
89+ \}" :: Number -> Number -> Number
91+ foreign import numMul "function numMul(n1) {\
92+ \ return function(n2) {\
95+ \}" :: Number -> Number -> Number
97+ foreign import numDiv "function numDiv(n1) {\
98+ \ return function(n2) {\
76− foreign import mulNumber "" :: Number -> Number -> Number
101+ \}" :: Number -> Number -> Number
103+ foreign import numMod "function numMod(n1) {\
104+ \ return function(n2) {\
78− foreign import divNumber "" :: Number -> Number -> Number
107+ \}" :: Number -> Number -> Number
80− foreign import modNumber "" :: Number -> Number -> Number
109+ foreign import numNegate "function numNegate(n) {\
82− foreign import negateNumber "" :: Number -> Number
111+ \}" :: Number -> Number
84 instance Num Number where
113 instance Num Number where
85− (+) = addNumber
114+ (+) = numAdd
86− (-) = subNumber
115+ (-) = numSub
87− (*) = mulNumber
116+ (*) = numMul
88− (/) = divNumber
117+ (/) = numDiv
89− (%) = modNumber
118+ (%) = numMod
90− negate = negateNumber
119+ negate = numNegate
92 class Eq a where
124 class Eq a where
93 (==) :: a -> a -> Boolean
125 (==) :: a -> a -> Boolean
@@ -96,13 +128,29 @@ module Prelude where
96 -- Referential equality
128 -- Referential equality
97 data Ref a = Ref a
129 data Ref a = Ref a
131+ foreign import refEq "function refEq(r1) {\
132+ \ return function(r2) {\
133+ \ return r1.value === r2.value;\
99− foreign import refEq "" :: forall a. Ref a -> Ref a -> Boolean
135+ \}" :: forall a. Ref a -> Ref a -> Boolean
137+ foreign import refIneq "function refIneq(r1) {\
138+ \ return function(r2) {\
139+ \ return r1.value !== r2.value;\
101− foreign import refIneq "" :: forall a. Ref a -> Ref a -> Boolean
141+ \}" :: forall a. Ref a -> Ref a -> Boolean
143+ foreign import unsafeRefEq "function unsafeRefEq(r1) {\
144+ \ return function(r2) {\
145+ \ return r1 === r2;\
103− foreign import unsafeRefEq "" :: forall a. a -> a -> Boolean
147+ \}" :: forall a. a -> a -> Boolean
105− foreign import unsafeRefIneq "" :: forall a. a -> a -> Boolean
149+ foreign import unsafeRefIneq "function unsafeRefIneq(r1) {\
150+ \ return function(r2) {\
151+ \ return r1 !== r2;\
153+ \}" :: forall a. a -> a -> Boolean
107 instance Eq (Ref a) where
155 instance Eq (Ref a) where
108 (==) = refEq
156 (==) = refEq
@@ -124,26 +172,55 @@ module Prelude where
124 (==) = unsafeRefEq
172 (==) = unsafeRefEq
125 (/=) = unsafeRefIneq
173 (/=) = unsafeRefIneq
127 class Ord a where
180 class Ord a where
128 (<) :: a -> a -> Boolean
181 (<) :: a -> a -> Boolean
129 (>) :: a -> a -> Boolean
182 (>) :: a -> a -> Boolean
130 (<=) :: a -> a -> Boolean
183 (<=) :: a -> a -> Boolean
131 (>=) :: a -> a -> Boolean
184 (>=) :: a -> a -> Boolean
186+ foreign import numLess "function numLess(n1) {\
187+ \ return function(n2) {\
190+ \}" :: Number -> Number -> Boolean
192+ foreign import numLessEq "function numLessEq(n1) {\
193+ \ return function(n2) {\
196+ \}" :: Number -> Number -> Boolean
198+ foreign import numGreater "function numGreater(n1) {\
199+ \ return function(n2) {\
133− foreign import numLess "" :: Number -> Number -> Boolean
202+ \}" :: Number -> Number -> Boolean
135− foreign import numLessEq "" :: Number -> Number -> Boolean
204+ foreign import numGreaterEq "function numGreaterEq(n1) {\
136−
205+ \ return function(n2) {\
137− foreign import numGreater "" :: Number -> Number -> Boolean
208+ \}" :: Number -> Number -> Boolean
139− foreign import numGreaterEq "" :: Number -> Number -> Boolean
141 instance Ord Number where
210 instance Ord Number where
142 (<) = numLess
211 (<) = numLess
143 (>) = numGreater
212 (>) = numGreater
144 (<=) = numLessEq
213 (<=) = numLessEq
145 (>=) = numGreaterEq
214 (>=) = numGreaterEq
147 class Bits b where
224 class Bits b where
148 (<<) :: b -> Number -> b
225 (<<) :: b -> Number -> b
149 (>>) :: b -> Number -> b
226 (>>) :: b -> Number -> b
@@ -153,20 +230,46 @@ module Prelude where
153 (^) :: b -> b -> b
230 (^) :: b -> b -> b
154 complement :: b -> b
231 complement :: b -> b
233+ foreign import numShl "function numShl(n1) {\
234+ \ return function(n2) {\
156− foreign import numShl "" :: Number -> Number -> Number
237+ \}" :: Number -> Number -> Number
239+ foreign import numShr "function numShr(n1) {\
240+ \ return function(n2) {\
243+ \}" :: Number -> Number -> Number
245+ foreign import numZfShr "function numZfShr(n1) {\
246+ \ return function(n2) {\
247+ \ return n1 >>> n2;\
158− foreign import numShr "" :: Number -> Number -> Number
249+ \}" :: Number -> Number -> Number
251+ foreign import numAnd "function numAnd(n1) {\
252+ \ return function(n2) {\
255+ \}" :: Number -> Number -> Number
257+ foreign import numOr "function numOr(n1) {\
258+ \ return function(n2) {\
160− foreign import numZfShr "" :: Number -> Number -> Number
261+ \}" :: Number -> Number -> Number
263+ foreign import numXor "function numXor(n1) {\
264+ \ return function(n2) {\
162− foreign import numAnd "" :: Number -> Number -> Number
267+ \}" :: Number -> Number -> Number
269+ foreign import numComplement "function numComplement(n) {\
164− foreign import numOr "" :: Number -> Number -> Number
271+ \}" :: Number -> Number
166− foreign import numXor "" :: Number -> Number -> Number
168− foreign import numComplement "" :: Number -> Number
170 instance Bits Number where
273 instance Bits Number where
171 (<<) = numShl
274 (<<) = numShl
172 (>>) = numShr
275 (>>) = numShr
@@ -176,28 +279,45 @@ module Prelude where
176 (^) = numXor
279 (^) = numXor
177 complement = numComplement
280 complement = numComplement
179 foreign import (!!) "function $bang$bang(xs) {\
284 foreign import (!!) "function $bang$bang(xs) {\
180 \ return function(n) {\
285 \ return function(n) {\
181 \ return xs[n];\
286 \ return xs[n];\
183 \}" :: forall a. [a] -> Number -> a
288 \}" :: forall a. [a] -> Number -> a
185 class BoolLike b where
293 class BoolLike b where
186 (&&) :: b -> b -> b
294 (&&) :: b -> b -> b
187 (||) :: b -> b -> b
295 (||) :: b -> b -> b
188 not :: b -> b
296 not :: b -> b
298+ foreign import boolAnd "function boolAnd(b1) {\
299+ \ return function(b2) {\
190− foreign import boolAnd "" :: Boolean -> Boolean -> Boolean
302+ \}" :: Boolean -> Boolean -> Boolean
304+ foreign import boolOr "function boolOr(b1) {\
305+ \ return function(b2) {\
192− foreign import boolOr "" :: Boolean -> Boolean -> Boolean
308+ \}" :: Boolean -> Boolean -> Boolean
310+ foreign import boolNot "function boolNot(b) {\
312+ \}" :: Boolean -> Boolean
194− foreign import boolNot "" :: Boolean -> Boolean
196 instance BoolLike Boolean where
314 instance BoolLike Boolean where
197 (&&) = boolAnd
315 (&&) = boolAnd
198 (||) = boolOr
316 (||) = boolOr
199 not = boolNot
317 not = boolNot
201 foreign import (++) "function $plus$plus(s1) {\
321 foreign import (++) "function $plus$plus(s1) {\
202 \ return function(s2) {\
322 \ return function(s2) {\
203 \ return s1 + s2;\
323 \ return s1 + s2;\