import mTask
eval :: (Main (Eval t p)) -> [String] | toString t
-eval {main=(E f)} = [toString (fst (f Rd state0))]
+eval {main=(E f)} = [toString (fst (f Rd zero))]
-:: State =
- { tasks :: [(Int, State->State)]
+:: State` =
+ { tasks :: [(Int, State`->State`)]
, store :: [Dyn]
, dpins :: [(DigitalPin, Bool)]
, apins :: [(AnalogPin, Int)]
, millis:: Int
}
-state0 :: State
-state0 = {store = [], tasks = [], serial = [], millis = 0, dpins = [] , apins = []}
+instance zero State` where
+ zero = {store = [], tasks = [], serial = [], millis = 0, dpins = [] , apins = []}
-//:: TaskSim :== (Int, State->State)
-:: Eval t p = E ((ReadWrite t) State -> (t, State))
-toS2S :: (Eval t p) -> (State->State)
+//:: TaskSim :== (Int, State`->State`)
+:: Eval t p = E ((ReadWrite t) State` -> (t, State`))
+toS2S :: (Eval t p) -> (State`->State`)
toS2S (E f) = \state.snd (f Rd state)
-unEval :: (Eval t p) -> ((ReadWrite t) State -> (t, State))
+unEval :: (Eval t p) -> ((ReadWrite t) State` -> (t, State`))
unEval (E f) = f
:: ReadWrite t = Rd | Wrt t | Updt (t->t)
[] = 0
[a:x] = a
-writePinA :: AnalogPin Int State -> State
+writePinA :: AnalogPin Int State` -> State`
writePinA p x s
= {s & apins = [(p, x):[(q, y) \\ (q, y) <- s.apins | p <> q]]}
= case [b \\ (q,b) <- lista | p == q] of
[] = False
[a:x] = a <> 0
-class writePinD p :: p Bool State -> State
+class writePinD p :: p Bool State` -> State`
instance writePinD DigitalPin where
writePinD p b s=:{dpins} = {s & dpins = [(p, b):[(q, c) \\ (q, c) <- dpins | p <> q]]}
instance writePinD AnalogPin where
derive class iTask DigitalPin, AnalogPin, Dyn, StateInterface, DisplayVar, Pin
simulate :: (Main (Eval a p)) -> Task ()
-simulate {main=(E f)} = setup state0 where
+simulate {main=(E f)} = setup zero where
setup s =
updateInformation "State" [] (toView s)
>>* [ OnAction ActionFinish (always shutDown)
updateInformation "State" [] (toView s)
>>* [ OnAction ActionFinish (always shutDown)
, OnAction (Action "clear serial" []) (always (simloop {s & serial = []}))
- , OnAction ActionNew (always (setup state0))
+ , OnAction ActionNew (always (setup zero))
: if (isEmpty s.tasks)
[]
[OnAction (Action "loop" []) (hasValue
]
]
-toView :: State -> StateInterface
+toView :: State` -> StateInterface
toView s =
{ serialOut = Display s.serial
, analogPins = s.apins
, taskCount = Display (length s.tasks)
}
-mergeView :: State StateInterface -> State
+mergeView :: State` StateInterface -> State`
mergeView s si =
{ s
& store = [fromDisplayVar new old \\ new <- si.var2iables & old <- s.store]
| DisplayVar [String]
-step` :: State -> State
+step` :: State` -> State`
step` s =
foldr appTask {s & millis = s.millis + delta, tasks = []}
[(w - delta, f) \\ (w, f) <- s.tasks]