module Ribosome.Control.Ribosome where

import Data.MessagePack (Object)
import Prelude hiding (state)

import Path (Abs, Dir, Path)
import Ribosome.Data.Errors (Errors)
import Ribosome.Data.Scratch (Scratch)

type Locks = Map Text (TMVar ())

data RibosomeInternal =
  RibosomeInternal {
    RibosomeInternal -> Locks
_locks :: Locks,
    RibosomeInternal -> Errors
_errors :: Errors,
    RibosomeInternal -> Map Text Scratch
_scratch :: Map Text Scratch,
    RibosomeInternal -> Map Text Object
_watchedVariables :: Map Text Object,
    RibosomeInternal -> Maybe (Path Abs Dir)
_projectDir :: Maybe (Path Abs Dir)
  }
  deriving ((forall x. RibosomeInternal -> Rep RibosomeInternal x)
-> (forall x. Rep RibosomeInternal x -> RibosomeInternal)
-> Generic RibosomeInternal
forall x. Rep RibosomeInternal x -> RibosomeInternal
forall x. RibosomeInternal -> Rep RibosomeInternal x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep RibosomeInternal x -> RibosomeInternal
$cfrom :: forall x. RibosomeInternal -> Rep RibosomeInternal x
Generic, RibosomeInternal
RibosomeInternal -> Default RibosomeInternal
forall a. a -> Default a
def :: RibosomeInternal
$cdef :: RibosomeInternal
Default)

makeClassy ''RibosomeInternal

data RibosomeState s =
  RibosomeState {
    RibosomeState s -> RibosomeInternal
_internal :: RibosomeInternal,
    RibosomeState s -> s
_public :: s
  }
  deriving ((forall x. RibosomeState s -> Rep (RibosomeState s) x)
-> (forall x. Rep (RibosomeState s) x -> RibosomeState s)
-> Generic (RibosomeState s)
forall x. Rep (RibosomeState s) x -> RibosomeState s
forall x. RibosomeState s -> Rep (RibosomeState s) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall s x. Rep (RibosomeState s) x -> RibosomeState s
forall s x. RibosomeState s -> Rep (RibosomeState s) x
$cto :: forall s x. Rep (RibosomeState s) x -> RibosomeState s
$cfrom :: forall s x. RibosomeState s -> Rep (RibosomeState s) x
Generic, RibosomeState s
RibosomeState s -> Default (RibosomeState s)
forall a. a -> Default a
forall s. Default s => RibosomeState s
def :: RibosomeState s
$cdef :: forall s. Default s => RibosomeState s
Default)

makeClassy ''RibosomeState

data Ribosome s =
  Ribosome {
    Ribosome s -> Text
_name :: Text,
    Ribosome s -> TMVar (RibosomeState s)
_state :: TMVar (RibosomeState s)
  }

makeClassy ''Ribosome

newRibosomeTMVar :: MonadIO m => s -> m (TMVar (RibosomeState s))
newRibosomeTMVar :: s -> m (TMVar (RibosomeState s))
newRibosomeTMVar s
s =
  IO (TMVar (RibosomeState s)) -> m (TMVar (RibosomeState s))
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (TMVar (RibosomeState s)) -> m (TMVar (RibosomeState s)))
-> IO (TMVar (RibosomeState s)) -> m (TMVar (RibosomeState s))
forall a b. (a -> b) -> a -> b
$ RibosomeState s -> IO (TMVar (RibosomeState s))
forall (m :: * -> *) a. MonadIO m => a -> m (TMVar a)
newTMVarIO (RibosomeInternal -> s -> RibosomeState s
forall s. RibosomeInternal -> s -> RibosomeState s
RibosomeState RibosomeInternal
forall a. Default a => a
def s
s)

newRibosome :: MonadIO m => Text -> s -> m (Ribosome s)
newRibosome :: Text -> s -> m (Ribosome s)
newRibosome Text
name' =
  Text -> TMVar (RibosomeState s) -> Ribosome s
forall s. Text -> TMVar (RibosomeState s) -> Ribosome s
Ribosome Text
name' (TMVar (RibosomeState s) -> Ribosome s)
-> (s -> m (TMVar (RibosomeState s))) -> s -> m (Ribosome s)
forall (f0 :: * -> *) (f1 :: * -> *) a b.
(Functor f0, Functor f1) =>
(a -> b) -> f1 (f0 a) -> f1 (f0 b)
<$$> s -> m (TMVar (RibosomeState s))
forall (m :: * -> *) s.
MonadIO m =>
s -> m (TMVar (RibosomeState s))
newRibosomeTMVar