@@ -16,126 +16,130 @@ textToText = [ "header", "italic", "bold", "underline"
1616
1717textAttrs = [ "toText" -: string ==> text
1818 , "link" -: string ==> text ==> text
19− , "Text.height" -: IntT ==> text ==> text
19+ , "Text.height" -: int ==> text ==> text
2020 ] ++ hasType (text ==> text) textToText
2121
22−elements = let iee = IntT ==> element ==> element in
22+elements = let iee = int ==> element ==> element in
2323 [ "flow" -: direction ==> listOf element ==> element
2424 , "layers" -: listOf element ==> element
2525 , "text" -: text ==> element
2626 , "opacity" -: iee
2727 , "width" -: iee
2828 , "height" -: iee
29− , "size" -: IntT ==> iee
29+ , "size" -: int ==> iee
3030 , "box" -: iee
3131 , "centeredText" -: text ==> element
3232 , "justifiedText" -: text ==> element
33− , "collage" -: IntT ==> IntT ==> listOf form ==> element
33+ , "collage" -: int ==> int ==> listOf form ==> element
3434 ]
3535
3636directions = hasType direction ["up","down","left","right","inward","outward"]
37−colors = [ "rgb" -: IntT ==> IntT ==> IntT ==> color
38− , "rgba" -: IntT ==> IntT ==> IntT ==> IntT ==> color
37+colors = [ "rgb" -: int ==> int ==> int ==> color
38+ , "rgba" -: int ==> int ==> int ==> int ==> color
3939 ] ++ hasType color ["red","green","blue","black","white"]
4040
4141lineTypes = [ "line" -: listOf point ==> line
42− , "customLine" -: listOf IntT ==> color ==> line ==> form
42+ , "customLine" -: listOf int ==> color ==> line ==> form
4343 ] ++ hasType (color ==> line ==> form) ["solid","dashed","dotted"]
4444
4545shapes = [ "polygon" -: listOf point ==> point ==> shape
4646 , "filled" -: color ==> shape ==> form
4747 , "outlined" -: color ==> shape ==> form
48− , "customOutline" -: listOf IntT ==> color ==> shape ==> form
49− ] ++ hasType (IntT ==> IntT ==> point ==> shape) ["ngon","rect","oval"]
48+ , "customOutline" -: listOf int ==> color ==> shape ==> form
49+ ] ++ hasType (int ==> int ==> point ==> shape) ["ngon","rect","oval"]
5050
5151
5252-------- Foreign --------
5353
5454casts =
55− [ "castJSBoolToBool" -: jsBool ==> BoolT
56− , "castBoolToJSBool" -: BoolT ==> jsBool
57− , "castJSNumberToInt" -: jsNumber ==> IntT
58− , "castIntToJSNumber" -: IntT ==> jsNumber
59− , "castJSElementToElement" -: IntT ==> IntT ==> jsElement ==> element
55+ [ "castJSBoolToBool" -: jsBool ==> bool
56+ , "castBoolToJSBool" -: bool ==> jsBool
57+ , "castJSNumberToInt" -: jsNumber ==> int
58+ , "castIntToJSNumber" -: int ==> jsNumber
59+ , "castJSElementToElement" -: int ==> int ==> jsElement ==> element
6060 , "castElementToJSElement" -: element ==> jsElement
6161 , "castJSStringToString" -: jsString ==> string
6262 , "castStringToJSString" -: string ==> jsString
63− -- , "castJSNumberToFloat -:
64− -- , "castFloatToJSNumber -:
63+ , "castJSNumberToFloat" -: jsNumber ==> float
64+ , "castFloatToJSNumber" -: float ==> jsNumber
6565 ]
6666
67−polyCasts = sequence
68− [ do a <- var ; "castJSArrayToList" -:: jsArray a ==> listOf a
69− , do a <- var ; "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
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
73+
74+polyCasts =
75+ map castToTuple [2..5] ++ map castToJSTuple [2..5] ++
76+ [ "castJSArrayToList" -:: jsArray a ==> listOf a
77+ , "castListToJSArray" -:: listOf a ==> jsArray a
7878 ]
7979
8080
8181-------- Signals --------
8282
83−sig ts = fn ts ==> fn (map signalOf ts)
83+sig n name = (,) name $ Forall [1..n] [] (fn ts ==> fn (map signalOf ts))
8484 where fn = foldr1 (==>)
85−
86−signals = sequence
87− [ do ts <- vars 1 ; "constant" -:: sig ts
88− , do ts <- vars 2 ; "lift" -:: sig ts
89− , do ts <- vars 3 ; "lift2" -:: sig ts
90− , do ts <- vars 4 ; "lift3" -:: sig ts
91− , do ts <- vars 5 ; "lift4" -:: sig ts
92− , do [a,b] <- vars 2
93− "foldp" -:: (a ==> b ==> b) ==> b ==> signalOf a ==> signalOf b
94− , do a <- var ; "randomize" -:: IntT ==> IntT ==> signalOf a ==> signalOf IntT
95− , do a <- var ; "count" -:: signalOf a ==> signalOf IntT
96− , do a <- var ; "keepIf" -:: (a==>BoolT) ==> a ==> signalOf a ==> signalOf a
97− , do a <- var ; "dropIf" -:: (a==>BoolT) ==> a ==> signalOf a ==> signalOf a
98− , do a <- var ; "keepWhen" -:: signalOf BoolT ==>a==> signalOf a ==> signalOf a
99− , do a <- var ; "dropWhen" -:: signalOf BoolT ==>a==> signalOf a ==> signalOf a
100− , do a <- var ; "dropRepeats" -:: signalOf a ==> signalOf a
101− , do [a,b] <- vars 2 ; "sampleOn" -:: signalOf a ==> signalOf b ==> signalOf b
85+ ts = map VarT [1..n]
86+
87+signals =
88+ [ sig 1 "constant"
89+ , sig 2 "lift"
90+ , sig 3 "lift2"
91+ , sig 4 "lift3"
92+ , sig 5 "lift4"
93+ , "foldp" -:: (a ==> b ==> b) ==> b ==> signalOf a ==> signalOf b
94+ , "randomize" -:: int ==> int ==> signalOf a ==> signalOf int
95+ , "count" -:: signalOf a ==> signalOf int
96+ , "keepIf" -:: (a==>bool) ==> a ==> signalOf a ==> signalOf a
97+ , "dropIf" -:: (a==>bool) ==> a ==> signalOf a ==> signalOf a
98+ , "keepWhen" -:: signalOf bool ==>a==> signalOf a ==> signalOf a
99+ , "dropWhen" -:: signalOf bool ==>a==> signalOf a ==> signalOf a
100+ , "dropRepeats" -:: signalOf a ==> signalOf a
101+ , "sampleOn" -:: signalOf a ==> signalOf b ==> signalOf b
102102 ]
103103
104104concreteSignals =
105− [ "keysDown" -: signalOf (listOf IntT)
106− , "charPressed" -: signalOf (maybeOf IntT)
107− , "inRange" -: IntT ==> IntT ==> signalOf IntT
108− , "every" -: time ==> signalOf time
109− , "before" -: time ==> signalOf BoolT
110− , "after" -: time ==> signalOf BoolT
105+ [ "keysDown" -: signalOf (listOf int)
106+ , "charPressed" -: signalOf (maybeOf int)
107+ , "inRange" -: int ==> int ==> signalOf int
108+ , timeScheme "every" (\t -> t ==> signalOf t)
109+ , timeScheme "before" (\t -> t ==> signalOf bool)
110+ , timeScheme "after" (\t -> t ==> signalOf bool)
111111 , "dimensions" -: signalOf point
112112 , "position" -: signalOf point
113− , "x" -: signalOf IntT
114− , "y" -: signalOf IntT
115− , "isDown" -: signalOf BoolT
116− , "isClicked" -: signalOf BoolT
113+ , "x" -: signalOf int
114+ , "y" -: signalOf int
115+ , "isDown" -: signalOf bool
116+ , "isClicked" -: signalOf bool
117117 , "textField" -: string ==> tupleOf [element, signalOf string]
118118 , "password" -: string ==> tupleOf [element, signalOf string]
119− , "textArea" -: IntT ==> IntT ==> tupleOf [element, signalOf string]
120− , "checkBox" -: BoolT ==> tupleOf [element, signalOf BoolT]
121− , "button" -: string ==> tupleOf [element, signalOf BoolT]
119+ , "textArea" -: int ==> int ==> tupleOf [element, signalOf string]
120+ , "checkBox" -: bool ==> tupleOf [element, signalOf bool]
121+ , "button" -: string ==> tupleOf [element, signalOf bool]
122122 , "stringDropDown" -: listOf string ==> tupleOf [element, signalOf string]
123123 ]
124124
125125-------- Math and Binops --------
126126
127−iii = IntT ==> IntT ==> IntT
128−xxb x = x ==> x ==> BoolT
127+binop t = t ==> t ==> t
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)))
129130
130131math =
131− hasType (IntT ==> iii) ["clamp"] ++
132− hasType iii ["+", "-", "*", "/","rem","mod","logBase","max","min"] ++
133− hasType (IntT ==> IntT) ["sin","cos","tan","asin","acos","atan","sqrt","abs"]
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 ] ++
136+ hasType (binop int) ["rem","div","mod","logBase"] ++
137+ hasType (float ==> float) ["sin","cos","tan","asin","acos","atan","sqrt"]
134138
135−bool =
136− [ "not" -: BoolT ==> BoolT ] ++
137− hasType (xxb BoolT) ["&&","||"] ++
138− hasType (xxb IntT) ["<",">","<=",">="]
139+bools =
140+ [ "not" -: bool ==> bool ] ++
141+ hasType (binop bool) ["&&","||"] ++
142+ hasType (int ==> int ==> bool) ["<",">","<=",">="]
139143
140144
141145-------- Polymorphic Functions --------
@@ -144,62 +148,60 @@ var = VarT `liftM` guid
144148vars n = mapM (const var) [1..n]
145149
146150infix 8 -::
147−name -:: tipe = return $ name -: tipe
148−
149−funcs = sequence
150− [ do a <- var ; "id" -:: a ==> a
151− , do a <- var ; "==" -:: a ==> a ==> BoolT
152− , do a <- var ; "/=" -:: a ==> a ==> BoolT
153− , do [a,b,c] <- vars 3 ; "flip" -:: (a ==> b ==> c) ==> (b ==> a ==> c)
154− , do [a,b,c] <- vars 3 ; "." -:: (b ==> c) ==> (a ==> b) ==> (a ==> c)
155− , do [a,b] <- vars 2 ; "$" -:: (a ==> b) ==> a ==> b
156− , do a <- var ; ":" -:: a ==> listOf a ==> listOf a
157− , do a <- var ; "++" -:: a ==> a ==> a
158− , do a <- var ; "Cons" -:: a ==> listOf a ==> listOf a
159− , do a <- var ; "Nil" -:: listOf a
160− , do a <- var ; "Just" -:: a ==> ADT "Maybe" [a]
161− , do a <- var ; "Nothing" -:: ADT "Maybe" [a]
162− , "elmRange" -:: IntT ==> IntT ==> listOf IntT
151+name -:: tipe = (name, Forall [1,2,3] [] tipe)
152+
153+[a,b,c] = map VarT [1,2,3]
154+
155+funcs =
156+ [ "id" -:: a ==> a
157+ , "==" -:: a ==> a ==> bool
158+ , "/=" -:: a ==> a ==> bool
159+ , "flip" -:: (a ==> b ==> c) ==> (b ==> a ==> c)
160+ , "." -:: (b ==> c) ==> (a ==> b) ==> (a ==> c)
161+ , "$" -:: (a ==> b) ==> a ==> b
162+ , ":" -:: a ==> listOf a ==> listOf a
163+ , "++" -:: a ==> a ==> a
164+ , "Cons" -:: a ==> listOf a ==> listOf a
165+ , "Nil" -:: listOf a
166+ , "Just" -:: a ==> maybeOf a
167+ , "Nothing" -:: maybeOf a
168+ , "elmRange" -:: int ==> int ==> listOf int
163169 ]
164170
165−ints = map (-: (listOf IntT ==> IntT)) [ "sum","product","maximum","minimum" ]
166−
167−lists = liftM (++ints) . sequence $
168− [ "and" -:: listOf BoolT ==> BoolT
169− , "or" -:: listOf BoolT ==> BoolT
170− , "sort" -:: listOf IntT ==> listOf IntT
171− , do a <- var ; "head" -:: listOf a ==> a
172− , do a <- var ; "tail" -:: listOf a ==> listOf a
173− , do a <- var ; "length" -:: listOf a ==> IntT
174− , do a <- var ; "filter" -:: (a ==> BoolT) ==> listOf a ==> listOf a
175− , do a <- var ; "foldr1" -:: (a ==> a ==> a) ==> listOf a ==> a
176− , do a <- var ; "foldl1" -:: (a ==> a ==> a) ==> listOf a ==> a
177− , do a <- var ; "scanl1" -:: (a ==> a ==> a) ==> listOf a ==> a
178− , do a <- var ; "forall" -:: (a ==> BoolT) ==> listOf a ==> BoolT
179− , do a <- var ; "exists" -:: (a ==> BoolT) ==> listOf a ==> BoolT
180− , do a <- var ; "concat" -:: listOf (listOf a) ==> listOf a
181− , do a <- var ; "reverse" -:: listOf a ==> listOf a
182− , do a <- var ; "take" -:: IntT ==> listOf a ==> listOf a
183− , do a <- var ; "drop" -:: IntT ==> listOf a ==> listOf a
184− , do a <- var ; "partition" -:: (a==>BoolT)==>listOf a==>tupleOf [listOf a,listOf a]
185− , do a <- var ; "intersperse" -:: a ==> listOf a ==> listOf a
186− , do a <- var ; "intercalate" -:: listOf a ==> listOf(listOf a) ==> listOf a
187− , do [a,b] <- vars 2 ; "zip" -:: listOf a ==>listOf b ==>listOf(tupleOf [a,b])
188− , do [a,b] <- vars 2 ; "map" -:: (a ==> b) ==> listOf a ==> listOf b
189− , do [a,b] <- vars 2 ; "foldr" -:: (a ==> b ==> b) ==> b ==> listOf a ==> b
190− , do [a,b] <- vars 2 ; "foldl" -:: (a ==> b ==> b) ==> b ==> listOf a ==> b
191− , do [a,b] <- vars 2 ; "scanl" -:: (a==>b==>b)==>b==>listOf a==>listOf b
192− , do [a,b] <- vars 2 ; "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
195− ]
171+lists =
172+ [ "and" -:: listOf bool ==> bool
173+ , "or" -:: listOf bool ==> bool
174+ , "sort" -:: listOf int ==> listOf int
175+ , "head" -:: listOf a ==> a
176+ , "tail" -:: listOf a ==> listOf a
177+ , "length" -:: listOf a ==> int
178+ , "filter" -:: (a ==> bool) ==> listOf a ==> listOf a
179+ , "foldr1" -:: (a ==> a ==> a) ==> listOf a ==> a
180+ , "foldl1" -:: (a ==> a ==> a) ==> listOf a ==> a
181+ , "scanl1" -:: (a ==> a ==> a) ==> listOf a ==> a
182+ , "forall" -:: (a ==> bool) ==> listOf a ==> bool
183+ , "exists" -:: (a ==> bool) ==> listOf a ==> bool
184+ , "concat" -:: listOf (listOf a) ==> listOf a
185+ , "reverse" -:: listOf a ==> listOf a
186+ , "take" -:: int ==> listOf a ==> listOf a
187+ , "drop" -:: int ==> listOf a ==> listOf a
188+ , "partition" -:: (a ==> bool) ==> listOf a ==> tupleOf [listOf a,listOf a]
189+ , "intersperse" -:: a ==> listOf a ==> listOf a
190+ , "intercalate" -:: listOf a ==> listOf(listOf a) ==> listOf a
191+ , "zip" -:: listOf a ==>listOf b ==>listOf(tupleOf [a,b])
192+ , "map" -:: (a ==> b) ==> listOf a ==> listOf b
193+ , "foldr" -:: (a ==> b ==> b) ==> b ==> listOf a ==> b
194+ , "foldl" -:: (a ==> b ==> b) ==> b ==> listOf a ==> b
195+ , "scanl" -:: (a ==> b ==> b) ==> b ==> listOf a ==> listOf b
196+ , "concatMap" -:: (a ==> listOf b) ==> listOf a ==> listOf b
197+ , "zipWith" -:: (a ==> b ==> c) ==> listOf a ==> listOf b ==> listOf c
198+ ] ++ map (-: (listOf int ==> int)) [ "sum","product","maximum","minimum" ]
196199
197200
198201-------- Everything --------
199202
200−hints = do
201− fs <- funcs ; ls <- lists ; ss <- signals ; pcasts <- polyCasts
202− return $ concat [ fs, ls, ss, math, bool, str2elem, textAttrs
203− , elements, directions, colors, lineTypes, shapes
204− , concreteSignals, casts, pcasts
205− ]
203+hints =
204+ concat [ funcs, lists, signals, math, bools, str2elem, textAttrs
205+ , elements, directions, colors, lineTypes, shapes
206+ , concreteSignals, casts, polyCasts
207+ ]