{-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE FunctionalDependencies #-} {-# LANGUAGE FlexibleInstances #-} module Ribosome.Data.Ribosome( Ribosome (..), newRibosome, RibosomeInternal (..), _internal, _locks, Locks, newInternalTVar, ) where import Control.Lens (makeClassy_) import UnliftIO.STM (TVar, newTVarIO, TMVar) import Control.Monad.IO.Class (MonadIO) import Data.Map.Strict (Map) import qualified Data.Map.Strict as Map (empty) type Locks = Map String (TMVar ()) newtype RibosomeInternal = RibosomeInternal { locks :: Locks } makeClassy_ ''RibosomeInternal data Ribosome e = Ribosome { name :: String, internal :: TVar RibosomeInternal, env :: e } makeClassy_ ''Ribosome newInternalTVar :: MonadIO m => m (TVar RibosomeInternal) newInternalTVar = newTVarIO (RibosomeInternal Map.empty) newRibosome :: MonadIO m => String -> e -> m (Ribosome (TVar e)) newRibosome name' env' = do envTv <- newTVarIO env' intTv <- newInternalTVar return $ Ribosome name' intTv envTv