@@ -15,384 +15,535 @@ import Data.List.NonEmpty as NonEmptyList
15import Data.Set as Set
15import Data.Set as Set
16import Data.Tuple (Tuple(..))
16import Data.Tuple (Tuple(..))
17import Test.Extra (assertRight)
17import Test.Extra (assertRight)
18−import Test.Unit (TestSuite, suite, test)
18+import Test.Spec (Spec, describe, it)
19−import Test.Unit.Assert as Assert
19+import Test.Spec.Assertions (shouldEqual, shouldSatisfy)
20import Data.Maybe (Maybe(..))
20import Data.Maybe (Maybe(..))
25− suite "TypeQuery parser" do
24+ describe "TypeQuery parser" do
27− test "test #0" do
26+ it "test #0" do
28 let input = "a"
27 let input = "a"
29 assertRight (parseTypeQuery input) (qVar "a")
28 assertRight (parseTypeQuery input) (qVar "a")
31− test "test #1" do
30+ it "test #1" do
32 let input = "ab"
31 let input = "ab"
33 assertRight (parseTypeQuery input) (qVar "ab")
32 assertRight (parseTypeQuery input) (qVar "ab")
35− test "test #2" do
34+ it "test #2" do
36 let input = "a b"
35 let input = "a b"
37 assertRight (parseTypeQuery input) (QApp (qVar "a") (qVar "b"))
36 assertRight (parseTypeQuery input) (QApp (qVar "a") (qVar "b"))
39− test "test #3" do
38+ it "test #3" do
40 let input = "a b c"
39 let input = "a b c"
41 assertRight (parseTypeQuery input) (QApp (QApp (qVar "a") (qVar "b")) (qVar "c"))
40 assertRight (parseTypeQuery input) (QApp (QApp (qVar "a") (qVar "b")) (qVar "c"))
43− test "test #4" do
42+ it "test #4" do
44 let input = "a -> b"
43 let input = "a -> b"
45 assertRight (parseTypeQuery input) (QFun (qVar "a") (qVar "b"))
44 assertRight (parseTypeQuery input) (QFun (qVar "a") (qVar "b"))
47− test "test #5" do
46+ it "test #5" do
48 let input = "a -> b c"
47 let input = "a -> b c"
49 assertRight (parseTypeQuery input) (QFun (qVar "a") (QApp (qVar "b") (qVar "c")))
48 assertRight (parseTypeQuery input) (QFun (qVar "a") (QApp (qVar "b") (qVar "c")))
51− test "test #6" do
50+ it "test #6" do
52 let input = "a b -> c"
51 let input = "a b -> c"
53 assertRight (parseTypeQuery input) (QFun (QApp (qVar "a") (qVar "b")) (qVar "c"))
52 assertRight (parseTypeQuery input) (QFun (QApp (qVar "a") (qVar "b")) (qVar "c"))
55− test "test #7" do
54+ it "test #7" do
56 let input = "a b"
55 let input = "a b"
57 assertRight (parseTypeQuery input) (QApp (qVar "a") (qVar "b"))
56 assertRight (parseTypeQuery input) (QApp (qVar "a") (qVar "b"))
59− test "test #8" do
58+ it "test #8" do
60 let input = "a (b c)"
59 let input = "a (b c)"
61 assertRight (parseTypeQuery input) (QApp (qVar "a") (QApp (qVar "b") (qVar "c")))
60 assertRight (parseTypeQuery input) (QApp (qVar "a") (QApp (qVar "b") (qVar "c")))
63− test "test #9" do
62+ it "test #9" do
64 let input = "(a b) (c d)"
63 let input = "(a b) (c d)"
65 assertRight (parseTypeQuery input)
64 assertRight (parseTypeQuery input)
66− (QApp (QApp (qVar "a") (qVar "b"))
65+ ( QApp (QApp (qVar "a") (qVar "b"))
67− (QApp (qVar "c") (qVar "d")))
66+ (QApp (qVar "c") (qVar "d"))
69− test "test #10" do
69+ it "test #10" do
70 let input = "a ( b c )"
70 let input = "a ( b c )"
71 assertRight (parseTypeQuery input) (QApp (qVar "a") (QApp (qVar "b") (qVar "c")))
71 assertRight (parseTypeQuery input) (QApp (qVar "a") (QApp (qVar "b") (qVar "c")))
73− test "test #11" do
73+ it "test #11" do
74 let input = "aaa"
74 let input = "aaa"
75 assertRight (parseTypeQuery input) (qVar "aaa")
75 assertRight (parseTypeQuery input) (qVar "aaa")
77− test "test #12" do
77+ it "test #12" do
78 let input = "aaa ( bbb ccc )"
78 let input = "aaa ( bbb ccc )"
79 assertRight (parseTypeQuery input) (QApp (qVar "aaa") (QApp (qVar "bbb") (qVar "ccc")))
79 assertRight (parseTypeQuery input) (QApp (qVar "aaa") (QApp (qVar "bbb") (qVar "ccc")))
81− test "test #13" do
81+ it "test #13" do
82 let input = "(a -> b) -> (c -> d)"
82 let input = "(a -> b) -> (c -> d)"
83− assertRight (parseTypeQuery input) (QFun (QFun (qVar "a") (qVar "b"))
83+ assertRight (parseTypeQuery input)
84+ ( QFun (QFun (qVar "a") (qVar "b"))
84− (QFun (qVar "c") (qVar "d")))
85+ (QFun (qVar "c") (qVar "d"))
86− test "test #14" do
88+ it "test #14" do
87 let input = "a -> b -> c -> d"
89 let input = "a -> b -> c -> d"
88− assertRight (parseTypeQuery input) (QFun (qVar "a")
90+ assertRight (parseTypeQuery input)
89− (QFun (qVar "b")
92+ ( QFun (qVar "b")
90− (QFun (qVar "c") (qVar "d"))))
93+ (QFun (qVar "c") (qVar "d"))
92− test "test #15" do
97+ it "test #15" do
93 let input = "a -> b -> c"
98 let input = "a -> b -> c"
94− assertRight (parseTypeQuery input) (QFun (qVar "a")
99+ assertRight (parseTypeQuery input)
95− (QFun (qVar "b")
101+ ( QFun (qVar "b")
96− (qVar "c")))
102+ (qVar "c")
98− test "test #16" do
106+ it "test #16" do
99 let input = "forall a b c. c"
107 let input = "forall a b c. c"
100− assertRight (parseTypeQuery input) (QForAll (nl "a" ["b", "c"]) (qVar "c"))
108+ assertRight (parseTypeQuery input) (QForAll (nl "a" [ "b", "c" ]) (qVar "c"))
102− test "test #17" do
110+ it "test #17" do
103 let input = "forall a. Maybe a"
111 let input = "forall a. Maybe a"
104 assertRight (parseTypeQuery input) (QForAll (nl "a" $ []) (QApp (qConst "Maybe") (qVar "a")))
112 assertRight (parseTypeQuery input) (QForAll (nl "a" $ []) (QApp (qConst "Maybe") (qVar "a")))
106− test "test #18" do
114+ it "test #18" do
107 let input = "forall m a. Monad m => a -> m a"
115 let input = "forall m a. Monad m => a -> m a"
108 assertRight (parseTypeQuery input)
116 assertRight (parseTypeQuery input)
109− (QForAll (nl "m" ["a"])
117+ ( QForAll (nl "m" [ "a" ])
110− (qConstraint "Monad" (l [qVar "m"])
118+ ( qConstraint "Monad" (l [ qVar "m" ])
111− (QFun (qVar "a")
119+ ( QFun (qVar "a")
112− (QApp (qVar "m") (qVar "a")))))
120+ (QApp (qVar "m") (qVar "a"))
114− test "test #19" do
125+ it "test #19" do
115 let input = "{ a :: Int }"
126 let input = "{ a :: Int }"
116 assertRight (parseTypeQuery input)
127 assertRight (parseTypeQuery input)
117 (QApp (qConst "Record") (QRow (pure (Tuple (Identifier "a") (qConst "Int")))))
128 (QApp (qConst "Record") (QRow (pure (Tuple (Identifier "a") (qConst "Int")))))
119− test "test #20" do
130+ it "test #20" do
120 let input = "{a::Int}"
131 let input = "{a::Int}"
121 assertRight (parseTypeQuery input)
132 assertRight (parseTypeQuery input)
122 (QApp (qConst "Record") (QRow (pure (Tuple (Identifier "a") (qConst "Int")))))
133 (QApp (qConst "Record") (QRow (pure (Tuple (Identifier "a") (qConst "Int")))))
124− test "test #21" do
135+ it "test #21" do
125 let input = "Int"
136 let input = "Int"
126 assertRight (parseTypeQuery input) (qConst "Int")
137 assertRight (parseTypeQuery input) (qConst "Int")
128− test "test #22" do
139+ it "test #22" do
129 let input = "a->b"
140 let input = "a->b"
130 assertRight (parseTypeQuery input) (QFun (qVar "a") (qVar "b"))
141 assertRight (parseTypeQuery input) (QFun (qVar "a") (qVar "b"))
132− test "test #23" do
143+ it "test #23" do
133 let input = "forall m a. MonadRec m => Process m a -> m a"
144 let input = "forall m a. MonadRec m => Process m a -> m a"
134− assertRight (parseTypeQuery input) (QForAll (nl "m" ("a" : Nil))
145+ assertRight (parseTypeQuery input)
146+ ( QForAll (nl "m" ("a" : Nil))
135− (qConstraint "MonadRec" (l [qVar "m"])
147+ ( qConstraint "MonadRec" (l [ qVar "m" ])
136− (QFun (QApp (QApp (qConst "Process")
150+ ( QApp (qConst "Process")
137− (qVar "m")) (qVar "a"))
151+ (qVar "m")
138− (QApp (qVar "m") (qVar "a")))))
155+ (QApp (qVar "m") (qVar "a"))
140− test "test #24" do
160+ it "test #24" do
141 let input = "forall t f a. Foldable1 t => Apply f => f"
161 let input = "forall t f a. Foldable1 t => Apply f => f"
142− assertRight (parseTypeQuery input) (QForAll (nl "t" ["f", "a"])
162+ assertRight (parseTypeQuery input)
163+ ( QForAll (nl "t" [ "f", "a" ])
143− (qConstraint "Foldable1" (l [qVar "t"])
164+ ( qConstraint "Foldable1" (l [ qVar "t" ])
144− (qConstraint "Apply" (l [qVar "f"]) (qVar "f"))))
165+ (qConstraint "Apply" (l [ qVar "f" ]) (qVar "f"))
146− test "test #25" do
169+ it "test #25" do
147 let input = "forall m a.MonadRec m=>Process m a->m a"
170 let input = "forall m a.MonadRec m=>Process m a->m a"
148− assertRight (parseTypeQuery input) ((QForAll (nl "m" ("a" : Nil))
171+ assertRight (parseTypeQuery input)
172+ ( ( QForAll (nl "m" ("a" : Nil))
149− (qConstraint "MonadRec" (l [qVar "m"])
173+ ( qConstraint "MonadRec" (l [ qVar "m" ])
150− (QFun (QApp (QApp (qConst "Process")
176+ ( QApp (qConst "Process")
151− (qVar "m")) (qVar "a"))
177+ (qVar "m")
152− (QApp (qVar "m") (qVar "a"))))))
181+ (QApp (qVar "m") (qVar "a"))
154− test "test #26" do
187+ it "test #26" do
155 let input = "m a -> (a -> m b) -> m b"
188 let input = "m a -> (a -> m b) -> m b"
156 assertRight (parseTypeQuery input) (QFun (QApp (qVar "m") (qVar "a")) (QFun (QFun (qVar "a") (QApp (qVar "m") (qVar "b"))) (QApp (qVar "m") (qVar "b"))))
189 assertRight (parseTypeQuery input) (QFun (QApp (qVar "m") (qVar "a")) (QFun (QFun (qVar "a") (QApp (qVar "m") (qVar "b"))) (QApp (qVar "m") (qVar "b"))))
158− test "test #27" do
191+ it "test #27" do
159 let input = "forall f a. Alternative f => Lazy (f (List a)) => f a -> f (List a)"
192 let input = "forall f a. Alternative f => Lazy (f (List a)) => f a -> f (List a)"
160− assertRight (parseTypeQuery input) ((QForAll (nl "f" ["a"]))
193+ assertRight (parseTypeQuery input)
194+ ( (QForAll (nl "f" [ "a" ]))
161− (qConstraint "Alternative" (l [qVar "f"])
195+ ( qConstraint "Alternative" (l [ qVar "f" ])
162− (qConstraint "Lazy" (l [QApp (qVar "f")
196+ ( qConstraint "Lazy"
163− (QApp (qConst "List") (qVar "a"))])
199+ (QApp (qConst "List") (qVar "a"))
164− (QFun (QApp (qVar "f") (qVar "a"))
202+ ( QFun (QApp (qVar "f") (qVar "a"))
165− (QApp (qVar "f")
203+ ( QApp (qVar "f")
166− (QApp (qConst "List") (qVar "a")))))))
204+ (QApp (qConst "List") (qVar "a"))
168− test "test #28" do
211+ it "test #28" do
169 let input = "forall f a. Alternative f => Lazy(f (List a))=>f a -> f (List a)"
212 let input = "forall f a. Alternative f => Lazy(f (List a))=>f a -> f (List a)"
170− assertRight (parseTypeQuery input) ((QForAll (nl "f" ["a"]))
213+ assertRight (parseTypeQuery input)
214+ ( (QForAll (nl "f" [ "a" ]))
171− (qConstraint "Alternative" (l [qVar "f"])
215+ ( qConstraint "Alternative" (l [ qVar "f" ])
172− (qConstraint "Lazy" (l [QApp (qVar "f")
216+ ( qConstraint "Lazy"
173− (QApp (qConst "List") (qVar "a"))])
219+ (QApp (qConst "List") (qVar "a"))
174− (QFun (QApp (qVar "f") (qVar "a"))
222+ ( QFun (QApp (qVar "f") (qVar "a"))
175− (QApp (qVar "f")
223+ ( QApp (qVar "f")
176− (QApp (qConst "List") (qVar "a")))))))
224+ (QApp (qConst "List") (qVar "a"))
178− test "test #29" do
231+ it "test #29" do
179 let input = "{a::Int,b::Int}"
232 let input = "{a::Int,b::Int}"
180 assertRight (parseTypeQuery input)
233 assertRight (parseTypeQuery input)
181− (QApp (qConst "Record") (QRow (List.fromFoldable
234+ ( QApp (qConst "Record")
182− [ Tuple (Identifier "a") (qConst "Int")
237+ [ Tuple (Identifier "a") (qConst "Int")
183− , Tuple (Identifier "b") (qConst "Int")])))
238+ , Tuple (Identifier "b") (qConst "Int")
185− test "test #30" do
244+ it "test #30" do
186 let input = "{record''' :: Int}"
245 let input = "{record''' :: Int}"
187 assertRight (parseTypeQuery input)
246 assertRight (parseTypeQuery input)
188− (QApp (qConst "Record") (QRow (List.fromFoldable [ Tuple (Identifier "record'''") (qConst "Int")])))
247+ (QApp (qConst "Record") (QRow (List.fromFoldable [ Tuple (Identifier "record'''") (qConst "Int") ])))
190− test "test #31" do
249+ it "test #31" do
191 let input = "(row''' :: Int)"
250 let input = "(row''' :: Int)"
192 assertRight (parseTypeQuery input)
251 assertRight (parseTypeQuery input)
193− (QRow (List.fromFoldable [ Tuple (Identifier "row'''") (qConst "Int")]))
252+ (QRow (List.fromFoldable [ Tuple (Identifier "row'''") (qConst "Int") ]))
195− test "test #32" do
254+ it "test #32" do
196 let input = "(row1 :: Int, row2 :: (),row3::(row4::{}))"
255 let input = "(row1 :: Int, row2 :: (),row3::(row4::{}))"
197 assertRight (parseTypeQuery input)
256 assertRight (parseTypeQuery input)
198− (QRow (l [ Tuple (Identifier "row1") (qConst "Int")
259+ [ Tuple (Identifier "row1") (qConst "Int")
199− , Tuple (Identifier "row2") (QRow Nil)
260+ , Tuple (Identifier "row2") (QRow Nil)
200− , Tuple (Identifier "row3") (QRow (l [ Tuple (Identifier "row4") (QApp (qConst "Record") (QRow Nil)) ])) ]))
261+ , Tuple (Identifier "row3") (QRow (l [ Tuple (Identifier "row4") (QApp (qConst "Record") (QRow Nil)) ]))
202− test "test #33" do
266+ it "test #33" do
203 let input = "Foldable1 t => Apply f => t (f a) -> f Unit"
267 let input = "Foldable1 t => Apply f => t (f a) -> f Unit"
204 assertRight (parseTypeQuery input)
268 assertRight (parseTypeQuery input)
205 (qConstraint "Foldable1" ((qVar "t") : Nil) (qConstraint "Apply" ((qVar "f") : Nil) (QFun (QApp (qVar "t") (QApp (qVar "f") (qVar "a"))) (QApp (qVar "f") (qConst "Unit")))))
269 (qConstraint "Foldable1" ((qVar "t") : Nil) (qConstraint "Apply" ((qVar "f") : Nil) (QFun (QApp (qVar "t") (QApp (qVar "f") (qVar "a"))) (QApp (qVar "f") (qConst "Unit")))))
207− test "test #34" do
271+ it "test #34" do
208 let input = "Foldable1 t => Apply f => t (f a) -> f a"
272 let input = "Foldable1 t => Apply f => t (f a) -> f a"
209 assertRight (parseTypeQuery input)
273 assertRight (parseTypeQuery input)
210 (qConstraint "Foldable1" ((qVar "t") : Nil) (qConstraint "Apply" ((qVar "f") : Nil) (QFun (QApp (qVar "t") (QApp (qVar "f") (qVar "a"))) (QApp (qVar "f") (qVar "a")))))
274 (qConstraint "Foldable1" ((qVar "t") : Nil) (qConstraint "Apply" ((qVar "f") : Nil) (QFun (QApp (qVar "t") (QApp (qVar "f") (qVar "a"))) (QApp (qVar "f") (qVar "a")))))
212− test "test #35" do
276+ it "test #35" do
213 let input = "Generic a rep => GenericEq rep => a -> a -> Boolean"
277 let input = "Generic a rep => GenericEq rep => a -> a -> Boolean"
214 assertRight (parseTypeQuery input)
278 assertRight (parseTypeQuery input)
215− (qConstraint "Generic" ((qVar "a") : (qVar "rep") : Nil)
279+ ( qConstraint "Generic" ((qVar "a") : (qVar "rep") : Nil)
216− (qConstraint "GenericEq" ((qVar "rep") : Nil)
280+ ( qConstraint "GenericEq" ((qVar "rep") : Nil)
217− (QFun (qVar "a") (QFun (qVar "a") (qConst "Boolean")))))
281+ (QFun (qVar "a") (QFun (qVar "a") (qConst "Boolean")))
219− suite "polish notation" do
285+ describe "polish notation" do
221− test "test #1" do
287+ it "test #1" do
222 let input = "(a -> b) -> (b -> ((a -> b) -> c))"
288 let input = "(a -> b) -> (b -> ((a -> b) -> c))"
223 assertRight (shapeOfTypeQuery <$> parseTypeQuery input)
289 assertRight (shapeOfTypeQuery <$> parseTypeQuery input)
224− (l [ PForAll 3, PFun, PFun, PVar, PVar, PFun, PVar, PFun, PFun
290+ ( l
225− , PVar, PVar, PVar ])
300+ , PVar
227− test "test #2" do
306+ it "test #2" do
228 let input = "forall a. (a -> b) -> (b -> ((a -> b) -> c))"
307 let input = "forall a. (a -> b) -> (b -> ((a -> b) -> c))"
229 assertRight (shapeOfTypeQuery <$> parseTypeQuery input)
308 assertRight (shapeOfTypeQuery <$> parseTypeQuery input)
230− (l [ PForAll 3, PFun, PFun, PVar, PVar, PFun, PVar, PFun, PFun
309+ ( l
231− , PVar, PVar, PVar ])
319+ , PVar
233− test "test #3" do
325+ it "test #3" do
234 let input = "forall a. (a -> b) -> (b -> ((a -> b) -> c))"
326 let input = "forall a. (a -> b) -> (b -> ((a -> b) -> c))"
235 assertRight (shapeOfTypeQuery <$> parseTypeQuery input)
327 assertRight (shapeOfTypeQuery <$> parseTypeQuery input)
236− (l [ PForAll 3, PFun, PFun, PVar, PVar, PFun, PVar, PFun, PFun
328+ ( l
237− , PVar, PVar, PVar ])
338+ , PVar
239− test "test #4" do
344+ it "test #4" do
240 let input = "forall a. (forall h. ST h (STArray h a)) -> Array a"
345 let input = "forall a. (forall h. ST h (STArray h a)) -> Array a"
241 assertRight (shapeOfTypeQuery <$> parseTypeQuery input)
346 assertRight (shapeOfTypeQuery <$> parseTypeQuery input)
242− (l [ PForAll 1, PFun, PForAll 1, PApp, PApp, PVar, PVar, PApp, PApp, PVar, PVar, PVar, PApp, PVar, PVar ])
347+ (l [ PForAll 1, PFun, PForAll 1, PApp, PApp, PVar, PVar, PApp, PApp, PVar, PVar, PVar, PApp, PVar, PVar ])
244− suite "type shapes" do
349+ describe "type shapes" do
245− test "test #1" do
350+ it "test #1" do
246− let query = "Generic a rep => GenericEq rep => a -> a -> Boolean"
352+ query = "Generic a rep => GenericEq rep => a -> a -> Boolean"
247− c1 = constr (qname [""] "Generic") [TypeVar "a", TypeVar "rep"]
353+ c1 = constr (qname [ "" ] "Generic") [ TypeVar "a", TypeVar "rep" ]
248− c2 = constr (qname [""] "GenericEq") [TypeVar "rep"]
354+ c2 = constr (qname [ "" ] "GenericEq") [ TypeVar "rep" ]
250− fun t1 t2 =
356+ fun t1 t2 =
251− TypeApp (TypeApp (TypeConstructor (QualifiedName { moduleNameParts: ["Prim"]
361+ { moduleNameParts: [ "Prim" ]
252− , name: Identifier "Function" })) t1) t2
362+ , name: Identifier "Function"
254− ForAll "a" Nothing $
370+ ForAll "a" Nothing
255− ForAll "rep" Nothing $
371+ $ ForAll "rep" Nothing
256− ConstrainedType c1
373+ ConstrainedType c1
257− (ConstrainedType c2
374+ ( ConstrainedType c2
258− (fun (TypeVar "a") (fun (TypeVar "b")
375+ ( fun (TypeVar "a")
259− (TypeConstructor $ qname ["Prim", "Boolean"] "Boolean"))))
377+ (TypeConstructor $ qname [ "Prim", "Boolean" ] "Boolean")
260− shape = shapeOfTypeQuery <$> parseTypeQuery query
381+ shape = shapeOfTypeQuery <$> parseTypeQuery query
261− Assert.equal (pure $ shapeOfType type_) shape
382+ pure (shapeOfType type_) `shouldEqual` shape
263− suite "free variable counting" do
384+ describe "free variable counting" do
265− test "test #1" do
386+ it "test #1" do
266 let input = "forall a. (a -> b) -> (b -> ((a -> b) -> c))"
387 let input = "forall a. (a -> b) -> (b -> ((a -> b) -> c))"
267 assertRight (countFreeVars <$> parseTypeQuery input) 2
388 assertRight (countFreeVars <$> parseTypeQuery input) 2
269− test "test #2" do
390+ it "test #2" do
270 -- `b` is not bound on the left, `a` is not bound on the right
391 -- `b` is not bound on the left, `a` is not bound on the right
271 let input = "(forall a. (a -> b)) -> forall b. (b -> a)"
392 let input = "(forall a. (a -> b)) -> forall b. (b -> a)"
272 assertRight (countFreeVars <$> parseTypeQuery input) 2
393 assertRight (countFreeVars <$> parseTypeQuery input) 2
274− test "test #3" do
395+ it "test #3" do
275 let input = "a -> forall a. a"
396 let input = "a -> forall a. a"
276 assertRight (countFreeVars <$> parseTypeQuery input) 1
397 assertRight (countFreeVars <$> parseTypeQuery input) 1
278− test "test #4" do
399+ it "test #4" do
279 let input = "(forall a. a) -> a"
400 let input = "(forall a. a) -> a"
280 assertRight (countFreeVars <$> parseTypeQuery input) 1
401 assertRight (countFreeVars <$> parseTypeQuery input) 1
282− test "test #5" do
403+ it "test #5" do
283 let input = "forall a. a -> a"
404 let input = "forall a. a -> a"
284 assertRight (countFreeVars <$> parseTypeQuery input) 0
405 assertRight (countFreeVars <$> parseTypeQuery input) 0
286− test "test #6" do
407+ it "test #6" do
287 let input = "a -> b -> c"
408 let input = "a -> b -> c"
288 assertRight (countFreeVars <$> parseTypeQuery input) 3
409 assertRight (countFreeVars <$> parseTypeQuery input) 3
290− test "test #7" do
411+ it "test #7" do
291 let input = "forall m a. Monad m => a -> m a"
412 let input = "forall m a. Monad m => a -> m a"
292 assertRight (countFreeVars <$> parseTypeQuery input) 0
413 assertRight (countFreeVars <$> parseTypeQuery input) 0
294− test "test #8" do
415+ it "test #8" do
295 let input = "Monad m => a -> m a"
416 let input = "Monad m => a -> m a"
296 assertRight (countFreeVars <$> parseTypeQuery input) 2
417 assertRight (countFreeVars <$> parseTypeQuery input) 2
298− test "test #9" do
419+ it "test #9" do
299 let input = "Monad m => a -> a"
420 let input = "Monad m => a -> a"
300 assertRight (countFreeVars <$> parseTypeQuery input) 2
421 assertRight (countFreeVars <$> parseTypeQuery input) 2
302− test "test #10" do
423+ it "test #10" do
303 let input = "forall a. (forall a. a) a"
424 let input = "forall a. (forall a. a) a"
304 assertRight (countFreeVars <$> parseTypeQuery input) 0
425 assertRight (countFreeVars <$> parseTypeQuery input) 0
306− test "test #11" do
427+ it "test #11" do
307 let input = "forall a. (forall b. a) a"
428 let input = "forall a. (forall b. a) a"
308 assertRight (countFreeVars <$> parseTypeQuery input) 0
429 assertRight (countFreeVars <$> parseTypeQuery input) 0
310− test "test #12" do
431+ it "test #12" do
311 let input = "forall a. (forall b. a) a b"
432 let input = "forall a. (forall b. a) a b"
312 assertRight (countFreeVars <$> parseTypeQuery input) 1
433 assertRight (countFreeVars <$> parseTypeQuery input) 1
314− suite "typeVarPenalty" do
435+ describe "typeVarPenalty" do
316− test "#0" do
437+ it "#0" do
317− Assert.equal 0 (typeVarPenalty mempty)
438+ 0 `shouldEqual` (typeVarPenalty mempty)
319− test "#1" do
440+ it "#1" do
320− Assert.equal 0 (typeVarPenalty $ l [ substitute "a" "b"
442+ ( typeVarPenalty $ l
443+ [ substitute "a" "b"
321− , substitute "b" "a"
444+ , substitute "b" "a"
324− test "#2" do
448+ it "#2" do
325− Assert.equal 0 (typeVarPenalty $ l [ substitute "a" "b"
450+ ( typeVarPenalty $ l
451+ [ substitute "a" "b"
326− , substitute "a" "b"
452+ , substitute "a" "b"
327− , substitute "a" "b"
453+ , substitute "a" "b"
330− test "#3" do
457+ it "#3" do
331− Assert.equal 1 (typeVarPenalty $ l [ substitute "a" "b"
459+ ( typeVarPenalty $ l
460+ [ substitute "a" "b"
332− , substitute "a" "c"
461+ , substitute "a" "c"
335− test "#4" do
465+ it "#4" do
336− Assert.equal 1 (typeVarPenalty $ l [ substitute "a" "b"
467+ ( typeVarPenalty $ l
468+ [ substitute "a" "b"
337− , substitute "b" "a"
469+ , substitute "b" "a"
338− , substitute "b" "c"
470+ , substitute "b" "c"
341− test "#5" do
474+ it "#5" do
342− Assert.equal 0 (typeVarPenalty $ l [ substitute "a" "b"
476+ ( typeVarPenalty $ l
477+ [ substitute "a" "b"
343− , substitute "b" "c"
478+ , substitute "b" "c"
344− , substitute "c" "a"
479+ , substitute "c" "a"
347− test "#6" do
483+ it "#6" do
348− Assert.equal 2 (typeVarPenalty $ l [ substitute "a" "b"
485+ ( typeVarPenalty $ l
486+ [ substitute "a" "b"
349− , substitute "a" "c"
487+ , substitute "a" "c"
350− , substitute "a" "a"
488+ , substitute "a" "a"
353− test "#7" do
492+ it "#7" do
354− Assert.equal 2 (typeVarPenalty $ l [ substitute "a" "a"
494+ ( typeVarPenalty $ l
495+ [ substitute "a" "a"
355− , substitute "b" "a"
496+ , substitute "b" "a"
356− , substitute "c" "a"
497+ , substitute "c" "a"
359− test "#8" do
501+ it "#8" do
360− Assert.equal 4 (typeVarPenalty $ l [ substitute "a" "a"
503+ ( typeVarPenalty $ l
504+ [ substitute "a" "a"
361− , substitute "b" "a"
505+ , substitute "b" "a"
362− , substitute "c" "a"
506+ , substitute "c" "a"
363− , substitute "a" "b"
507+ , substitute "a" "b"
364− , substitute "a" "c"
508+ , substitute "a" "c"
365− , substitute "a" "a"
509+ , substitute "a" "a"
368− test "#9" do
513+ it "#9" do
369− Assert.equal 0 (typeVarPenalty $ l [ substitute "a" "e"
515+ ( typeVarPenalty $ l
516+ [ substitute "a" "e"
370− , substitute "b" "d"
517+ , substitute "b" "d"
371− , substitute "c" "f"
518+ , substitute "c" "f"
374− suite "unification" do
522+ describe "unification" do
375− test "instantiation #0" do
523+ it "instantiation #0" do
376− let mVarQuery = qVar "m"
525+ mVarQuery = qVar "m"
377− unitConstQuery = qConst "Unit"
526+ unitConstQuery = qConst "Unit"
379− Assert.assert "instantiation #0" $
528+ shouldSatisfy
380− (penalty unitConstQuery unitType < penalty mVarQuery unitType)
529+ (penalty unitConstQuery unitType)
381−
530+ (_ < penalty mVarQuery unitType)
382− test "generalization #0" do
532+ it "generalization #0" do
383− let query = qVar "m"
534+ query = qVar "m"
384− t1 = TypeVar "m"
535+ t1 = TypeVar "m"
386− Assert.assert "qeneralization #0" $
537+ shouldSatisfy
387− (penalty query unitType > penalty query t1)
538+ (penalty query unitType)
388−
539+ (_ > penalty query t1)
390l :: forall f. Foldable f => (forall a. f a -> List a)
541l :: forall f. Foldable f => (forall a. f a -> List a)
391l = List.fromFoldable
542l = List.fromFoldable
394 :: forall t
545 :: forall t
395− . Foldable t
546+ . Foldable t
396 => Functor t
547 => Functor t
397 => String
548 => String
398 -> t String
549 -> t String
@@ -400,9 +551,12 @@ nl
400nl x rst = NonEmptyList.cons' (Identifier x) $ List.fromFoldable (rst <#> Identifier)
551nl x rst = NonEmptyList.cons' (Identifier x) $ List.fromFoldable (rst <#> Identifier)
402unitType :: Type
553unitType :: Type
403−unitType = TypeConstructor (QualifiedName { moduleNameParts: []
554+unitType = TypeConstructor
556+ { moduleNameParts: []
404− , name: Identifier "Unit"
557+ , name: Identifier "Unit"
407countFreeVars :: TypeQuery -> Int
561countFreeVars :: TypeQuery -> Int
408countFreeVars = getFreeVariables >>> Set.size
562countFreeVars = getFreeVariables >>> Set.size