git.iko.soy/typeable/control-has
on master help sign in
5 files changed+74−71
since splitsnapshots
unifiedsplit
.gitignore+1 LICENSE+2 control-has.cabal+39−37 src/Control/EnvT.hs+15−18 src/Control/Has.hs+17−16
.gitignorenew file+1
@@ -0,0 +1 @@
1+.stack-work
LICENSEnew file+2
@@ -0,0 +1,2 @@
1+Copyright © 2020, Antorica LLC
2+All rights reserved
control-has.cabal+39−37
@@ -1,39 +1,41 @@
1−name: control-has
2−version: 0.1.0.0
3−synopsis: Typeclass for things that have parts
4−license: AllRightsReserved
5−build-type: Simple
6−cabal-version: >=1.10
1+cabal-version: 2.4
2+name: control-has
3+version: 0.2.0.0
4+synopsis: Typeclass for things that have parts
5+license-file: LICENSE
6+build-type: Simple
77
88library
9− hs-source-dirs: src
10− ghc-options: -Wall
11− exposed-modules: Control.Has
12− Control.EnvT
13− build-depends: base
14− , exceptions
15− , lens
16− , monad-control
17− , mtl
18− , resourcet
19− , transformers-base
20− if !impl(ghcjs)
21− build-depends: katip
22− , missing-lens
23− default-language: Haskell2010
24− default-extensions: ConstraintKinds
25− , DataKinds
26− , DefaultSignatures
27− , DerivingStrategies
28− , FlexibleContexts
29− , FlexibleInstances
30− , FunctionalDependencies
31− , GADTs
32− , GeneralizedNewtypeDeriving
33− , KindSignatures
34− , RankNTypes
35− , StandaloneDeriving
36− , TypeOperators
37− , TypeFamilies
38− , UndecidableInstances
39− , UndecidableSuperClasses
9+ hs-source-dirs: src
10+ ghc-options: -Wall
11+ exposed-modules:
12+ Control.EnvT
13+ Control.Has
14+
15+ build-depends:
16+ , base >=4.10
17+ , exceptions
18+ , lens
19+ , monad-control
20+ , mtl
21+ , resourcet
22+ , transformers-base
23+
24+ default-language: Haskell2010
25+ default-extensions:
26+ ConstraintKinds
27+ DataKinds
28+ DefaultSignatures
29+ DerivingStrategies
30+ FlexibleContexts
31+ FlexibleInstances
32+ FunctionalDependencies
33+ GADTs
34+ GeneralizedNewtypeDeriving
35+ KindSignatures
36+ RankNTypes
37+ StandaloneDeriving
38+ TypeFamilies
39+ TypeOperators
40+ UndecidableInstances
41+ UndecidableSuperClasses
src/Control/EnvT.hs+15−18
@@ -1,8 +1,10 @@
11{-# LANGUAGE CPP #-}
2+{-# LANGUAGE TemplateHaskell #-}
23
34module Control.EnvT
45 ( EnvT(..)
56 , runEnvT
7+ , execEnvT
68 , module X
79 ) where
810
@@ -12,17 +14,19 @@ import Control.Lens
1214import Control.Monad.Base
1315import Control.Monad.Catch
1416import Control.Monad.Except
15−import Control.Monad.Fail
1617import Control.Monad.Reader as X
1718import Control.Monad.Trans.Control
1819import Control.Monad.Trans.Resource
1920import Control.Monad.Zip
20−#ifndef ghcjs_HOST_OS
21−import Control.Lens.Missing
22−import Katip
23−import Katip.Monadic
21+
22+#if MIN_VERSION_mtl(2,3,0)
23+import Control.Monad
24+import Control.Monad.Fix
2425#endif
2526
27+#if !MIN_VERSION_base(4,13,0)
28+import Control.Monad.Fail
29+#endif
2630
2731-- | The only reason this exists is that there are a lot of instances for
2832-- 'EnvT, which simply pass the implementation to the inner 'm'
@@ -52,22 +56,15 @@ deriving newtype instance
5256 (MonadBaseControl b m, Monad m)
5357 => MonadBaseControl b (EnvT r m)
5458
59+-- | Run 'EnvT' transformer.
5560runEnvT :: forall r m a. EnvT r m a -> r -> m a
5661runEnvT m r = flip runReaderT r . unEnvT $ m
62+{-# INLINE runEnvT #-}
5763
58−#ifndef ghcjs_HOST_OS
59−instance (Has KatipContextTState r, MonadIO m)
60− => KatipContext (EnvT r m) where
61− getKatipContext = view $ part . _ltsContext
62− localKatipContext f = local (part . _ltsContext %~ f)
63− getKatipNamespace = view $ part . _ltsNamespace
64− localKatipNamespace f = local (part . _ltsNamespace %~ f)
65−
66−instance (Has KatipContextTState r, MonadIO m)
67− => Katip (EnvT r m) where
68− getLogEnv = view $ part . _ltsLogEnv
69− localLogEnv f = local (part . _ltsLogEnv %~ f)
70−#endif
64+-- | Same as 'runEnvT' but with arguments flipped.
65+execEnvT :: forall r m a. r -> EnvT r m a -> m a
66+execEnvT = flip runEnvT
67+{-# INLINE execEnvT #-}
7168
7269instance MonadResource m => MonadResource (EnvT r m) where
7370 liftResourceT = lift . liftResourceT
src/Control/Has.hs+17−16
@@ -6,11 +6,14 @@ module Control.Has
66 , MonadHas
77 , Fieldy
88 , Generic
9− )
10−where
9+ ) where
1110
1211import Control.Lens
12+-- reexport all from Reader except Control.Monad etc
13+-- to correspond mtl-2.3+
1314import Control.Monad.Reader as X
15+ ( MonadReader(..), asks, Reader, runReader, mapReader, withReader
16+ , ReaderT(ReaderT), runReaderT, mapReaderT, withReaderT )
1417import Data.Kind
1518import GHC.Generics as G
1619
@@ -21,11 +24,11 @@ class Has x r where
2124instance {-# OVERLAPS #-} Has r r where
2225 part = id
2326
24−type family HasAll (xs :: [*]) r :: Constraint where
27+type family HasAll (xs :: [Type]) r :: Constraint where
2528 HasAll '[] r = ()
2629 HasAll (x ': xs) r = (Has x r, HasAll xs r)
2730
28−data LensList (r :: *) (es :: [*]) where
31+data LensList (r :: Type) (es :: [Type]) where
2932 LLNil :: LensList r '[]
3033 LLCons :: Lens r r e e -> LensList r es -> LensList r (e ': es)
3134
@@ -33,7 +36,7 @@ mapLL :: Lens s s r r -> LensList r es -> LensList s es
3336mapLL _ LLNil = LLNil
3437mapLL m (LLCons l ls) = LLCons (m . l) (mapLL m ls)
3538
36−type family (xs :: [*]) ++ (ys :: [*]) :: [*] where
39+type family (xs :: [Type]) ++ (ys :: [Type]) :: [Type] where
3740 '[] ++ ys = ys
3841 (x ': xs) ++ ys = x ': (xs ++ ys)
3942
@@ -44,7 +47,7 @@ concatLL (LLCons l ls) ys = LLCons l (concatLL ls ys)
4447-- borrowed from Data.HSet.Get
4548data N = Z | S N
4649
47−type family IndexOf (x :: *) (xs :: [*]) :: N where
50+type family IndexOf (x :: Type) (xs :: [Type]) :: N where
4851 IndexOf x (x ': _) = 'Z
4952 IndexOf x (_ ': xs) = 'S (IndexOf x xs)
5053
@@ -53,8 +56,8 @@ class (i ~ IndexOf e es) => GetLens e es i | i es -> e where
5356
5457type Elem e es = GetLens e es (IndexOf e es)
5558
56−class Fieldy (r :: *) where
57− type Fields r :: [*]
59+class Fieldy (r :: Type) where
60+ type Fields r :: [Type]
5861 type Fields r = GFields (Rep r)
5962 lensList :: LensList r (Fields r)
6063 default lensList
@@ -65,9 +68,7 @@ class Fieldy (r :: *) where
6568instance {-# OVERLAPPABLE #-} (Fieldy r, Elem e (Fields r)) => Has e r where
6669 part = getLens lensList
6770
68−class (MonadReader r m, HasAll es r)
69− => MonadHas (es :: [*]) (r :: *) (m :: * -> *) | m -> r
70−instance (MonadReader r m, HasAll es r) => MonadHas es r m
71+type MonadHas es r m = (MonadReader r m, HasAll es r)
7172
7273instance GetLens e (e ': es) 'Z where
7374 getLens (LLCons l _) = l
@@ -76,16 +77,16 @@ instance (GetLens e' es n, 'S n ~ IndexOf e' (e ': es))
7677 => GetLens e' (e ': es) ('S n) where
7778 getLens (LLCons _ ls) = getLens ls
7879
79−class GFieldy (r :: * -> *) where
80− type GFields r :: [*]
80+class GFieldy (r :: Type -> Type) where
81+ type GFields r :: [Type]
8182 glensList :: LensList (r x) (GFields r)
8283
8384instance GFieldyProduct r => GFieldy (D1 d (C1 c r)) where
8485 type GFields (D1 d (C1 c r)) = GFieldsProduct r
8586 glensList = mapLL (iso unM1 M1 . iso unM1 M1) glensListProduct
8687
87−class GFieldyProduct (r :: * -> *) where
88− type GFieldsProduct r :: [*]
88+class GFieldyProduct (r :: Type -> Type) where
89+ type GFieldsProduct r :: [Type]
8990 glensListProduct :: LensList (r x) (GFieldsProduct r)
9091
9192instance (GFieldyProduct r, GFieldyProduct s) => GFieldyProduct (r :*: s) where
@@ -104,7 +105,7 @@ instance GFieldyProduct (S1 s (K1 k r)) where
104105 type GFieldsProduct (S1 s (K1 k r)) = '[r]
105106 glensListProduct = LLCons (iso unM1 M1 . iso unK1 K1) LLNil
106107
107−type family AllElem (xs :: [*]) (es :: [*]) :: Constraint where
108+type family AllElem (xs :: [Type]) (es :: [Type]) :: Constraint where
108109 AllElem '[] _ = ()
109110 AllElem (x ': xs) es = (Elem x es, AllElem xs es)
110111