packages feed

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

{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE DeriveAnyClass #-}

module Ribosome.Control.Ribosome where

import Control.Lens (makeClassy)
import Control.Monad.IO.Class (MonadIO)
import Data.Default (Default(def))
import Data.Functor.Syntax ((<$$>))
import Data.Map (Map)
import Data.MessagePack (Object)
import GHC.Generics (Generic)
import UnliftIO.STM (TMVar, TMVar, newTMVarIO)

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

type Locks = Map Text (TMVar ())

data RibosomeInternal =
  RibosomeInternal {
    _locks :: Locks,
    _errors :: Errors,
    _scratch :: Map Text Scratch,
    _watchedVariables :: Map Text Object,
    _projectDir :: Maybe (Path Abs Dir)
  }
  deriving (Generic, Default)

makeClassy ''RibosomeInternal

data RibosomeState s =
  RibosomeState {
    _internal :: RibosomeInternal,
    _public :: s
  }
  deriving (Generic, Default)

makeClassy ''RibosomeState

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

makeClassy ''Ribosome

newRibosomeTMVar :: MonadIO m => s -> m (TMVar (RibosomeState s))
newRibosomeTMVar s =
  newTMVarIO (RibosomeState def s)

newRibosome :: MonadIO m => Text -> s -> m (Ribosome s)
newRibosome name' =
  Ribosome name' <$$> newRibosomeTMVar