on ae6984c help sign in
elk/src/Types/Hints.hs
105 lines 4.0 kB history raw
2module Hints (hints) where
4import Control.Monad (liftM,mapM)
5import Control.Arrow (first)
6import Types
7import Guid
10-------- Text and Elements --------
12str2elem = hasType (string ==> element) [ "image","video","plainText" ]
14textToText = [ "header", "italic", "bold", "underline"
15 , "overline", "strikeThrough", "monospace" ]
17textAttrs = [ "toText" -: string ==> text
18 , "link" -: string ==> text ==> text
19-- , "height" -: IntT ==> text ==> text
20 ] ++ hasType (text ==> text) textToText
22elements = let iee = IntT ==> element ==> element in
23 [ "flow" -: direction ==> listOf element ==> element
24 , "layers" -: listOf element ==> element
25 , "opacity" -: iee
26 , "width" -: iee
27 , "height" -: iee
28 , "size" -: IntT ==> iee
29 , "box" -: iee
30 ]
33-------- Math and Binops --------
35iii = IntT ==> IntT ==> IntT
36xxb x = x ==> x ==> BoolT
38math =
39 hasType (IntT ==> iii) ["clamp"] ++
40 hasType iii ["+", "-", "*", "/","rem","mod","logBase","max","min"] ++
41 hasType (IntT ==> IntT) ["sin","cos","tan","asin","acos","atan","sqrt","abs"]
43bool =
44 [ "not" -: BoolT ==> BoolT ] ++
45 hasType (xxb BoolT) ["&&","||"] ++
46 hasType (xxb IntT) ["==","/=","<",">","<=",">="]
49-------- Polymorphic Functions --------
51var = VarT `liftM` guid
52vars n = mapM (const var) [1..n]
54infix 8 -::
55name -:: tipe = return $ name -: tipe
57funcs = sequence
58 [ do a <- var ; "id" -:: a ==> a
59 , do [a,b,c] <- vars 3 ; "flip" -:: (a ==> b ==> c) ==> (b ==> a ==> c)
60 , do [a,b,c] <- vars 3 ; "." -:: (b ==> c) ==> (a ==> b) ==> (a ==> c)
61 , do [a,b] <- vars 2 ; "$" -:: (a ==> b) ==> a ==> b
62 , do a <- var ; ":" -:: a ==> listOf a ==> listOf a
63 , do a <- var ; "++" -:: listOf a ==> listOf a ==> listOf a
64 , do a <- var ; "Cons" -:: a ==> listOf a ==> listOf a
65 , do a <- var ; "Nil" -:: listOf a
66 , do a <- var ; "Just" -:: a ==> ADT "Maybe" [a]
67 , do a <- var ; "Nothing" -:: ADT "Maybe" [a]
68 , "elmRange" -:: IntT ==> IntT ==> listOf IntT
69 ]
71ints = map (-: (listOf IntT ==> IntT)) [ "sum","product","maximum","minimum" ]
73lists = liftM (map (first ("List."++)) . (++ints)) . sequence $
74 [ "and" -:: listOf BoolT ==> BoolT
75 , "or" -:: listOf BoolT ==> BoolT
76 , "sort" -:: listOf IntT ==> listOf IntT
77 , do a <- var ; "head" -:: listOf a ==> a
78 , do a <- var ; "tail" -:: listOf a ==> listOf a
79 , do a <- var ; "length" -:: listOf a ==> IntT
80 , do a <- var ; "filter" -:: (a ==> BoolT) ==> listOf a ==> listOf a
81 , do a <- var ; "foldr1" -:: (a ==> a ==> a) ==> listOf a ==> a
82 , do a <- var ; "foldl1" -:: (a ==> a ==> a) ==> listOf a ==> a
83 , do a <- var ; "scanl1" -:: (a ==> a ==> a) ==> listOf a ==> a
84 , do a <- var ; "forall" -:: (a ==> BoolT) ==> listOf a ==> BoolT
85 , do a <- var ; "exists" -:: (a ==> BoolT) ==> listOf a ==> BoolT
86 , do a <- var ; "concat" -:: listOf (listOf a) ==> listOf a
87 , do a <- var ; "reverse" -:: listOf a ==> listOf a
88 , do a <- var ; "intersperse" -:: a ==> listOf a ==> listOf a
89 , do a <- var ; "intercalate" -:: listOf a ==> listOf(listOf a) ==> listOf a
90 , do [a,b] <- vars 2 ; "zip" -:: listOf a ==>listOf b ==>listOf(tupleOf [a,b])
91 , do [a,b] <- vars 2 ; "map" -:: (a ==> b) ==> listOf a ==> listOf b
92 , do [a,b] <- vars 2 ; "foldr" -:: (a ==> b ==> b) ==> b ==> listOf a ==> b
93 , do [a,b] <- vars 2 ; "foldl" -:: (a ==> b ==> b) ==> b ==> listOf a ==> b
94 , do [a,b] <- vars 2 ; "scanl" -:: (a==>b==>b)==>b==>listOf a==>listOf b
95 , do [a,b] <- vars 2 ; "concatMap" -:: (a==>listOf b)==>listOf a ==> listOf b
96 , do [a,b,c] <- vars 3
97 "zipWith" -:: (a ==> b ==> c) ==> listOf a ==> listOf b ==> listOf c
98 ]
101-------- Everything --------
103hints = do
104 fs <- funcs ; ls <- lists
105 return $ fs ++ ls ++ math ++ bool ++ str2elem ++ textAttrs ++ elements