{-# LANGUAGE DataKinds #-}

-- | Monad for running Feldspar programs

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

-- | Monad for running Feldspar programs
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