mirror of
https://github.com/github/semantic.git
synced 2024-12-24 07:25:44 +03:00
Implement doWhile in terms of the new while effect
This commit is contained in:
parent
fdfc47e168
commit
741a3b25d6
@ -111,44 +111,22 @@ while :: Member (While value) effects
|
||||
while (Evaluator cond) (Evaluator body) = send (While cond body)
|
||||
|
||||
-- | Do-while loop, built on top of while.
|
||||
doWhile :: (AbstractValue address value effects, Member (Boolean value) effects)
|
||||
=> Evaluator address value effects value
|
||||
-> Evaluator address value effects value
|
||||
-> Evaluator address value effects value
|
||||
doWhile body cond = undefined
|
||||
doWhile :: Member (While value) effects
|
||||
=> Evaluator address value effects value
|
||||
-> Evaluator address value effects value
|
||||
-> Evaluator address value effects value
|
||||
doWhile body cond = body *> while cond body
|
||||
|
||||
-- | C-style for loops.
|
||||
forLoop :: ( AbstractValue address value effects
|
||||
, Member (Boolean value) effects
|
||||
, Member (While value) effects
|
||||
, Member (Env address) effects
|
||||
)
|
||||
=> Evaluator address value effects value -- ^ Initial statement
|
||||
-> Evaluator address value effects value -- ^ Condition
|
||||
-> Evaluator address value effects value -- ^ Increment/stepper
|
||||
-> Evaluator address value effects value -- ^ Body
|
||||
-> Evaluator address value effects value
|
||||
forLoop :: (Member (While value) effects, Member (Env address) effects)
|
||||
=> Evaluator address value effects value -- ^ Initial statement
|
||||
-> Evaluator address value effects value -- ^ Condition
|
||||
-> Evaluator address value effects value -- ^ Increment/stepper
|
||||
-> Evaluator address value effects value -- ^ Body
|
||||
-> Evaluator address value effects value
|
||||
forLoop initial cond step body =
|
||||
locally (initial *> while cond (body *> step))
|
||||
|
||||
-- -- | The fundamental looping primitive, built on top of 'ifthenelse'.
|
||||
-- while :: (AbstractValue address value effects, Member (Boolean value) effects)
|
||||
-- => Evaluator address value effects value
|
||||
-- -> Evaluator address value effects value
|
||||
-- -> Evaluator address value effects value
|
||||
-- while cond body = loop $ \ continue -> do
|
||||
-- this <- cond
|
||||
-- ifthenelse this (body *> continue) (pure unit)
|
||||
--
|
||||
-- -- | Do-while loop, built on top of while.
|
||||
-- doWhile :: (AbstractValue address value effects, Member (Boolean value) effects)
|
||||
-- => Evaluator address value effects value
|
||||
-- -> Evaluator address value effects value
|
||||
-- -> Evaluator address value effects value
|
||||
-- doWhile body cond = loop $ \ continue -> body *> do
|
||||
-- this <- cond
|
||||
-- ifthenelse this continue (pure unit)
|
||||
|
||||
data While value m result where
|
||||
While :: m value -> m value -> While value m value
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user