git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Make tests pass again
041e4eaPhil Freeman
examples/failing/Arrays.purs+2
@@ -1,3 +1,5 @@
1module Arrays where
1module Arrays where
2
2
3+ import Prelude
4+
3 test = \arr -> arr !! (0 !! 0)
5 test = \arr -> arr !! (0 !! 0)
examples/failing/Do.purs+4−6
@@ -1,10 +1,8 @@
1module Do where
1module Do where
2
2
3−id = { ret: \x -> x, bind: \x f -> f x }
3+test1 = do let x = 1
4
4
5−test1 = id do let x = 1
5+test2 y = do x <- y
6
6
7−test2 y = id do x <- y
8−
9−test3 = id do return 1
7+test3 = do ret 1
10− return 2
8+ ret 2
examples/failing/LocalVars.purs+2
@@ -1,5 +1,7 @@
1module LocalVars where
1module LocalVars where
2
2
3+ import Prelude
4+
3 bad = \x -> {
5 bad = \x -> {
4 x = x + 1;
6 x = x + 1;
5 return x;
7 return x;
examples/failing/PatternScope.purs+2
@@ -1,5 +1,7 @@
1module PatternScope where
1module PatternScope where
2
2
3+ import Prelude
4+
3 -- Pattern scope doesn't leak
5 -- Pattern scope doesn't leak
4 foobar = \x -> {
6 foobar = \x -> {
5 var y = case x of
7 var y = case x of
examples/failing/Rank2Types.purs+2
@@ -1,5 +1,7 @@
1module Rank2Types where
1module Rank2Types where
2
2
3+ import Prelude
4+
3 foreign import test :: (forall a. a -> a) -> Number
5 foreign import test :: (forall a. a -> a) -> Number
4
6
5 test1 = test (\n -> n + 1)
7 test1 = test (\n -> n + 1)
examples/failing/Shadowed.purs+2
@@ -1,5 +1,7 @@
1module Shadowed where
1module Shadowed where
2
2
3+import Prelude
4+
3a = [1, 2]
5a = [1, 2]
4
6
5foo = {
7foo = {
examples/failing/TypeError.purs+3−1
@@ -1,3 +1,5 @@
1module TypeError where
1module TypeError where
2
2
3+ import Prelude
4+
3− test = x ++ "A"
5+ test = 1 ++ "A"
examples/passing/Arrays.purs+3−1
@@ -1,6 +1,8 @@
1module ArraysTests where
1module ArraysTests where
2
2
3+import Prelude
4+
3−test1 = \arr -> arr !! 0 + arr !! 1
5+test1 arr = arr !! 0 + arr !! 1 + 1
4
6
5test2 = \arr -> case arr of
7test2 = \arr -> case arr of
6 [x, y] -> x + y
8 [x, y] -> x + y
examples/passing/Assign.purs+2
@@ -1,5 +1,7 @@
1module Assign where
1module Assign where
2
2
3+ import Prelude
4+
3 sum = \n -> {
5 sum = \n -> {
4 var x = 0;
6 var x = 0;
5 for (i <- 0 until n) {
7 for (i <- 0 until n) {
examples/passing/Conditional.purs−2
@@ -2,8 +2,6 @@ module Conditional where
2
2
3 fns = \f -> if f true then f else \x -> x
3 fns = \f -> if f true then f else \x -> x
4
4
5− bin = \x -> if x && !x then x else x
6−
7 not = \x -> if x then false else true
5 not = \x -> if x then false else true
8
6
9module Main where
7module Main where
examples/passing/Do.purs+3−5
@@ -25,14 +25,14 @@ test3 = \_ -> do
25test4 mx my = do
25test4 mx my = do
26 x <- mx
26 x <- mx
27 y <- my
27 y <- my
28− Just (x + y)
28+ Just (x + y + 1)
29
29
30test5 mx my mz = do
30test5 mx my mz = do
31 x <- mx
31 x <- mx
32 y <- my
32 y <- my
33 let sum = x + y
33 let sum = x + y
34 z <- mz
34 z <- mz
35− Just (z + sum)
35+ Just (z + sum + 1)
36
36
37test6 mx = \_ -> do
37test6 mx = \_ -> do
38 let Just x = mx
38 let Just x = mx
@@ -53,14 +53,12 @@ test8 = \_ -> do
53 a <- m
53 a <- m
54 ret (g a)
54 ret (g a)
55
55
56−foo x y z = x + y + z
57−
58forever :: forall m a b. (Monad m) => m a -> m b
56forever :: forall m a b. (Monad m) => m a -> m b
59forever a = do
57forever a = do
60 a
58 a
61 forever a
59 forever a
62
60
63−test9 = \_ -> foo <$> Just 1 <*> Just 2 <*> Just 3
61+test9 = \_ -> (+) <$> Just 1 <*> Just 2
64
62
65module Main where
63module Main where
66
64
examples/passing/Eff.purs+1−1
@@ -17,9 +17,9 @@ test2 = runPure $ runST $ do
17
17
18module Main where
18module Main where
19
19
20+import Prelude
20import Eff
21import Eff
21import TestEff
22import TestEff
22−import Global
23
23
24main = do
24main = do
25 n <- test1
25 n <- test1
examples/passing/FFI.purs+2−2
@@ -3,13 +3,13 @@ module FFI where
3foreign import foo :: String -> String
3foreign import foo :: String -> String
4
4
5bar :: String -> String
5bar :: String -> String
6−bar = \x -> foo (x ++ "bar")
6+bar _ = foo "test"
7
7
8module FFIModuleTest where
8module FFIModuleTest where
9
9
10import FFI
10import FFI
11
11
12−baz = \_ -> foo "test"
12+baz _ = foo "test"
13
13
14module Main where
14module Main where
15
15
examples/passing/Functions.purs+3−1
@@ -1,8 +1,10 @@
1module Functions where
1module Functions where
2
2
3+ import Prelude
4+
3 test1 = \_ -> 0
5 test1 = \_ -> 0
4
6
5− test2 = \a b c d -> a + b + c + d
7+ test2 = \a b -> a + b + 1
6
8
7 test3 = \a -> a
9 test3 = \a -> a
8
10
examples/passing/Guards.purs+2
@@ -1,5 +1,7 @@
1module Guards where
1module Guards where
2
2
3+ import Prelude
4+
3 collatz = \x -> case x of
5 collatz = \x -> case x of
4 y | y % 2 == 0 -> y / 2
6 y | y % 2 == 0 -> y / 2
5 y -> y * 3 + 1
7 y -> y * 3 + 1
examples/passing/IfThenElse.purs+2
@@ -1,5 +1,7 @@
1module IfThenElse where
1module IfThenElse where
2
2
3+ import Prelude
4+
3 testIf =
5 testIf =
4 {
6 {
5 var x = 0;
7 var x = 0;
examples/passing/Module.purs+4
@@ -1,5 +1,7 @@
1module M1 where
1module M1 where
2
2
3+ import Prelude
4+
3 data Foo = Foo String
5 data Foo = Foo String
4
6
5 foo :: M1.Foo -> String
7 foo :: M1.Foo -> String
@@ -13,6 +15,8 @@ module M1 where
13
15
14module M2 where
16module M2 where
15
17
18+ import Prelude
19+
16 baz :: M1.Foo -> String
20 baz :: M1.Foo -> String
17 baz = M1.foo
21 baz = M1.foo
18
22
examples/passing/MutRec.purs+2
@@ -1,5 +1,7 @@
1module MutRec where
1module MutRec where
2
2
3+ import Prelude
4+
3 f 0 = 0
5 f 0 = 0
4 f x = g x + 1
6 f x = g x + 1
5
7
examples/passing/Objects.purs+3−1
@@ -1,6 +1,8 @@
1module Objects where
1module Objects where
2
2
3+ import Prelude
4+
3− test = \x -> x.foo + x.bar
5+ test = \x -> x.foo + x.bar + 1
4
6
5 append = \o -> { foo: o.foo, bar: 1 }
7 append = \o -> { foo: o.foo, bar: 1 }
6
8
examples/passing/Operators.purs+8−2
@@ -1,5 +1,7 @@
1module Operators1 where
1module Operators1 where
2
2
3+ import Prelude ((++))
4+
3 (@@) :: forall a b. (a -> b) -> a -> b
5 (@@) :: forall a b. (a -> b) -> a -> b
4 (@@) = \f x -> f x
6 (@@) = \f x -> f x
5
7
@@ -12,7 +14,10 @@ module Operators1 where
12
14
13module Operators2 where
15module Operators2 where
14
16
17+ import Prelude
18+
19+ test1 :: forall n. (Num n) => n -> n -> (n -> n -> n) -> n
15− test1 = \x y z -> x * y + z(x)(y)
20+ test1 x y z = x * y + z x y
16
21
17 test2 = (\x -> x.foo false) { foo : \_ -> 1 }
22 test2 = (\x -> x.foo false) { foo : \_ -> 1 }
18
23
@@ -24,7 +29,8 @@ module Operators2 where
24
29
25 infixl 5 %%
30 infixl 5 %%
26
31
32+ (%%) :: Number -> Number -> Number
27− (%%) = \x -> \y -> x * y + y
33+ (%%) x y = x * y + y
28
34
29 test5 = 1 %% 2 %% 3
35 test5 = 1 %% 2 %% 3
30
36
examples/passing/OptimizerBug.purs+2
@@ -1,5 +1,7 @@
1module OptimizerBug where
1module OptimizerBug where
2
2
3+import Prelude
4+
3x = 1 + y
5x = 1 + y
4
6
5y = x
7y = x
examples/passing/Patterns.purs+5−3
@@ -1,5 +1,7 @@
1module Patterns where
1module Patterns where
2
2
3+ import Prelude
4+
3 test = \x -> case x of
5 test = \x -> case x of
4 { str = "Foo", bool = true } -> true
6 { str = "Foo", bool = true } -> true
5 { str = "Bar", bool = b } -> b
7 { str = "Bar", bool = b } -> b
@@ -19,9 +21,9 @@ module Patterns where
19 a@[_,_,_] -> a
21 a@[_,_,_] -> a
20 _ -> []
22 _ -> []
21
23
22− isDesc = \o -> case o of
24+ isDesc :: [Number] -> Boolean
23− [x, y] | x > y -> true
25+ isDesc [x, y] | x > y = true
24− _ -> false
26+ isDesc _ = false
25
27
26module Main where
28module Main where
27
29
examples/passing/Person.purs+2
@@ -1,5 +1,7 @@
1module Person where
1module Person where
2
2
3+ import Prelude ((++))
4+
3 data Person = Person { name :: String, age :: Number }
5 data Person = Person { name :: String, age :: Number }
4
6
5 foreign import itoa :: Number -> String
7 foreign import itoa :: Number -> String
examples/passing/Rank2Data.purs+2
@@ -1,5 +1,7 @@
1module Rank2Data where
1module Rank2Data where
2
2
3+ import Prelude
4+
3 data Id = Id forall a. a -> a
5 data Id = Id forall a. a -> a
4
6
5 runId = \id a -> case id of
7 runId = \id a -> case id of
examples/passing/Rank2Types.purs+2
@@ -1,5 +1,7 @@
1module Rank2Types where
1module Rank2Types where
2
2
3+ import Prelude
4+
3 test1 :: (forall a. (a -> a)) -> Number
5 test1 :: (forall a. (a -> a)) -> Number
4 test1 = \f -> f 0
6 test1 = \f -> f 0
5
7
examples/passing/Recursion.purs+2
@@ -1,5 +1,7 @@
1module Recursion where
1module Recursion where
2
2
3+ import Prelude
4+
3 fib = \n -> case n of
5 fib = \n -> case n of
4 0 -> 1
6 0 -> 1
5 1 -> 1
7 1 -> 1
examples/passing/TailCall.purs+4
@@ -1,8 +1,12 @@
1module TailCall where
1module TailCall where
2
2
3+import Prelude
4+
5+test :: Number -> [Number] -> Number
3test n [] = n
6test n [] = n
4test n (x:xs) = test (n + x) xs
7test n (x:xs) = test (n + x) xs
5
8
9+loop :: forall a. Number -> a
6loop x = loop (x + 1)
10loop x = loop (x + 1)
7
11
8notATailCall = \x ->
12notATailCall = \x ->
examples/passing/TopLevelCase.purs+2
@@ -1,5 +1,7 @@
1module TopLevelCase where
1module TopLevelCase where
2
2
3+ import Prelude
4+
3 gcd :: Number -> Number -> Number
5 gcd :: Number -> Number -> Number
4 gcd 0 x = x
6 gcd 0 x = x
5 gcd x 0 = x
7 gcd x 0 = x
libraries/prelude/prelude.purs+162−42
@@ -40,7 +40,7 @@ module Prelude where
40 show true = "true"
40 show true = "true"
41 show false = "false"
41 show false = "false"
42
42
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
46
46
@@ -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
63
63
64+ infixl 5 *
65+ infixl 5 /
66+ infixl 5 %
67+
68+ infixl 7 -
69+ infixl 7 +
70+
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
71
78
79+ foreign import numAdd "function numAdd(n1) {\
80+ \ return function(n2) {\
81+ \ return n1 + n2;\
82+ \ };\
72− foreign import addNumber "" :: Number -> Number -> Number
83+ \}" :: Number -> Number -> Number
73
84
85+ foreign import numSub "function numSub(n1) {\
86+ \ return function(n2) {\
87+ \ return n1 - n2;\
88+ \ };\
74− foreign import subNumber "" :: Number -> Number -> Number
89+ \}" :: Number -> Number -> Number
75
90
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+ \ };\
76− foreign import mulNumber "" :: Number -> Number -> Number
101+ \}" :: Number -> Number -> Number
77
102
103+ foreign import numMod "function numMod(n1) {\
104+ \ return function(n2) {\
105+ \ return n1 % n2;\
106+ \ };\
78− foreign import divNumber "" :: Number -> Number -> Number
107+ \}" :: Number -> Number -> Number
79
108
80− foreign import modNumber "" :: Number -> Number -> Number
109+ foreign import numNegate "function numNegate(n) {\
81−
110+ \ return -n;\
82− foreign import negateNumber "" :: Number -> Number
111+ \}" :: Number -> Number
83
112
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
120+
121+ infixl 9 ==
122+ infixl 9 /=
91
123
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
98
130
131+ foreign import refEq "function refEq(r1) {\
132+ \ return function(r2) {\
133+ \ return r1.value === r2.value;\
134+ \ };\
99− foreign import refEq "" :: forall a. Ref a -> Ref a -> Boolean
135+ \}" :: forall a. Ref a -> Ref a -> Boolean
100−
136+
137+ foreign import refIneq "function refIneq(r1) {\
138+ \ return function(r2) {\
139+ \ return r1.value !== r2.value;\
140+ \ };\
101− foreign import refIneq "" :: forall a. Ref a -> Ref a -> Boolean
141+ \}" :: forall a. Ref a -> Ref a -> Boolean
102
142
143+ foreign import unsafeRefEq "function unsafeRefEq(r1) {\
144+ \ return function(r2) {\
145+ \ return r1 === r2;\
146+ \ };\
103− foreign import unsafeRefEq "" :: forall a. a -> a -> Boolean
147+ \}" :: forall a. a -> a -> Boolean
104−
148+
105− foreign import unsafeRefIneq "" :: forall a. a -> a -> Boolean
149+ foreign import unsafeRefIneq "function unsafeRefIneq(r1) {\
150+ \ return function(r2) {\
151+ \ return r1 !== r2;\
152+ \ };\
153+ \}" :: forall a. a -> a -> Boolean
106
154
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
126
174
175+ infixl 3 <
176+ infixl 3 >
177+ infixl 3 <=
178+ infixl 3 >=
179+
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
132
185
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+ \ };\
133− foreign import numLess "" :: Number -> Number -> Boolean
202+ \}" :: Number -> Number -> Boolean
134
203
135− foreign import numLessEq "" :: Number -> Number -> Boolean
204+ foreign import numGreaterEq "function numGreaterEq(n1) {\
136−
205+ \ return function(n2) {\
206+ \ return n1 >= n2;\
207+ \ };\
137− foreign import numGreater "" :: Number -> Number -> Boolean
208+ \}" :: Number -> Number -> Boolean
138
209
139− foreign import numGreaterEq "" :: Number -> Number -> Boolean
140−
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
146
215
216+ infixl 8 <<
217+ infixl 8 >>
218+ infixl 8 >>>
219+
220+ infixl 10 &
221+ infixl 10 |
222+ infixl 10 ^
223+
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
155
232
233+ foreign import numShl "function numShl(n1) {\
234+ \ return function(n2) {\
235+ \ return n1 << n2;\
236+ \ };\
156− foreign import numShl "" :: Number -> Number -> Number
237+ \}" :: Number -> Number -> Number
157−
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+ \ };\
158− foreign import numShr "" :: Number -> Number -> Number
249+ \}" :: Number -> Number -> Number
159−
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+ \ };\
160− foreign import numZfShr "" :: Number -> Number -> Number
261+ \}" :: Number -> Number -> Number
161
262
263+ foreign import numXor "function numXor(n1) {\
264+ \ return function(n2) {\
265+ \ return n1 ^ n2;\
266+ \ };\
162− foreign import numAnd "" :: Number -> Number -> Number
267+ \}" :: Number -> Number -> Number
163
268
269+ foreign import numComplement "function numComplement(n) {\
270+ \ return ~n;\
164− foreign import numOr "" :: Number -> Number -> Number
271+ \}" :: Number -> Number
165
272
166− foreign import numXor "" :: Number -> Number -> Number
167−
168− foreign import numComplement "" :: Number -> Number
169−
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
178
281
282+ infixl 4 !!
283+
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];\
182 \ };\
287 \ };\
183 \}" :: forall a. [a] -> Number -> a
288 \}" :: forall a. [a] -> Number -> a
184
289
290+ infixr 11 ||
291+ infixr 11 &&
292+
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
189
297
298+ foreign import boolAnd "function boolAnd(b1) {\
299+ \ return function(b2) {\
300+ \ return b1 && b2;\
301+ \ };\
190− foreign import boolAnd "" :: Boolean -> Boolean -> Boolean
302+ \}" :: Boolean -> Boolean -> Boolean
191−
303+
304+ foreign import boolOr "function boolOr(b1) {\
305+ \ return function(b2) {\
306+ \ return b1 || b2;\
307+ \ };\
192− foreign import boolOr "" :: Boolean -> Boolean -> Boolean
308+ \}" :: Boolean -> Boolean -> Boolean
309+
310+ foreign import boolNot "function boolNot(b) {\
311+ \ return !b;\
312+ \}" :: Boolean -> Boolean
193
313
194− foreign import boolNot "" :: Boolean -> Boolean
195−
196 instance BoolLike Boolean where
314 instance BoolLike Boolean where
197 (&&) = boolAnd
315 (&&) = boolAnd
198 (||) = boolOr
316 (||) = boolOr
199 not = boolNot
317 not = boolNot
200
318
319+ infixr 6 ++
320+
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;\