module Choreography.Network where
import Choreography.Locations (LocTm)
import Control.Monad.Freer
import Control.Monad.IO.Class
data NetworkSig m a where
Run ::
m a ->
NetworkSig m a
Send ::
(Show a) =>
a ->
[LocTm] ->
NetworkSig m ()
Recv ::
(Read a) =>
LocTm ->
NetworkSig m a
type Network m = Freer (NetworkSig m)
run :: m a -> Network m a
run :: forall (m :: * -> *) a. m a -> Network m a
run m a
m = NetworkSig m a -> Freer (NetworkSig m) a
forall (f :: * -> *) a. f a -> Freer f a
toFreer (NetworkSig m a -> Freer (NetworkSig m) a)
-> NetworkSig m a -> Freer (NetworkSig m) a
forall a b. (a -> b) -> a -> b
$ m a -> NetworkSig m a
forall (m :: * -> *) a. m a -> NetworkSig m a
Run m a
m
send :: (Show a) => a -> [LocTm] -> Network m ()
send :: forall a (m :: * -> *). Show a => a -> [LocTm] -> Network m ()
send a
a [LocTm]
ls = NetworkSig m () -> Freer (NetworkSig m) ()
forall (f :: * -> *) a. f a -> Freer f a
toFreer (NetworkSig m () -> Freer (NetworkSig m) ())
-> NetworkSig m () -> Freer (NetworkSig m) ()
forall a b. (a -> b) -> a -> b
$ a -> [LocTm] -> NetworkSig m ()
forall a (m :: * -> *). Show a => a -> [LocTm] -> NetworkSig m ()
Send a
a [LocTm]
ls
recv :: (Read a) => LocTm -> Network m a
recv :: forall a (m :: * -> *). Read a => LocTm -> Network m a
recv LocTm
l = NetworkSig m a -> Freer (NetworkSig m) a
forall (f :: * -> *) a. f a -> Freer f a
toFreer (NetworkSig m a -> Freer (NetworkSig m) a)
-> NetworkSig m a -> Freer (NetworkSig m) a
forall a b. (a -> b) -> a -> b
$ LocTm -> NetworkSig m a
forall a (m :: * -> *). Read a => LocTm -> NetworkSig m a
Recv LocTm
l
class Backend c where
runNetwork :: (MonadIO m) => c -> LocTm -> Network m a -> m a