packages feed

ribosome-0.2.0.0: lib/Ribosome/Control/Ribosome.hs

{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE FlexibleInstances #-}

module Ribosome.Control.Ribosome(
  Ribosome (..),
  RibosomeInternal (..),
  Locks,
  newRibosome,
  _locks,
  _errors,
  newInternalTVar,
  _internal,
) where

import Control.Lens (makeClassy_)
import Control.Monad.IO.Class (MonadIO)
import Data.Default (def)
import Data.Map.Strict (Map)
import qualified Data.Map.Strict as Map (empty)
import UnliftIO.STM (TVar, newTVarIO, TMVar)

import Ribosome.Data.Errors (Errors)

type Locks = Map String (TMVar ())

data RibosomeInternal =
  RibosomeInternal {
    locks :: Locks,
    errors :: Errors
  }
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 def)

newRibosome :: MonadIO m => String -> e -> m (Ribosome (TVar e))
newRibosome name' env' = do
  envTv <- newTVarIO env'
  intTv <- newInternalTVar
  return $ Ribosome name' intTv envTv