packages feed

hs-hath-1.1.1: src/SettingM.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TemplateHaskell #-}

module SettingM ( SettingM(..), getSettings, updateSettings, runSettingM ) where

import           Polysemy
import           Polysemy.Operators

import           Relude             hiding ( Reader )

import           Types              ( HathSettings )

data SettingM m a where
  -- | Get current H@H settings
  GetSettings :: SettingM m HathSettings
  -- | Update H@H settings (hot update without restart)
  UpdateSettings :: HathSettings -> SettingM m ()

makeSem ''SettingM

{-# INLINE runSettingM #-}
-- | Run the Settings effect with a TVar storing the current settings
runSettingM :: Member (Embed IO) r => TVar HathSettings -> SettingM : r @> a -> r @> a
runSettingM tvar = interpret $ \case
  GetSettings        -> embed $ readTVarIO @IO tvar
  UpdateSettings new -> embed $ atomically @IO $ writeTVar tvar new