on master help sign in
Add type hints for new libraries, and fix the types of fps and fpsWhen.
83aa5c2evancz
elm/src/Types/Hints.hs+40−15
@@ -168,6 +168,7 @@ signals = prefix "Signal"
168 , "timeOf" -:: signalOf a ==> signalOf time
168 , "timeOf" -:: signalOf a ==> signalOf time
169 , "merge" -:: signalOf a ==> signalOf a ==> signalOf a
169 , "merge" -:: signalOf a ==> signalOf a ==> signalOf a
170 , "merges" -:: listOf (signalOf a) ==> signalOf a
170 , "merges" -:: listOf (signalOf a) ==> signalOf a
171+ , "mergeEither" -:: signalOf a ==> signalOf b ==> signalOf (eitherOf a b)
171 , numScheme (\n -> int ==> signalOf n ==> signalOf float) "average"
172 , numScheme (\n -> int ==> signalOf n ==> signalOf float) "average"
172 ]
173 ]
173
174
@@ -184,9 +185,7 @@ http = prefix "HTTP"
184 response t = ADT "Response" [t]
185 response t = ADT "Response" [t]
185
186
186concreteSignals =
187concreteSignals =
187− [ "Keyboard.Raw.keysDown" -: signalOf (listOf int)
188− , "Keyboard.Raw.charPressed" -: signalOf (maybeOf int)
189− , "Random.inRange" -: int ==> int ==> signalOf int
188+ [ "Random.inRange" -: int ==> int ==> signalOf int
190 , "Random.randomize" -:: int ==> int ==> signalOf a ==> signalOf int
189 , "Random.randomize" -:: int ==> int ==> signalOf a ==> signalOf int
191 , "Window.dimensions" -: signalOf point
190 , "Window.dimensions" -: signalOf point
192 , "Window.width" -: signalOf int
191 , "Window.width" -: signalOf int
@@ -206,10 +205,27 @@ concreteSignals =
206 , "Input.dropDown" -:: listOf (tupleOf [string,a]) ==> tupleOf [element, signalOf a]
205 , "Input.dropDown" -:: listOf (tupleOf [string,a]) ==> tupleOf [element, signalOf a]
207 ]
206 ]
208
207
208+keyboards = prefix "Keyboard"
209+ [ "Raw.keysDown" -: signalOf (listOf int)
210+ , "Raw.charPressed" -: signalOf (maybeOf int)
211+ , "arrows" -: signalOf (recordOf [("x",int),("y",int)]))
212+ , "wasd" -: signalOf (recordOf [("x",int),("y",int)]))
213+ , "ctrl" -: signalOf bool
214+ , "space" -: signalOf bool
215+ , "shift" -: signalOf bool
216+ ]
217+
218+touches = prefix "Touch"
219+ [ "touches" -: signalOf (listOf (recordOf [("x" ,int) ,("y" ,int)
220+ ,("x0",int) ,("y0",int)
221+ ,("t0",time),("id",int)]))
222+ , "taps" -: signalOf (recordOf [("x",int),("y",int)])
223+ ]
224+
209times = prefix "Time"
225times = prefix "Time"
210− [ "fps" -: number ==> signalOf time
226+ [ numScheme (\n -> n ==> signalOf time) "fps"
227+ , numScheme (\n -> n ==> signalOf bool ==> signalOf time) "fpsWhen"
211 , "every" -: time ==> signalOf time
228 , "every" -: time ==> signalOf time
212− , "fpsWhen" -: number ==> signalOf bool ==> signalOf time
213 , "delay" -:: time ==> signalOf a ==> signalOf a
229 , "delay" -:: time ==> signalOf a ==> signalOf a
214 , "since" -:: time ==> signalOf a ==> signalOf bool
230 , "since" -:: time ==> signalOf a ==> signalOf bool
215 , "hour" -: time
231 , "hour" -: time
@@ -303,6 +319,8 @@ funcs =
303 , "Nil" -:: listOf a
319 , "Nil" -:: listOf a
304 , "Just" -:: a ==> maybeOf a
320 , "Just" -:: a ==> maybeOf a
305 , "Nothing" -:: maybeOf a
321 , "Nothing" -:: maybeOf a
322+ , "Left" -:: a ==> eitherOf a b
323+ , "Right" -:: b ==> eitherOf a b
306 , "curry" -:: (tupleOf [a,b] ==> c) ==> a ==> b ==> c
324 , "curry" -:: (tupleOf [a,b] ==> c) ==> a ==> b ==> c
307 , "uncurry" -:: (a ==> b ==> c) ==> tupleOf [a,b] ==> c
325 , "uncurry" -:: (a ==> b ==> c) ==> tupleOf [a,b] ==> c
308 ] ++ map tuple [0..8]
326 ] ++ map tuple [0..8]
@@ -347,10 +365,17 @@ maybeFuncs = prefix "Maybe"
347 [ "maybe" -:: b ==> (a ==> b) ==> maybeOf a ==> b
365 [ "maybe" -:: b ==> (a ==> b) ==> maybeOf a ==> b
348 , "isJust" -:: maybeOf a ==> bool
366 , "isJust" -:: maybeOf a ==> bool
349 , "isNothing" -:: maybeOf a ==> bool
367 , "isNothing" -:: maybeOf a ==> bool
350− , "fromMaybe" -:: a ==> maybeOf a ==> a
368+ , "cons" -:: maybeOf a ==> listOf a ==> listOf a
351− , "consMaybe" -:: maybeOf a ==> listOf a ==> listOf a
369+ , "justs" -:: listOf (maybeOf a) ==> listOf a
370+ ]
371+
372+eithers = prefix "Either"
373+ [ "isLeft" -:: eitherOf a b ==> bool
374+ , "isRight" -:: eitherOf a b ==> bool
375+ , "either" -:: (a ==> c) ==> (b ==> c) ==> eitherOf a b ==> c
352− , "catMaybes" -:: listOf (maybeOf a) ==> listOf a
376+ , "lefts" -:: listOf (eitherOf a b) ==> listOf a
353− , "catMaybes" -:: (a ==> maybeOf b) ==> listOf a ==> listOf b
377+ , "rights" -:: listOf (eitherOf a b) ==> listOf b
378+ , "partition" -:: listOf (eitherOf a b) ==> tupleOf [listOf a,listOf b]
354 ]
379 ]
355
380
356dictionary =
381dictionary =
@@ -410,9 +435,9 @@ automaton =
410
435
411-------- Everything --------
436-------- Everything --------
412
437
413−hints = mapM (\(n,s) -> (,) n `liftM` rescheme s) hs
438+hints = mapM (\(n,s) -> (,) n `liftM` rescheme s) (concat hs)
414− where hs = concat [ funcs, lists, signals, math, bools, textAttrs
439+ where hs = [ funcs, lists, signals, math, bools, textAttrs
415− , graphicsElement, graphicsColor
440+ , graphicsElement, graphicsColor, eithers, keyboards, touches
416− , concreteSignals, javascript, json, maybeFuncs
441+ , concreteSignals, javascript, json, maybeFuncs
417− , http, dictionary, sets, automaton, times, dates
442+ , http, dictionary, sets, automaton, times, dates
418− ]
443+ ]
elm/src/Types/Types.hs+4
@@ -28,6 +28,9 @@ recordT :: [(String,Type)] -> Map.Map String [Type]
28recordT fields =
28recordT fields =
29 foldl (\r (x,t) -> Map.insertWith (++) x [t] r) Map.empty fields
29 foldl (\r (x,t) -> Map.insertWith (++) x [t] r) Map.empty fields
30
30
31+recordOf :: [(String,Type)] -> Type
32+recordOf fields = RecordT (recordT fields) EmptyRecord
33+
31tipe t = ADT t []
34tipe t = ADT t []
32
35
33int = tipe "Int"
36int = tipe "Int"
@@ -58,6 +61,7 @@ listOf t = ADT "List" [t]
58signalOf t = ADT "Signal" [t]
61signalOf t = ADT "Signal" [t]
59tupleOf ts = ADT ("Tuple" ++ show (length ts)) ts
62tupleOf ts = ADT ("Tuple" ++ show (length ts)) ts
60maybeOf t = ADT "Maybe" [t]
63maybeOf t = ADT "Maybe" [t]
64+eitherOf a b = ADT "Maybe" [a,b]
61pairOf t = tupleOf [t,t]
65pairOf t = tupleOf [t,t]
62point = pairOf int
66point = pairOf int
63appendable t = Super (Set.fromList [ string, text, listOf t ])
67appendable t = Super (Set.fromList [ string, text, listOf t ])