@@ -16,126 +16,130 @@ textToText = [ "header", "italic", "bold", "underline"
17textAttrs = [ "toText" -: string ==> text
17textAttrs = [ "toText" -: string ==> text
18 , "link" -: string ==> text ==> text
18 , "link" -: string ==> text ==> text
19− , "Text.height" -: IntT ==> text ==> text
19+ , "Text.height" -: int ==> text ==> text
20 ] ++ hasType (text ==> text) textToText
20 ] ++ hasType (text ==> text) textToText
22−elements = let iee = IntT ==> element ==> element in
22+elements = let iee = int ==> element ==> element in
23 [ "flow" -: direction ==> listOf element ==> element
23 [ "flow" -: direction ==> listOf element ==> element
24 , "layers" -: listOf element ==> element
24 , "layers" -: listOf element ==> element
25 , "text" -: text ==> element
25 , "text" -: text ==> element
26 , "opacity" -: iee
26 , "opacity" -: iee
27 , "width" -: iee
27 , "width" -: iee
28 , "height" -: iee
28 , "height" -: iee
29− , "size" -: IntT ==> iee
29+ , "size" -: int ==> iee
30 , "box" -: iee
30 , "box" -: iee
31 , "centeredText" -: text ==> element
31 , "centeredText" -: text ==> element
32 , "justifiedText" -: text ==> element
32 , "justifiedText" -: text ==> element
33− , "collage" -: IntT ==> IntT ==> listOf form ==> element
33+ , "collage" -: int ==> int ==> listOf form ==> element
36directions = hasType direction ["up","down","left","right","inward","outward"]
36directions = hasType direction ["up","down","left","right","inward","outward"]
37−colors = [ "rgb" -: IntT ==> IntT ==> IntT ==> color
37+colors = [ "rgb" -: int ==> int ==> int ==> color
38− , "rgba" -: IntT ==> IntT ==> IntT ==> IntT ==> color
38+ , "rgba" -: int ==> int ==> int ==> int ==> color
39 ] ++ hasType color ["red","green","blue","black","white"]
39 ] ++ hasType color ["red","green","blue","black","white"]
41lineTypes = [ "line" -: listOf point ==> line
41lineTypes = [ "line" -: listOf point ==> line
42− , "customLine" -: listOf IntT ==> color ==> line ==> form
42+ , "customLine" -: listOf int ==> color ==> line ==> form
43 ] ++ hasType (color ==> line ==> form) ["solid","dashed","dotted"]
43 ] ++ hasType (color ==> line ==> form) ["solid","dashed","dotted"]
45shapes = [ "polygon" -: listOf point ==> point ==> shape
45shapes = [ "polygon" -: listOf point ==> point ==> shape
46 , "filled" -: color ==> shape ==> form
46 , "filled" -: color ==> shape ==> form
47 , "outlined" -: color ==> shape ==> form
47 , "outlined" -: color ==> shape ==> form
48− , "customOutline" -: listOf IntT ==> color ==> shape ==> form
48+ , "customOutline" -: listOf int ==> color ==> shape ==> form
49− ] ++ hasType (IntT ==> IntT ==> point ==> shape) ["ngon","rect","oval"]
49+ ] ++ hasType (int ==> int ==> point ==> shape) ["ngon","rect","oval"]
52-------- Foreign --------
52-------- Foreign --------
55− [ "castJSBoolToBool" -: jsBool ==> BoolT
55+ [ "castJSBoolToBool" -: jsBool ==> bool
56− , "castBoolToJSBool" -: BoolT ==> jsBool
56+ , "castBoolToJSBool" -: bool ==> jsBool
57− , "castJSNumberToInt" -: jsNumber ==> IntT
57+ , "castJSNumberToInt" -: jsNumber ==> int
58− , "castIntToJSNumber" -: IntT ==> jsNumber
58+ , "castIntToJSNumber" -: int ==> jsNumber
59− , "castJSElementToElement" -: IntT ==> IntT ==> jsElement ==> element
59+ , "castJSElementToElement" -: int ==> int ==> jsElement ==> element
60 , "castElementToJSElement" -: element ==> jsElement
60 , "castElementToJSElement" -: element ==> jsElement
61 , "castJSStringToString" -: jsString ==> string
61 , "castJSStringToString" -: jsString ==> string
62 , "castStringToJSString" -: string ==> jsString
62 , "castStringToJSString" -: string ==> jsString
63− -- , "castJSNumberToFloat -:
63+ , "castJSNumberToFloat" -: jsNumber ==> float
64− -- , "castFloatToJSNumber -:
64+ , "castFloatToJSNumber" -: float ==> jsNumber
67+castToTuple n = (,) name $ Forall [1..n] [] (jsTuple vs ==> tupleOf vs)
68+ where vs = map VarT [1..n]
69+ name = "castJSTupleToTuple" ++ show n
70+castToJSTuple n = (,) name $ Forall [1..n] [] (tupleOf vs ==> jsTuple vs)
71+ where vs = map VarT [1..n]
72+ name = "castTupleToJSTuple" ++ show n
67−polyCasts = sequence
74+polyCasts =
75+ map castToTuple [2..5] ++ map castToJSTuple [2..5] ++
68− [ do a <- var ; "castJSArrayToList" -:: jsArray a ==> listOf a
76+ [ "castJSArrayToList" -:: jsArray a ==> listOf a
69− , do a <- var ; "castListToJSArray" -:: listOf a ==> jsArray a
77+ , "castListToJSArray" -:: listOf a ==> jsArray a
70− , do vs <- vars 2 ; "castTupleToJSTuple2" -:: tupleOf vs ==> jsTuple vs
71− , do vs <- vars 3 ; "castTupleToJSTuple3" -:: tupleOf vs ==> jsTuple vs
72− , do vs <- vars 4 ; "castTupleToJSTuple4" -:: tupleOf vs ==> jsTuple vs
73− , do vs <- vars 5 ; "castTupleToJSTuple5" -:: tupleOf vs ==> jsTuple vs
74− , do vs <- vars 2 ; "castJSTupleToTuple2" -:: jsTuple vs ==> tupleOf vs
75− , do vs <- vars 3 ; "castJSTupleToTuple3" -:: jsTuple vs ==> tupleOf vs
76− , do vs <- vars 4 ; "castJSTupleToTuple4" -:: jsTuple vs ==> tupleOf vs
77− , do vs <- vars 5 ; "castJSTupleToTuple5" -:: jsTuple vs ==> tupleOf vs
81-------- Signals --------
81-------- Signals --------
83−sig ts = fn ts ==> fn (map signalOf ts)
83+sig n name = (,) name $ Forall [1..n] [] (fn ts ==> fn (map signalOf ts))
84 where fn = foldr1 (==>)
84 where fn = foldr1 (==>)
85−
85+ ts = map VarT [1..n]
86−signals = sequence
87+signals =
87− [ do ts <- vars 1 ; "constant" -:: sig ts
88+ [ sig 1 "constant"
88− , do ts <- vars 2 ; "lift" -:: sig ts
89+ , sig 2 "lift"
89− , do ts <- vars 3 ; "lift2" -:: sig ts
90+ , sig 3 "lift2"
90− , do ts <- vars 4 ; "lift3" -:: sig ts
91+ , sig 4 "lift3"
91− , do ts <- vars 5 ; "lift4" -:: sig ts
92+ , sig 5 "lift4"
93− "foldp" -:: (a ==> b ==> b) ==> b ==> signalOf a ==> signalOf b
93+ , "foldp" -:: (a ==> b ==> b) ==> b ==> signalOf a ==> signalOf b
94− , do a <- var ; "randomize" -:: IntT ==> IntT ==> signalOf a ==> signalOf IntT
94+ , "randomize" -:: int ==> int ==> signalOf a ==> signalOf int
95− , do a <- var ; "count" -:: signalOf a ==> signalOf IntT
95+ , "count" -:: signalOf a ==> signalOf int
96− , do a <- var ; "keepIf" -:: (a==>BoolT) ==> a ==> signalOf a ==> signalOf a
96+ , "keepIf" -:: (a==>bool) ==> a ==> signalOf a ==> signalOf a
97− , do a <- var ; "dropIf" -:: (a==>BoolT) ==> a ==> signalOf a ==> signalOf a
97+ , "dropIf" -:: (a==>bool) ==> a ==> signalOf a ==> signalOf a
98− , do a <- var ; "keepWhen" -:: signalOf BoolT ==>a==> signalOf a ==> signalOf a
98+ , "keepWhen" -:: signalOf bool ==>a==> signalOf a ==> signalOf a
99− , do a <- var ; "dropWhen" -:: signalOf BoolT ==>a==> signalOf a ==> signalOf a
99+ , "dropWhen" -:: signalOf bool ==>a==> signalOf a ==> signalOf a
100− , do a <- var ; "dropRepeats" -:: signalOf a ==> signalOf a
100+ , "dropRepeats" -:: signalOf a ==> signalOf a
101− , do [a,b] <- vars 2 ; "sampleOn" -:: signalOf a ==> signalOf b ==> signalOf b
101+ , "sampleOn" -:: signalOf a ==> signalOf b ==> signalOf b
104concreteSignals =
104concreteSignals =
105− [ "keysDown" -: signalOf (listOf IntT)
105+ [ "keysDown" -: signalOf (listOf int)
106− , "charPressed" -: signalOf (maybeOf IntT)
106+ , "charPressed" -: signalOf (maybeOf int)
107− , "inRange" -: IntT ==> IntT ==> signalOf IntT
107+ , "inRange" -: int ==> int ==> signalOf int
108− , "every" -: time ==> signalOf time
108+ , timeScheme "every" (\t -> t ==> signalOf t)
109− , "before" -: time ==> signalOf BoolT
109+ , timeScheme "before" (\t -> t ==> signalOf bool)
110− , "after" -: time ==> signalOf BoolT
110+ , timeScheme "after" (\t -> t ==> signalOf bool)
111 , "dimensions" -: signalOf point
111 , "dimensions" -: signalOf point
112 , "position" -: signalOf point
112 , "position" -: signalOf point
113− , "x" -: signalOf IntT
113+ , "x" -: signalOf int
114− , "y" -: signalOf IntT
114+ , "y" -: signalOf int
115− , "isDown" -: signalOf BoolT
115+ , "isDown" -: signalOf bool
116− , "isClicked" -: signalOf BoolT
116+ , "isClicked" -: signalOf bool
117 , "textField" -: string ==> tupleOf [element, signalOf string]
117 , "textField" -: string ==> tupleOf [element, signalOf string]
118 , "password" -: string ==> tupleOf [element, signalOf string]
118 , "password" -: string ==> tupleOf [element, signalOf string]
119− , "textArea" -: IntT ==> IntT ==> tupleOf [element, signalOf string]
119+ , "textArea" -: int ==> int ==> tupleOf [element, signalOf string]
120− , "checkBox" -: BoolT ==> tupleOf [element, signalOf BoolT]
120+ , "checkBox" -: bool ==> tupleOf [element, signalOf bool]
121− , "button" -: string ==> tupleOf [element, signalOf BoolT]
121+ , "button" -: string ==> tupleOf [element, signalOf bool]
122 , "stringDropDown" -: listOf string ==> tupleOf [element, signalOf string]
122 , "stringDropDown" -: listOf string ==> tupleOf [element, signalOf string]
125-------- Math and Binops --------
125-------- Math and Binops --------
127−iii = IntT ==> IntT ==> IntT
127+binop t = t ==> t ==> t
128−xxb x = x ==> x ==> BoolT
128+numScheme t name = (name, Forall [0] [VarT 0 :<: number] (t (VarT 0)))
129+timeScheme name t = (name, Forall [0] [VarT 0 :<: time] (t (VarT 0)))
131− hasType (IntT ==> iii) ["clamp"] ++
132+ map (numScheme (\t -> t ==> binop t)) ["clamp"] ++
133+ map (numScheme (\t -> binop t)) ["+","-","*","max","min"] ++
134+ [ numScheme (\t -> t ==> t) "abs" ] ++
135+ [ "/" -: binop float ] ++
132− hasType iii ["+", "-", "*", "/","rem","mod","logBase","max","min"] ++
136+ hasType (binop int) ["rem","div","mod","logBase"] ++
133− hasType (IntT ==> IntT) ["sin","cos","tan","asin","acos","atan","sqrt","abs"]
137+ hasType (float ==> float) ["sin","cos","tan","asin","acos","atan","sqrt"]
136− [ "not" -: BoolT ==> BoolT ] ++
140+ [ "not" -: bool ==> bool ] ++
137− hasType (xxb BoolT) ["&&","||"] ++
141+ hasType (binop bool) ["&&","||"] ++
138− hasType (xxb IntT) ["<",">","<=",">="]
142+ hasType (int ==> int ==> bool) ["<",">","<=",">="]
141-------- Polymorphic Functions --------
145-------- Polymorphic Functions --------
@@ -144,62 +148,60 @@ var = VarT `liftM` guid
144vars n = mapM (const var) [1..n]
148vars n = mapM (const var) [1..n]
146infix 8 -::
150infix 8 -::
147−name -:: tipe = return $ name -: tipe
151+name -:: tipe = (name, Forall [1,2,3] [] tipe)
153+[a,b,c] = map VarT [1,2,3]
149−funcs = sequence
155+funcs =
150− [ do a <- var ; "id" -:: a ==> a
156+ [ "id" -:: a ==> a
151− , do a <- var ; "==" -:: a ==> a ==> BoolT
157+ , "==" -:: a ==> a ==> bool
152− , do a <- var ; "/=" -:: a ==> a ==> BoolT
158+ , "/=" -:: a ==> a ==> bool
153− , do [a,b,c] <- vars 3 ; "flip" -:: (a ==> b ==> c) ==> (b ==> a ==> c)
159+ , "flip" -:: (a ==> b ==> c) ==> (b ==> a ==> c)
154− , do [a,b,c] <- vars 3 ; "." -:: (b ==> c) ==> (a ==> b) ==> (a ==> c)
160+ , "." -:: (b ==> c) ==> (a ==> b) ==> (a ==> c)
155− , do [a,b] <- vars 2 ; "$" -:: (a ==> b) ==> a ==> b
161+ , "$" -:: (a ==> b) ==> a ==> b
156− , do a <- var ; ":" -:: a ==> listOf a ==> listOf a
162+ , ":" -:: a ==> listOf a ==> listOf a
157− , do a <- var ; "++" -:: a ==> a ==> a
163+ , "++" -:: a ==> a ==> a
158− , do a <- var ; "Cons" -:: a ==> listOf a ==> listOf a
164+ , "Cons" -:: a ==> listOf a ==> listOf a
159− , do a <- var ; "Nil" -:: listOf a
165+ , "Nil" -:: listOf a
160− , do a <- var ; "Just" -:: a ==> ADT "Maybe" [a]
166+ , "Just" -:: a ==> maybeOf a
161− , do a <- var ; "Nothing" -:: ADT "Maybe" [a]
167+ , "Nothing" -:: maybeOf a
162− , "elmRange" -:: IntT ==> IntT ==> listOf IntT
168+ , "elmRange" -:: int ==> int ==> listOf int
165−ints = map (-: (listOf IntT ==> IntT)) [ "sum","product","maximum","minimum" ]
171+lists =
167−lists = liftM (++ints) . sequence $
168− [ "and" -:: listOf BoolT ==> BoolT
172+ [ "and" -:: listOf bool ==> bool
169− , "or" -:: listOf BoolT ==> BoolT
173+ , "or" -:: listOf bool ==> bool
170− , "sort" -:: listOf IntT ==> listOf IntT
174+ , "sort" -:: listOf int ==> listOf int
171− , do a <- var ; "head" -:: listOf a ==> a
175+ , "head" -:: listOf a ==> a
172− , do a <- var ; "tail" -:: listOf a ==> listOf a
176+ , "tail" -:: listOf a ==> listOf a
173− , do a <- var ; "length" -:: listOf a ==> IntT
177+ , "length" -:: listOf a ==> int
174− , do a <- var ; "filter" -:: (a ==> BoolT) ==> listOf a ==> listOf a
178+ , "filter" -:: (a ==> bool) ==> listOf a ==> listOf a
175− , do a <- var ; "foldr1" -:: (a ==> a ==> a) ==> listOf a ==> a
179+ , "foldr1" -:: (a ==> a ==> a) ==> listOf a ==> a
176− , do a <- var ; "foldl1" -:: (a ==> a ==> a) ==> listOf a ==> a
180+ , "foldl1" -:: (a ==> a ==> a) ==> listOf a ==> a
177− , do a <- var ; "scanl1" -:: (a ==> a ==> a) ==> listOf a ==> a
181+ , "scanl1" -:: (a ==> a ==> a) ==> listOf a ==> a
178− , do a <- var ; "forall" -:: (a ==> BoolT) ==> listOf a ==> BoolT
182+ , "forall" -:: (a ==> bool) ==> listOf a ==> bool
179− , do a <- var ; "exists" -:: (a ==> BoolT) ==> listOf a ==> BoolT
183+ , "exists" -:: (a ==> bool) ==> listOf a ==> bool
180− , do a <- var ; "concat" -:: listOf (listOf a) ==> listOf a
184+ , "concat" -:: listOf (listOf a) ==> listOf a
181− , do a <- var ; "reverse" -:: listOf a ==> listOf a
185+ , "reverse" -:: listOf a ==> listOf a
182− , do a <- var ; "take" -:: IntT ==> listOf a ==> listOf a
186+ , "take" -:: int ==> listOf a ==> listOf a
183− , do a <- var ; "drop" -:: IntT ==> listOf a ==> listOf a
187+ , "drop" -:: int ==> listOf a ==> listOf a
184− , do a <- var ; "partition" -:: (a==>BoolT)==>listOf a==>tupleOf [listOf a,listOf a]
188+ , "partition" -:: (a ==> bool) ==> listOf a ==> tupleOf [listOf a,listOf a]
185− , do a <- var ; "intersperse" -:: a ==> listOf a ==> listOf a
189+ , "intersperse" -:: a ==> listOf a ==> listOf a
186− , do a <- var ; "intercalate" -:: listOf a ==> listOf(listOf a) ==> listOf a
190+ , "intercalate" -:: listOf a ==> listOf(listOf a) ==> listOf a
187− , do [a,b] <- vars 2 ; "zip" -:: listOf a ==>listOf b ==>listOf(tupleOf [a,b])
191+ , "zip" -:: listOf a ==>listOf b ==>listOf(tupleOf [a,b])
188− , do [a,b] <- vars 2 ; "map" -:: (a ==> b) ==> listOf a ==> listOf b
192+ , "map" -:: (a ==> b) ==> listOf a ==> listOf b
189− , do [a,b] <- vars 2 ; "foldr" -:: (a ==> b ==> b) ==> b ==> listOf a ==> b
193+ , "foldr" -:: (a ==> b ==> b) ==> b ==> listOf a ==> b
190− , do [a,b] <- vars 2 ; "foldl" -:: (a ==> b ==> b) ==> b ==> listOf a ==> b
194+ , "foldl" -:: (a ==> b ==> b) ==> b ==> listOf a ==> b
191− , do [a,b] <- vars 2 ; "scanl" -:: (a==>b==>b)==>b==>listOf a==>listOf b
195+ , "scanl" -:: (a ==> b ==> b) ==> b ==> listOf a ==> listOf b
192− , do [a,b] <- vars 2 ; "concatMap" -:: (a==>listOf b)==>listOf a ==> listOf b
196+ , "concatMap" -:: (a ==> listOf b) ==> listOf a ==> listOf b
193− , do [a,b,c] <- vars 3
194− "zipWith" -:: (a ==> b ==> c) ==> listOf a ==> listOf b ==> listOf c
197+ , "zipWith" -:: (a ==> b ==> c) ==> listOf a ==> listOf b ==> listOf c
195− ]
198+ ] ++ map (-: (listOf int ==> int)) [ "sum","product","maximum","minimum" ]
198-------- Everything --------
201-------- Everything --------
200−hints = do
203+hints =
201− fs <- funcs ; ls <- lists ; ss <- signals ; pcasts <- polyCasts
202− return $ concat [ fs, ls, ss, math, bool, str2elem, textAttrs
204+ concat [ funcs, lists, signals, math, bools, str2elem, textAttrs
203− , elements, directions, colors, lineTypes, shapes
205+ , elements, directions, colors, lineTypes, shapes
204− , concreteSignals, casts, pcasts
206+ , concreteSignals, casts, polyCasts