@@ -1,29 +1,92 @@
2−module Hints where
2+module Hints (hints) where
4+import Control.Monad (liftM,mapM)
4import Types
5import Types
6−elementT = ADT "Element" []
8+element = ADT "Element" []
7−n2e2e = LambdaT IntT $ LambdaT elementT elementT
9+direction = ADT "Direction" []
8−
10+text = ADT "Text" []
9−str2elem = map (\f -> (f, LambdaT StringT elementT))
11+listOf t = ADT "List" [t]
10− [ "image", "video", "text", "leftText", "centerText", "rightText" ]
12+string = listOf CharT
12−textAttrs =
14+infixr ==>
13− [ ("link", LambdaT StringT s2s), ("fontSize", LambdaT IntT s2s) ] ++
15+t1 ==> t2 = LambdaT t1 t2
14− map (\f -> (f, s2s))
16+
18+name -: tipe = (,) name tipe
20+hasType t = map (-: t)
22+-------- Text and Elements --------
24+str2elem = hasType (string ==> element) [ "image","video","plainText" ]
15− ["header", "italic", "bold", "underline"
26+textToText = ["header", "italic", "bold", "underline"
16− , "overline", "strikeThrough" ]
27+ , "overline", "strikeThrough", "monospace" ]
17− where s2s = LambdaT StringT StringT
28+
18−
29+textAttrs = [ "toText" -: string ==> text
19−allHints = str2elem ++ textAttrs ++
30+ , "link" -: string ==> text ==> text
20− [ ("flowDown", LambdaT (ADT "List" [elementT]) elementT)
31+ , "height" -: IntT ==> text ==> text
21− , ("flowRight", LambdaT (ADT "List" [elementT]) elementT)
32+ ] ++ hasType (text ==> text) textToText
34+elements = let iee = IntT ==> element ==> element in
35+ [ "flow" -: direction ==> listOf element ==> element
22− , ("opacity", n2e2e)
36+ , "opacity" -: iee
23− , ("width", n2e2e)
37+ , "width" -: iee
24− , ("height", n2e2e)
38+ , "height" -: iee
25− , ("size", LambdaT IntT n2e2e)
39+ , "size" -: IntT ==> iee
26− , ("centerX", LambdaT elementT elementT)
40+ , "box" -: iee
29−typeHints = Map.fromList allHints
43+
44+-------- Math and Binops --------
46+iii = IntT ==> IntT ==> IntT
47+xxb x = x ==> x ==> BoolT
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"]
55+ [ "not" -: BoolT ==> BoolT ] ++
56+ hasType (xxb BoolT) ["&&","||"] ++
57+ hasType (xxb IntT) ["==","/=","<",">","<=",">="]
60+-------- Polymorphic Functions --------
62+var = VarT `liftM` guid
63+vars n = mapM (const var) [1..n]
66+name -:: tipe = return $ name -: tipe
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
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
89+-------- Everything --------
91+hints = do fs <- funcs ; ls <- lists
92+ return $ fs ++ ls ++ str2elem ++ textAttrs ++ elements ++ math ++ bool