@@ -40,10 +40,170 @@ 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) {\
44+ \ return n.toString();\
45+ \}" :: Number -> String
47+ instance Prelude.Show Number where
53+ instance Read String where
56+ instance Read Boolean where
43 class Monad m where
60 class Monad m where
44 ret :: forall a. a -> m a
61 ret :: forall a. a -> m a
45 (>>=) :: forall a b. m a -> (a -> m b) -> m b
62 (>>=) :: forall a b. m a -> (a -> m b) -> m b
72+ foreign import addNumber "" :: Number -> Number -> Number
74+ foreign import subNumber "" :: Number -> Number -> Number
76+ foreign import mulNumber "" :: Number -> Number -> Number
78+ foreign import divNumber "" :: Number -> Number -> Number
80+ foreign import modNumber "" :: Number -> Number -> Number
82+ foreign import negateNumber "" :: Number -> Number
84+ instance Num Number where
90+ negate = negateNumber
93+ (==) :: a -> a -> Boolean
94+ (/=) :: a -> a -> Boolean
96+ -- Referential equality
99+ foreign import refEq "" :: forall a. Ref a -> Ref a -> Boolean
101+ foreign import refIneq "" :: forall a. Ref a -> Ref a -> Boolean
103+ foreign import unsafeRefEq "" :: forall a. a -> a -> Boolean
105+ foreign import unsafeRefIneq "" :: forall a. a -> a -> Boolean
107+ instance Eq (Ref a) where
111+ instance Eq String where
113+ (/=) = unsafeRefIneq
115+ instance Eq Number where
117+ (/=) = unsafeRefIneq
119+ instance Eq Boolean where
121+ (/=) = unsafeRefIneq
123+ instance (Eq a) => Eq [a] where
125+ (/=) = unsafeRefIneq
128+ (<) :: a -> a -> Boolean
129+ (>) :: a -> a -> Boolean
130+ (<=) :: a -> a -> Boolean
131+ (>=) :: a -> a -> Boolean
133+ foreign import numLess "" :: Number -> Number -> Boolean
135+ foreign import numLessEq "" :: Number -> Number -> Boolean
137+ foreign import numGreater "" :: Number -> Number -> Boolean
139+ foreign import numGreaterEq "" :: Number -> Number -> Boolean
141+ instance Ord Number where
148+ (<<) :: b -> Number -> b
149+ (>>) :: b -> Number -> b
150+ (>>>) :: b -> Number -> b
154+ complement :: b -> b
156+ foreign import numShl "" :: Number -> Number -> Number
158+ foreign import numShr "" :: Number -> Number -> Number
160+ foreign import numZfShr "" :: Number -> Number -> Number
162+ foreign import numAnd "" :: Number -> Number -> Number
164+ foreign import numOr "" :: Number -> Number -> Number
166+ foreign import numXor "" :: Number -> Number -> Number
168+ foreign import numComplement "" :: Number -> Number
170+ instance Bits Number where
177+ complement = numComplement
179+ foreign import (!!) "function $bang$bang(xs) {\
180+ \ return function(n) {\
183+ \}" :: forall a. [a] -> Number -> a
185+ class BoolLike b where
190+ foreign import boolAnd "" :: Boolean -> Boolean -> Boolean
192+ foreign import boolOr "" :: Boolean -> Boolean -> Boolean
194+ foreign import boolNot "" :: Boolean -> Boolean
196+ instance BoolLike Boolean where
201+ foreign import (++) "function $plus$plus(s1) {\
202+ \ return function(s2) {\
205+ \}" :: String -> String -> String
47module Maybe where
207module Maybe where
49 data Maybe a = Nothing | Just a
209 data Maybe a = Nothing | Just a
@@ -65,11 +225,11 @@ module Either where
66 either :: forall a b c. (a -> c) -> (b -> c) -> Either a b -> c
226 either :: forall a b c. (a -> c) -> (b -> c) -> Either a b -> c
67 either f _ (Left a) = f a
227 either f _ (Left a) = f a
68− either _ g (Right b) = g b
228+ either _ g (Right b) = g b
70 instance Prelude.Monad (Either e) where
230 instance Prelude.Monad (Either e) where
71 ret = Right
231 ret = Right
72− (>>=) = either (\e _ -> Left e) (\a f -> f a)
232+ (>>=) = either (\e _ -> Left e) (\a f -> f a)
74module Arrays where
234module Arrays where
@@ -92,7 +252,7 @@ module Arrays where
93 map :: forall a b. (a -> b) -> [a] -> [b]
253 map :: forall a b. (a -> b) -> [a] -> [b]
94 map _ [] = []
254 map _ [] = []
95− map f (x:xs) = f x : map f xs
255+ map f (x:xs) = f x : map f xs
97 foldr :: forall a b. (a -> b -> a) -> a -> [b] -> a
257 foldr :: forall a b. (a -> b -> a) -> a -> [b] -> a
98 foldr f a (b : bs) = f (foldr f a bs) b
258 foldr f a (b : bs) = f (foldr f a bs) b
@@ -194,7 +354,7 @@ module Arrays where
195 empty :: forall a. [a] -> Boolean
355 empty :: forall a. [a] -> Boolean
196 empty [] = true
356 empty [] = true
197− empty _ = false
357+ empty _ = false
199 range :: Number -> Number -> [Number]
359 range :: Number -> Number -> [Number]
200 range lo hi = {
360 range lo hi = {
@@ -382,12 +542,6 @@ module Global where
383 \}" :: Number -> Number -> String
543 \}" :: Number -> Number -> String
385− foreign import numberToString "function numberToString(n) {\
386− \ return n.toString();\
387− \}" :: Number -> String
389− foreign import isNaN :: Number -> Boolean
391 foreign import isFinite :: Number -> Boolean
545 foreign import isFinite :: Number -> Boolean
393 foreign import parseFloat :: String -> Number
547 foreign import parseFloat :: String -> Number
@@ -402,8 +556,7 @@ module Global where
403 foreign import decodeURI :: String -> String
557 foreign import decodeURI :: String -> String
405− instance Prelude.Show Number where
559+ foreign import isNaN :: Number -> Boolean
406− show = numberToString
408module Math where
561module Math where
@@ -493,7 +646,7 @@ module Eff where
493 \ return f(a())(); \
646 \ return f(a())(); \
496− \}" :: forall e a b. Eff e a -> (a -> Eff e b) -> Eff e b
649+ \}" :: forall e a b. Eff e a -> (a -> Eff e b) -> Eff e b
498 type Pure a = forall e. Eff e a
651 type Pure a = forall e. Eff e a
@@ -544,11 +697,11 @@ module Errors where
544module IORef where
697module IORef where
546 import Eff
699 import Eff
548 foreign import data Ref :: !
701 foreign import data Ref :: !
550 foreign import data IORef :: * -> *
703 foreign import data IORef :: * -> *
552 foreign import newIORef "function newIORef(val) {\
705 foreign import newIORef "function newIORef(val) {\
553 \ return function () {\
706 \ return function () {\
554 \ return { value: val };\
707 \ return { value: val };\
@@ -582,9 +735,9 @@ module Trace where
583 import Prelude
736 import Prelude
584 import Eff
737 import Eff
586 foreign import data Trace :: !
739 foreign import data Trace :: !
588 foreign import trace "function trace(s) { \
741 foreign import trace "function trace(s) { \
589 \ return function() { \
742 \ return function() { \
590 \ console.log(s); \
743 \ console.log(s); \
@@ -593,7 +746,7 @@ module Trace where
593 \}" :: forall r. String -> Eff (trace :: Trace | r) {}
746 \}" :: forall r. String -> Eff (trace :: Trace | r) {}
595 print :: forall a r. (Prelude.Show a) => a -> Eff (trace :: Trace | r) {}
748 print :: forall a r. (Prelude.Show a) => a -> Eff (trace :: Trace | r) {}
596− print o = trace (show o)
749+ print o = trace (show o)
598module ST where
751module ST where
@@ -630,7 +783,7 @@ module ST where
632 \}" :: forall a h r. STRef h a -> a -> Eff (st :: ST h | r) {}
785 \}" :: forall a h r. STRef h a -> a -> Eff (st :: ST h | r) {}
634 foreign import runST "function runST(f) {\
787 foreign import runST "function runST(f) {\
635 \ return f;\
788 \ return f;\
636 \}" :: forall a r. (forall h. Eff (st :: ST h | r) a) -> Eff r a
789 \}" :: forall a r. (forall h. Eff (st :: ST h | r) a) -> Eff r a