on 5fbc042 help sign in
elk/elm/src/Types/Hints.hs
259 lines 11 kB history raw
2module Types.Hints (hints) where
4import Control.Monad (liftM,mapM)
5import Control.Arrow (first)
6import Types
7import Types.Substitutions (rescheme)
10-------- Text and Elements --------
12str2elem = hasType (string ==> element) [ "plainText" ]
14textToText = [ "header", "italic", "bold", "underline"
15 , "overline", "strikeThrough", "monospace" ]
17textAttrs = [ "toText" -: string ==> text
18 --, "link" -: string ==> text ==> text
19 , numScheme (\t -> t ==> text ==> text) "Text.height"
20 ] ++ hasType (text ==> text) textToText
22elements = let iee = int ==> element ==> element in
23 [ "flow" -: direction ==> listOf element ==> element
24 , "layers" -: listOf element ==> element
25 , "text" -: text ==> element
26 , "image" -: int ==> int ==> string ==> element
27 , "video" -: int ==> int ==> string ==> element
28 , "opacity" -: float ==> element ==> element
29 , "width" -: iee
30 , "height" -: iee
31 , "size" -: int ==> iee
32 , "color" -: color ==> element ==> element
33 , "box" -: iee
34 , "rectangle" -: int ==> int ==> element
35 , "rightedText" -: text ==> element
36 , "centeredText" -: text ==> element
37 , "justifiedText" -: text ==> element
38 , "asText" -:: a ==> element
39 , "show" -:: a ==> text
40 , "collage" -: int ==> int ==> listOf form ==> element
41 ]
43directions = hasType direction ["up","down","left","right","inward","outward"]
44colors = [ numScheme (\n -> n ==> n ==> n ==> color) "rgb"
45 , numScheme (\n -> n ==> n ==> n ==> n ==> color) "rgba"
46 ] ++ hasType color ["red","green","blue","black","white"
47 ,"yellow","cyan","magenta","grey","gray"]
49lineTypes = [ numScheme (\n -> listOf (pairOf n) ==> line) "line"
50 , "customLine" -: listOf int ==> color ==> line ==> form
51 ] ++ hasType (color ==> line ==> form) ["solid","dashed","dotted"]
53shapes = [ twoNums (\n m -> listOf (pairOf n) ==> pairOf m ==> shape) "polygon"
54 , "filled" -: color ==> shape ==> form
55 , "outlined" -: color ==> shape ==> form
56 , "customOutline" -: listOf int ==> color ==> shape ==> form
57 , numScheme (\n -> n ==> n ==> form ==> form) "move"
58 , numScheme (\n -> n ==> form ==> form) "rotate"
59 , numScheme (\n -> n ==> form ==> form) "scale"
60 ] ++ map (twoNums (\n m -> n ==> n ==> pairOf m ==> shape)) [ "ngon"
61 , "rect"
62 , "oval" ]
65-------- Foreign --------
67casts =
68 [ "castJSBoolToBool" -: jsBool ==> bool
69 , "castBoolToJSBool" -: bool ==> jsBool
70 , "castJSNumberToInt" -: jsNumber ==> int
71 , "castIntToJSNumber" -: int ==> jsNumber
72 , "castJSElementToElement" -: int ==> int ==> jsElement ==> element
73 , "castElementToJSElement" -: element ==> jsElement
74 , "castJSStringToString" -: jsString ==> string
75 , "castStringToJSString" -: string ==> jsString
76 , "castJSNumberToFloat" -: jsNumber ==> float
77 , "castFloatToJSNumber" -: float ==> jsNumber
78 ]
80castToTuple n = (,) name $ Forall [1..n] [] (jsTuple vs ==> tupleOf vs)
81 where vs = map VarT [1..n]
82 name = "castJSTupleToTuple" ++ show n
83castToJSTuple n = (,) name $ Forall [1..n] [] (tupleOf vs ==> jsTuple vs)
84 where vs = map VarT [1..n]
85 name = "castTupleToJSTuple" ++ show n
87polyCasts =
88 map castToTuple [2..5] ++ map castToJSTuple [2..5] ++
89 [ "castJSArrayToList" -:: jsArray a ==> listOf a
90 , "castListToJSArray" -:: listOf a ==> jsArray a
91 ]
93json =
94 [ "JsonString" -: string ==> jsonValue
95 , "JsonBool" -: bool ==> jsonValue
96 , "JsonNull" -: jsonValue
97 , "JsonArray" -: listOf jsonValue ==> jsonValue
98 , "JsonObject" -: jsonObject ==> jsonValue
99 , numScheme (\n -> n ==> jsonValue) "JsonNumber"
100 , "toPrettyString" -: string ==> jsonObject ==> string
101 , "toPrettyJSString" -: string ==> jsonObject ==> jsString
102 , "toJSString" -: jsonObject ==> jsString
103 ]
106-------- Signals --------
108sig n name = (,) name $ Forall [1..n] [] (fn ts ==> fn (map signalOf ts))
109 where fn = foldr1 (==>)
110 ts = map VarT [1..n]
112signals =
113 [ sig 1 "constant"
114 , sig 2 "lift"
115 , sig 3 "lift2"
116 , sig 4 "lift3"
117 , sig 5 "lift4"
118 , "foldp" -:: (a ==> b ==> b) ==> b ==> signalOf a ==> signalOf b
119 , "randomize" -:: int ==> int ==> signalOf a ==> signalOf int
120 , "count" -:: signalOf a ==> signalOf int
121 , "keepIf" -:: (a==>bool) ==> a ==> signalOf a ==> signalOf a
122 , "dropIf" -:: (a==>bool) ==> a ==> signalOf a ==> signalOf a
123 , "keepWhen" -:: signalOf bool ==>a==> signalOf a ==> signalOf a
124 , "dropWhen" -:: signalOf bool ==>a==> signalOf a ==> signalOf a
125 , "dropRepeats" -:: signalOf a ==> signalOf a
126 , "sampleOn" -:: signalOf a ==> signalOf b ==> signalOf b
127 ]
129concreteSignals =
130 [ "keysDown" -: signalOf (listOf int)
131 , "charPressed" -: signalOf (maybeOf int)
132 , "inRange" -: int ==> int ==> signalOf int
133 , timeScheme "every" (\t -> t ==> signalOf t)
134 , timeScheme "before" (\t -> t ==> signalOf bool)
135 , timeScheme "after" (\t -> t ==> signalOf bool)
136 , "dimensions" -: signalOf point
137 , "position" -: signalOf point
138 , "x" -: signalOf int
139 , "y" -: signalOf int
140 , "isDown" -: signalOf bool
141 , "isClicked" -: signalOf bool
142 , "textField" -: string ==> tupleOf [element, signalOf string]
143 , "password" -: string ==> tupleOf [element, signalOf string]
144 , "textArea" -: int ==> int ==> tupleOf [element, signalOf string]
145 , "checkBox" -: bool ==> tupleOf [element, signalOf bool]
146 , "button" -: string ==> tupleOf [element, signalOf bool]
147 , "stringDropDown" -: listOf string ==> tupleOf [element, signalOf string]
148 ]
150-------- Math and Binops --------
152binop t = t ==> t ==> t
153scheme1 super t name =
154 (name, Forall [0] [ Context ("`" ++ name ++ "'") $ VarT 0 :<: super
155 ] (t (VarT 0)))
156scheme2 s1 s2 t name =
157 (name, Forall [0,1] [ Context ("`" ++ name ++ "'") $ VarT 0 :<: s1
158 , Context ("`" ++ name ++ "'") $ VarT 1 :<: s2
159 ] (t (VarT 0) (VarT 1)))
160numScheme t name = scheme1 number t name
161timeScheme name t = scheme1 time t name
162twoNums f name = scheme2 number number f name
164math =
165 map (numScheme (\t -> t ==> binop t)) ["clamp"] ++
166 map (numScheme (\t -> binop t)) ["+","-","*","max","min"] ++
167 [ numScheme (\t -> t ==> t) "abs" ] ++
168 hasType (binop float) [ "/", "logBase" ] ++
169 hasType (binop int) ["rem","div","mod"] ++
170 hasType (float ==> float) ["sin","cos","tan","asin","acos","atan","sqrt"] ++
171 hasType float ["pi","e"] ++
172 hasType (int ==> float) ["toFloat","castIntToFloat"] ++
173 hasType (float ==> int) ["round","floor","ceiling","truncate"]
175bools =
176 [ "not" -: bool ==> bool ] ++
177 hasType (binop bool) ["&&","||"] ++
178 map (scheme1 comparable (\t -> t ==> t ==> bool)) ["<",">","<=",">="] ++
179 [ ( "compare"
180 , Forall [0,1] [ Context "`compare'" $ VarT 0 :<: comparable ] (VarT 0 ==> VarT 0 ==> VarT 1) )
181 ]
183-------- Polymorphic Functions --------
185[a,b,c] = map VarT [1,2,3]
187infix 8 -::
188name -:: tipe = (name, Forall [1,2,3] [] tipe)
190funcs =
191 [ "id" -:: a ==> a
192 , "==" -:: a ==> a ==> bool
193 , "/=" -:: a ==> a ==> bool
194 , "flip" -:: (a ==> b ==> c) ==> (b ==> a ==> c)
195 , "." -:: (b ==> c) ==> (a ==> b) ==> (a ==> c)
196 , "$" -:: (a ==> b) ==> a ==> b
197 , ":" -:: a ==> listOf a ==> listOf a
198 , (,) "++" . Forall [0,1] [ Context "`++'" $ VarT 0 :<: appendable (VarT 1) ] $ VarT 0 ==> VarT 0 ==> VarT 0
199 , "Cons" -:: a ==> listOf a ==> listOf a
200 , "Nil" -:: listOf a
201 , "Just" -:: a ==> maybeOf a
202 , "Nothing" -:: maybeOf a
203 , "curry" -:: (tupleOf [a,b] ==> c) ==> a ==> b ==> c
204 , "uncurry" -:: (a ==> b ==> c) ==> tupleOf [a,b] ==> c
205 ] ++ map tuple [0..8]
207tuple n = ("Tuple" ++ show n, Forall [1..n] [] $ foldr (==>) (tupleOf vs) vs)
208 where vs = map VarT [1..n]
210lists =
211 [ "and" -:: listOf bool ==> bool
212 , "or" -:: listOf bool ==> bool
213 , numScheme (\n -> listOf n ==> listOf n) "sort"
214 , "head" -:: listOf a ==> a
215 , "tail" -:: listOf a ==> listOf a
216 , "length" -:: listOf a ==> int
217 , "filter" -:: (a ==> bool) ==> listOf a ==> listOf a
218 , "foldr1" -:: (a ==> a ==> a) ==> listOf a ==> a
219 , "foldl1" -:: (a ==> a ==> a) ==> listOf a ==> a
220 , "scanl1" -:: (a ==> a ==> a) ==> listOf a ==> a
221 , "forall" -:: (a ==> bool) ==> listOf a ==> bool
222 , "exists" -:: (a ==> bool) ==> listOf a ==> bool
223 , "reverse" -:: listOf a ==> listOf a
224 , "take" -:: int ==> listOf a ==> listOf a
225 , "drop" -:: int ==> listOf a ==> listOf a
226 , "partition" -:: (a ==> bool) ==> listOf a ==> tupleOf [listOf a,listOf a]
227 , "intersperse" -:: a ==> listOf a ==> listOf a
228 , "zip" -:: listOf a ==>listOf b ==>listOf(tupleOf [a,b])
229 , "map" -:: (a ==> b) ==> listOf a ==> listOf b
230 , "foldr" -:: (a ==> b ==> b) ==> b ==> listOf a ==> b
231 , "foldl" -:: (a ==> b ==> b) ==> b ==> listOf a ==> b
232 , "scanl" -:: (a ==> b ==> b) ==> b ==> listOf a ==> listOf b
233 , (,) "concat" . Forall [0,1] [ Context "`concat'" $ VarT 0 :<: appendable (VarT 1) ] $
234 listOf (VarT 0) ==> VarT 0
235 , (,) "concatMap" . Forall [0,1,2] [ Context "`concatMap'" $ VarT 0 :<: appendable (VarT 1) ] $
236 (VarT 2 ==> VarT 0) ==> listOf (VarT 2) ==> VarT 0
237 , (,) "intercalate" . Forall [0,1] [ Context "`intercalate'" $ VarT 0 :<: appendable (VarT 1) ] $
238 VarT 0 ==> listOf (VarT 0) ==> VarT 0
239 , "zipWith" -:: (a ==> b ==> c) ==> listOf a ==> listOf b ==> listOf c
240 ] ++ map (numScheme (\n -> listOf n ==> n)) [ "sum", "product"
241 , "maximum", "minimum" ]
243maybeFuncs =
244 [ "maybe" -:: b ==> (a ==> b) ==> maybeOf a ==> b
245 , "isJust" -:: maybeOf a ==> bool
246 , "isNothing" -:: maybeOf a ==> bool
247 , "fromMaybe" -:: a ==> maybeOf a ==> a
248 , "consMaybe" -:: maybeOf a ==> listOf a ==> listOf a
249 , "catMaybes" -:: listOf (maybeOf a) ==> listOf a
250 , "catMaybes" -:: (a ==> maybeOf b) ==> listOf a ==> listOf b
251 ]
253-------- Everything --------
255hints = mapM (\(n,s) -> (,) n `liftM` rescheme s) hs
256 where hs = concat [ funcs, lists, signals, math, bools, str2elem, textAttrs
257 , elements, directions, colors, lineTypes, shapes
258 , concreteSignals, casts, polyCasts, json, maybeFuncs
259 ]