This repository was archived by the owner on Feb 7, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 13
Expand file tree
/
Copy pathClass.hs
More file actions
33 lines (24 loc) · 1.29 KB
/
Class.hs
File metadata and controls
33 lines (24 loc) · 1.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
module NStack.Settings.Class where
import Control.Monad.Classes -- from: monad-classes
import Control.Monad.Trans -- from: mtl
import GHC.Prim (Proxy#, proxy#) -- from: ghc-prim
import NStack.Settings.Types (SettingsT, Settings, SettingState)
import qualified NStack.Settings.Types as S
class Monad m => MonadSettingsN (n :: Nat) m where
settingsN :: Proxy# n -> m Settings
modifySettingsN :: Proxy# n -> (Settings -> Settings) -> m ()
type EffSettings n = EffReader (SettingState n)
instance Monad m => MonadSettingsN 'Zero (SettingsT m m) where
settingsN _ = S.settings
modifySettingsN _ = S.modifySettings
instance (MonadTrans t, Monad (t m), MonadSettingsN n m) => MonadSettingsN ('Suc n) (t m) where
settingsN _ = lift $ settingsN (proxy# :: Proxy# n)
modifySettingsN _ = lift . modifySettingsN (proxy# :: Proxy# n)
type MonadSettings m = MonadSettingsN (Find (EffSettings (InnerEff m)) m) m
type family InnerEff m where
InnerEff (SettingsT m m) = m
InnerEff (trans m) = InnerEff m
settings :: forall m. MonadSettings m => m Settings
settings = settingsN (proxy# :: Proxy# (Find (EffSettings (InnerEff m)) m))
modifySettings :: forall m. MonadSettings m => (Settings -> Settings) -> m ()
modifySettings = modifySettingsN (proxy# :: Proxy# (Find (EffSettings (InnerEff m)) m))