{-# LANGUAGE DataKinds #-}
module Feldspar.Run.Representation where
import Control.Monad.Trans
import Language.Embedded.Imperative as Imp
import Language.Embedded.Concurrent
import Feldspar.Primitive.Representation
import Feldspar.Representation
import Feldspar.Frontend
type RunCMD
= ControlCMD
:+: PtrCMD
:+: ThreadCMD
:+: ChanCMD
:+: FileCMD
:+: C_CMD
newtype Run a = Run
{ Run a
-> ProgramT
RunCMD
(Param2 Data PrimType')
(Program CompCMD (Param2 Data PrimType'))
a
unRun ::
ProgramT
RunCMD
(Param2 Data PrimType')
(Program CompCMD (Param2 Data PrimType'))
a
}
deriving (a -> Run b -> Run a
(a -> b) -> Run a -> Run b
(forall a b. (a -> b) -> Run a -> Run b)
-> (forall a b. a -> Run b -> Run a) -> Functor Run
forall a b. a -> Run b -> Run a
forall a b. (a -> b) -> Run a -> Run b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> Run b -> Run a
$c<$ :: forall a b. a -> Run b -> Run a
fmap :: (a -> b) -> Run a -> Run b
$cfmap :: forall a b. (a -> b) -> Run a -> Run b
Functor, Functor Run
a -> Run a
Functor Run
-> (forall a. a -> Run a)
-> (forall a b. Run (a -> b) -> Run a -> Run b)
-> (forall a b c. (a -> b -> c) -> Run a -> Run b -> Run c)
-> (forall a b. Run a -> Run b -> Run b)
-> (forall a b. Run a -> Run b -> Run a)
-> Applicative Run
Run a -> Run b -> Run b
Run a -> Run b -> Run a
Run (a -> b) -> Run a -> Run b
(a -> b -> c) -> Run a -> Run b -> Run c
forall a. a -> Run a
forall a b. Run a -> Run b -> Run a
forall a b. Run a -> Run b -> Run b
forall a b. Run (a -> b) -> Run a -> Run b
forall a b c. (a -> b -> c) -> Run a -> Run b -> Run c
forall (f :: * -> *).
Functor f
-> (forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
<* :: Run a -> Run b -> Run a
$c<* :: forall a b. Run a -> Run b -> Run a
*> :: Run a -> Run b -> Run b
$c*> :: forall a b. Run a -> Run b -> Run b
liftA2 :: (a -> b -> c) -> Run a -> Run b -> Run c
$cliftA2 :: forall a b c. (a -> b -> c) -> Run a -> Run b -> Run c
<*> :: Run (a -> b) -> Run a -> Run b
$c<*> :: forall a b. Run (a -> b) -> Run a -> Run b
pure :: a -> Run a
$cpure :: forall a. a -> Run a
$cp1Applicative :: Functor Run
Applicative, Applicative Run
a -> Run a
Applicative Run
-> (forall a b. Run a -> (a -> Run b) -> Run b)
-> (forall a b. Run a -> Run b -> Run b)
-> (forall a. a -> Run a)
-> Monad Run
Run a -> (a -> Run b) -> Run b
Run a -> Run b -> Run b
forall a. a -> Run a
forall a b. Run a -> Run b -> Run b
forall a b. Run a -> (a -> Run b) -> Run b
forall (m :: * -> *).
Applicative m
-> (forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
return :: a -> Run a
$creturn :: forall a. a -> Run a
>> :: Run a -> Run b -> Run b
$c>> :: forall a b. Run a -> Run b -> Run b
>>= :: Run a -> (a -> Run b) -> Run b
$c>>= :: forall a b. Run a -> (a -> Run b) -> Run b
$cp1Monad :: Applicative Run
Monad)
instance MonadComp Run
where
liftComp :: Comp a -> Run a
liftComp = ProgramT
RunCMD
(Param2 Data PrimType')
(Program CompCMD (Param2 Data PrimType'))
a
-> Run a
forall a.
ProgramT
RunCMD
(Param2 Data PrimType')
(Program CompCMD (Param2 Data PrimType'))
a
-> Run a
Run (ProgramT
RunCMD
(Param2 Data PrimType')
(Program CompCMD (Param2 Data PrimType'))
a
-> Run a)
-> (Comp a
-> ProgramT
RunCMD
(Param2 Data PrimType')
(Program CompCMD (Param2 Data PrimType'))
a)
-> Comp a
-> Run a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ProgramT CompCMD (Param2 Data PrimType') Identity a
-> ProgramT
RunCMD
(Param2 Data PrimType')
(Program CompCMD (Param2 Data PrimType'))
a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (ProgramT CompCMD (Param2 Data PrimType') Identity a
-> ProgramT
RunCMD
(Param2 Data PrimType')
(Program CompCMD (Param2 Data PrimType'))
a)
-> (Comp a -> ProgramT CompCMD (Param2 Data PrimType') Identity a)
-> Comp a
-> ProgramT
RunCMD
(Param2 Data PrimType')
(Program CompCMD (Param2 Data PrimType'))
a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Comp a -> ProgramT CompCMD (Param2 Data PrimType') Identity a
forall a. Comp a -> Program CompCMD (Param2 Data PrimType') a
unComp
iff :: Data Bool -> Run () -> Run () -> Run ()
iff Data Bool
c Run ()
t Run ()
f = ProgramT
RunCMD
(Param2 Data PrimType')
(Program CompCMD (Param2 Data PrimType'))
()
-> Run ()
forall a.
ProgramT
RunCMD
(Param2 Data PrimType')
(Program CompCMD (Param2 Data PrimType'))
a
-> Run a
Run (ProgramT
RunCMD
(Param2 Data PrimType')
(Program CompCMD (Param2 Data PrimType'))
()
-> Run ())
-> ProgramT
RunCMD
(Param2 Data PrimType')
(Program CompCMD (Param2 Data PrimType'))
()
-> Run ()
forall a b. (a -> b) -> a -> b
$ Data Bool
-> ProgramT
RunCMD
(Param2 Data PrimType')
(Program CompCMD (Param2 Data PrimType'))
()
-> ProgramT
RunCMD
(Param2 Data PrimType')
(Program CompCMD (Param2 Data PrimType'))
()
-> ProgramT
RunCMD
(Param2 Data PrimType')
(Program CompCMD (Param2 Data PrimType'))
()
forall (instr :: (* -> *, (* -> *, (* -> Constraint, *)))
-> * -> *)
(exp :: * -> *) (pred :: * -> Constraint) (m :: * -> *).
(ControlCMD :<: instr) =>
exp Bool
-> ProgramT instr (Param2 exp pred) m ()
-> ProgramT instr (Param2 exp pred) m ()
-> ProgramT instr (Param2 exp pred) m ()
Imp.iff Data Bool
c (Run ()
-> ProgramT
RunCMD
(Param2 Data PrimType')
(Program CompCMD (Param2 Data PrimType'))
()
forall a.
Run a
-> ProgramT
RunCMD
(Param2 Data PrimType')
(Program CompCMD (Param2 Data PrimType'))
a
unRun Run ()
t) (Run ()
-> ProgramT
RunCMD
(Param2 Data PrimType')
(Program CompCMD (Param2 Data PrimType'))
()
forall a.
Run a
-> ProgramT
RunCMD
(Param2 Data PrimType')
(Program CompCMD (Param2 Data PrimType'))
a
unRun Run ()
f)
for :: IxRange (Data n) -> (Data n -> Run ()) -> Run ()
for IxRange (Data n)
range Data n -> Run ()
body = ProgramT
RunCMD
(Param2 Data PrimType')
(Program CompCMD (Param2 Data PrimType'))
()
-> Run ()
forall a.
ProgramT
RunCMD
(Param2 Data PrimType')
(Program CompCMD (Param2 Data PrimType'))
a
-> Run a
Run (ProgramT
RunCMD
(Param2 Data PrimType')
(Program CompCMD (Param2 Data PrimType'))
()
-> Run ())
-> ProgramT
RunCMD
(Param2 Data PrimType')
(Program CompCMD (Param2 Data PrimType'))
()
-> Run ()
forall a b. (a -> b) -> a -> b
$ IxRange (Data n)
-> (Data n
-> ProgramT
RunCMD
(Param2 Data PrimType')
(Program CompCMD (Param2 Data PrimType'))
())
-> ProgramT
RunCMD
(Param2 Data PrimType')
(Program CompCMD (Param2 Data PrimType'))
()
forall (exp :: * -> *)
(instr :: (* -> *, (* -> *, (* -> Constraint, *))) -> * -> *) n
(pred :: * -> Constraint) (m :: * -> *).
(FreeExp exp, ControlCMD :<: instr, Integral n, pred n,
FreePred exp n) =>
IxRange (exp n)
-> (exp n -> ProgramT instr (Param2 exp pred) m ())
-> ProgramT instr (Param2 exp pred) m ()
Imp.for IxRange (Data n)
range (Run ()
-> ProgramT
RunCMD
(Param2 Data PrimType')
(Program CompCMD (Param2 Data PrimType'))
()
forall a.
Run a
-> ProgramT
RunCMD
(Param2 Data PrimType')
(Program CompCMD (Param2 Data PrimType'))
a
unRun (Run ()
-> ProgramT
RunCMD
(Param2 Data PrimType')
(Program CompCMD (Param2 Data PrimType'))
())
-> (Data n -> Run ())
-> Data n
-> ProgramT
RunCMD
(Param2 Data PrimType')
(Program CompCMD (Param2 Data PrimType'))
()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Data n -> Run ()
body)
while :: Run (Data Bool) -> Run () -> Run ()
while Run (Data Bool)
cont Run ()
body = ProgramT
RunCMD
(Param2 Data PrimType')
(Program CompCMD (Param2 Data PrimType'))
()
-> Run ()
forall a.
ProgramT
RunCMD
(Param2 Data PrimType')
(Program CompCMD (Param2 Data PrimType'))
a
-> Run a
Run (ProgramT
RunCMD
(Param2 Data PrimType')
(Program CompCMD (Param2 Data PrimType'))
()
-> Run ())
-> ProgramT
RunCMD
(Param2 Data PrimType')
(Program CompCMD (Param2 Data PrimType'))
()
-> Run ()
forall a b. (a -> b) -> a -> b
$ ProgramT
RunCMD
(Param2 Data PrimType')
(Program CompCMD (Param2 Data PrimType'))
(Data Bool)
-> ProgramT
RunCMD
(Param2 Data PrimType')
(Program CompCMD (Param2 Data PrimType'))
()
-> ProgramT
RunCMD
(Param2 Data PrimType')
(Program CompCMD (Param2 Data PrimType'))
()
forall (instr :: (* -> *, (* -> *, (* -> Constraint, *)))
-> * -> *)
(exp :: * -> *) (pred :: * -> Constraint) (m :: * -> *).
(ControlCMD :<: instr) =>
ProgramT instr (Param2 exp pred) m (exp Bool)
-> ProgramT instr (Param2 exp pred) m ()
-> ProgramT instr (Param2 exp pred) m ()
Imp.while (Run (Data Bool)
-> ProgramT
RunCMD
(Param2 Data PrimType')
(Program CompCMD (Param2 Data PrimType'))
(Data Bool)
forall a.
Run a
-> ProgramT
RunCMD
(Param2 Data PrimType')
(Program CompCMD (Param2 Data PrimType'))
a
unRun Run (Data Bool)
cont) (Run ()
-> ProgramT
RunCMD
(Param2 Data PrimType')
(Program CompCMD (Param2 Data PrimType'))
()
forall a.
Run a
-> ProgramT
RunCMD
(Param2 Data PrimType')
(Program CompCMD (Param2 Data PrimType'))
a
unRun Run ()
body)
class Monad m => MonadRun m
where
liftRun :: m a -> Run a
instance MonadRun Comp where liftRun :: Comp a -> Run a
liftRun = Comp a -> Run a
forall (m :: * -> *) a. MonadComp m => Comp a -> m a
liftComp
instance MonadRun Run where liftRun :: Run a -> Run a
liftRun = Run a -> Run a
forall a. a -> a
id