working again, externalized some device helper functions and added share updating
[mTask.git] / mTaskCode.dcl
1 definition module mTaskCode
2
3 import mTask
4
5 class toCode a :: a -> String
6 instance toCode Pin
7 instance toCode MTask
8 instance toCode ()
9 instance toCode Long
10 instance toCode Bool
11 instance toCode Int
12 instance toCode Real
13 instance toCode Char
14 instance toCode String
15 instance toCode DigitalPin
16 instance toCode AnalogPin
17
18 argType :: (((Code a p)->Code b q)->In ((Code a p)->Code b q) (Code c s)) -> a | type a
19
20 class argTypes t :: ((t->Code b Expr)->In (t->Code b2 q) (Main (Code c s))) -> t
21 instance argTypes (Code a p) | showType a
22 instance argTypes (Code a p, Code b q) | showType a & showType b
23 instance argTypes (Code a p, Code b q, Code c r) | showType a & showType b & showType c
24
25 instance toCode (SV t)
26
27 instance arith Code
28 instance boolExpr Code
29 instance If Code Stmt Stmt Stmt
30 instance If Code e Stmt Stmt
31 instance If Code Stmt e Stmt
32 instance If Code x y Expr
33 instance IF Code
34 instance sds Code
35
36 defCode :: ((Code t p) -> In t (Main (Code u q))) -> Main (Code u r) | type t
37
38 var :: String (ReadWrite (Code v q)) CODE -> CODE
39
40 instance assign Code
41 instance seq Code
42 instance step` Code
43 codeSteps :: [Step Code t] -> Code u p
44 optBreak :: Mode -> Code u p
45
46 instance setDelay Code
47 instance mtask Code a | taskImp2 a & types a
48 instance mtasks Code a b | taskImp2 a & types a & taskImp2 b & types b
49
50 loopCode :: Int (Code a b) -> Code c d
51
52 class taskImp2 a :: Int a -> ((Code Long p) a->Code MTask Expr, a) | /*long Code delay &*/ isExpr p
53 instance taskImp2 ()
54 instance taskImp2 (Code t p)
55 instance taskImp2 (Code a p, Code b q)
56 instance taskImp2 (Code a p, Code b q, Code c r)
57 instance taskImp2 (Code a p, Code b q, Code c r, Code d s)
58
59 class taskImp a :: Int a -> (Int a->Code MTask Expr, a)
60 instance taskImp ()
61 instance taskImp (Code t p)
62 instance taskImp (Code a p, Code b q)
63 instance taskImp (Code a p, Code b q, Code c r)
64 instance taskImp (Code a p, Code b q, Code c r, Code d s)
65
66 tasksMain :: Int Int ((a->Code MTask Expr,b->Code MTask Expr) -> In (a->Code c d,b->Code e f) (Main (Code g h))) -> Main (Code i j) | taskImp a & types a & taskImp b & types b
67 class types a :: a
68 instance types ()
69 instance types (Code a p) | typeSelector a & isExpr p
70 instance types (Code a p, Code b q) | typeSelector a & isExpr p & typeSelector b & isExpr q
71 instance types (Code a p, Code b q, Code c r) | typeSelector a & isExpr p & typeSelector b & isExpr q & typeSelector c & isExpr r
72 instance types (Code a p, Code b q, Code c r, Code d s) | typeSelector a & isExpr p & typeSelector b & isExpr q & typeSelector c & isExpr r & typeSelector d & isExpr s
73
74 codeMTaskBody :: (Code v w) (Code c d) -> Code e f
75 instance fun Code ()
76 instance fun Code (Code t p) | type, showType t & isExpr p
77 instance fun Code (Code a p, Code b q) | showType a & showType b
78 instance fun Code (Code a p, Code b q, Code c r) | showType a & showType b & showType c
79 instance output Code
80 instance pinMode Code
81 instance digitalIO Code
82 instance dIO Code
83 instance aIO Code
84 instance analogIO Code
85 instance noOp Code
86
87 :: Code a p = C ((ReadWrite (Code a Expr)) CODE -> CODE)
88 :: CODE =
89 { fresh :: Int
90 , freshMTask :: Int
91 , funs :: [String]
92 , ifuns :: Int
93 , vars :: [String]
94 , ivars :: Int
95 , setup :: [String]
96 , isetup :: Int
97 , loop :: [String]
98 , iloop :: Int
99 , includes :: [String]
100 , def :: Def
101 , mode` :: Mode
102 , binds :: [String]
103 }
104
105 unC :: (Code a p) -> ((ReadWrite (Code a Expr)) CODE -> CODE)
106
107 :: Def = Var | Fun | Setup | Loop
108 :: Mode = /*MainMode |*/ NoReturn | Return String | SubExp | Assign String
109
110 setMode :: Mode -> Code a p
111 getMode :: (Mode -> Code a p) -> Code a p
112 embed :: (Code a p) -> Code a p
113 (+.+) infixl 5 :: (Code a p) (Code b q) -> Code c r
114 fresh :: (Int -> (Code a p)) -> (Code a p)
115 freshMTask :: (Int -> (Code a p)) -> (Code a p)
116 setCode :: Def -> (Code a p)
117 getCode :: (Def -> Code a p) -> (Code a p)
118 brac :: (Code a p) -> Code b q
119 funBody :: (Code a p) -> Code b q
120 codeOp2 :: (Code a p) String (Code b q) -> Code c r
121 include :: String -> Code a b
122 argList :: [a] -> String | toCode a
123 c :: a -> Code b p | toCode a
124 indent :: Code a p
125 unindent :: Code a p
126 nl :: Code a p
127 setBinds :: [String] -> Code a p
128 addBinds :: String -> Code a p
129 getBinds :: ([String] -> Code a p) -> (Code a p)
130
131 // ----- driver ----- //
132
133 compile :: (Main (Code a p)) -> [String]
134 mkset :: [a] -> [a] | Eq a
135 newCode :: CODE