@@ -1,29 +1,92 @@
11
2−module Hints where
2+module Hints (hints) where
33
4+import Control.Monad (liftM,mapM)
45import Types
6+import Guid
57
6−elementT = ADT "Element" []
7−n2e2e = LambdaT IntT $ LambdaT elementT elementT
8−
9−str2elem = map (\f -> (f, LambdaT StringT elementT))
10− [ "image", "video", "text", "leftText", "centerText", "rightText" ]
11−
12−textAttrs =
13− [ ("link", LambdaT StringT s2s), ("fontSize", LambdaT IntT s2s) ] ++
14− map (\f -> (f, s2s))
15− ["header", "italic", "bold", "underline"
16− , "overline", "strikeThrough" ]
17− where s2s = LambdaT StringT StringT
18−
19−allHints = str2elem ++ textAttrs ++
20− [ ("flowDown", LambdaT (ADT "List" [elementT]) elementT)
21− , ("flowRight", LambdaT (ADT "List" [elementT]) elementT)
22− , ("opacity", n2e2e)
23− , ("width", n2e2e)
24− , ("height", n2e2e)
25− , ("size", LambdaT IntT n2e2e)
26− , ("centerX", LambdaT elementT elementT)
8+element = ADT "Element" []
9+direction = ADT "Direction" []
10+text = ADT "Text" []
11+listOf t = ADT "List" [t]
12+string = listOf CharT
13+
14+infixr ==>
15+t1 ==> t2 = LambdaT t1 t2
16+
17+infix 8 -:
18+name -: tipe = (,) name tipe
19+
20+hasType t = map (-: t)
21+
22+-------- Text and Elements --------
23+
24+str2elem = hasType (string ==> element) [ "image","video","plainText" ]
25+
26+textToText = ["header", "italic", "bold", "underline"
27+ , "overline", "strikeThrough", "monospace" ]
28+
29+textAttrs = [ "toText" -: string ==> text
30+ , "link" -: string ==> text ==> text
31+ , "height" -: IntT ==> text ==> text
32+ ] ++ hasType (text ==> text) textToText
33+
34+elements = let iee = IntT ==> element ==> element in
35+ [ "flow" -: direction ==> listOf element ==> element
36+ , "opacity" -: iee
37+ , "width" -: iee
38+ , "height" -: iee
39+ , "size" -: IntT ==> iee
40+ , "box" -: iee
2741 ]
2842
29−typeHints = Map.fromList allHints
43+
44+-------- Math and Binops --------
45+
46+iii = IntT ==> IntT ==> IntT
47+xxb x = x ==> x ==> BoolT
48+
49+math =
50+ hasType (IntT ==> iii) ["clamp"] ++
51+ hasType iii ["+", "-", "*", "/","rem","mod","logBase","max","min"] ++
52+ hasType (IntT ==> IntT) ["sin","cos","tan","asin","acos","atan","sqrt","abs"]
53+
54+bool =
55+ [ "not" -: BoolT ==> BoolT ] ++
56+ hasType (xxb BoolT) ["&&","||"] ++
57+ hasType (xxb IntT) ["==","/=","<",">","<=",">="]
58+
59+
60+-------- Polymorphic Functions --------
61+
62+var = VarT `liftM` guid
63+vars n = mapM (const var) [1..n]
64+
65+infix 8 -::
66+name -:: tipe = return $ name -: tipe
67+
68+funcs = sequence
69+ [ do a <- var ; "id" -:: a ==> a
70+ , do [a,b,c] <- vars 3 ; "flip" -:: (a ==> b ==> c) ==> (b ==> a ==> c)
71+ , do [a,b,c] <- vars 3 ; "." -:: (b ==> c) ==> (a ==> b) ==> (a ==> c)
72+ , do [a,b] <- vars 2 ; "$" -:: (a ==> b) ==> a ==> b
73+ ]
74+
75+lists = sequence
76+ [ do a <- var ; ":" -:: a ==> listOf a ==> listOf a
77+ , do a <- var ; "++" -:: listOf a ==> listOf a ==> listOf a
78+ , do a <- var ; "head" -:: listOf a ==> a
79+ , do a <- var ; "tail" -:: listOf a ==> listOf a
80+ , do a <- var ; "length" -:: listOf a ==> IntT
81+ , do a <- var ; "filter" -:: (a ==> BoolT) ==> listOf a ==> listOf a
82+ , do a <- var ; "reverse" -:: listOf a ==> listOf a
83+ , do [a,b] <- vars 2 ; "map" -:: (a ==> b) ==> listOf a ==> listOf b
84+ , do [a,b] <- vars 2 ; "foldr" -:: (a ==> b ==> b) ==> b ==> listOf a ==> b
85+ , do [a,b] <- vars 2 ; "foldl" -:: (a ==> b ==> b) ==> b ==> listOf a ==> b
86+ ]
87+
88+
89+-------- Everything --------
90+
91+hints = do fs <- funcs ; ls <- lists
92+ return $ fs ++ ls ++ str2elem ++ textAttrs ++ elements ++ math ++ bool