-- | This is just a wrapper module to allow more concise imports.
--     For documentation, you should probably start in "Choreography.Core".
module Choreography
  ( module Choreography.Core,
    module Choreography.Choreography,
    module Choreography.Choreography.Batteries,
    module Choreography.Locations,
    module Choreography.Locations.Batteries,
    module Choreography.Network,
    module Choreography.Polymorphism,

    -- * Running choreographies
    runChoreography,
  )
where

import Choreography.Choreography
import Choreography.Choreography.Batteries
import Choreography.Core
import Choreography.Locations
import Choreography.Locations.Batteries
import Choreography.Network
import Choreography.Polymorphism
import Control.Monad.IO.Class (MonadIO)

-- | Run a choreography with a message transport backend...
runChoreography :: (Backend config, MonadIO m, KnownSymbols ps) => config -> Choreo ps m a -> LocTm -> m a
runChoreography :: forall config (m :: * -> *) (ps :: [Symbol]) a.
(Backend config, MonadIO m, KnownSymbols ps) =>
config -> Choreo ps m a -> LocTm -> m a
runChoreography config
cfg Choreo ps m a
choreo LocTm
l = config -> LocTm -> Network m a -> m a
forall c (m :: * -> *) a.
(Backend c, MonadIO m) =>
c -> LocTm -> Network m a -> m a
forall (m :: * -> *) a.
MonadIO m =>
config -> LocTm -> Network m a -> m a
runNetwork config
cfg LocTm
l (Choreo ps m a -> LocTm -> Network m a
forall (ps :: [Symbol]) b (m :: * -> *).
(Monad m, KnownSymbols ps) =>
Choreo ps m b -> LocTm -> Network m b
epp Choreo ps m a
choreo LocTm
l)