@@ -9,11 +9,7 @@ module Control.Has
11import Control.Lens
11import Control.Lens
12−-- reexport all from Reader except Control.Monad etc
13−-- to correspond mtl-2.3+
14import Control.Monad.Reader as X
12import Control.Monad.Reader as X
15− ( MonadReader(..), asks, Reader, runReader, mapReader, withReader
16− , ReaderT(ReaderT), runReaderT, mapReaderT, withReaderT )
17import Data.Kind
13import Data.Kind
18import GHC.Generics as G
14import GHC.Generics as G
@@ -24,11 +20,11 @@ class Has x r where
24instance {-# OVERLAPS #-} Has r r where
20instance {-# OVERLAPS #-} Has r r where
27−type family HasAll (xs :: [Type]) r :: Constraint where
23+type family HasAll (xs :: [*]) r :: Constraint where
28 HasAll '[] r = ()
24 HasAll '[] r = ()
29 HasAll (x ': xs) r = (Has x r, HasAll xs r)
25 HasAll (x ': xs) r = (Has x r, HasAll xs r)
31−data LensList (r :: Type) (es :: [Type]) where
27+data LensList (r :: *) (es :: [*]) where
32 LLNil :: LensList r '[]
28 LLNil :: LensList r '[]
33 LLCons :: Lens r r e e -> LensList r es -> LensList r (e ': es)
29 LLCons :: Lens r r e e -> LensList r es -> LensList r (e ': es)
@@ -36,7 +32,7 @@ mapLL :: Lens s s r r -> LensList r es -> LensList s es
36mapLL _ LLNil = LLNil
32mapLL _ LLNil = LLNil
37mapLL m (LLCons l ls) = LLCons (m . l) (mapLL m ls)
33mapLL m (LLCons l ls) = LLCons (m . l) (mapLL m ls)
39−type family (xs :: [Type]) ++ (ys :: [Type]) :: [Type] where
35+type family (xs :: [*]) ++ (ys :: [*]) :: [*] where
40 '[] ++ ys = ys
36 '[] ++ ys = ys
41 (x ': xs) ++ ys = x ': (xs ++ ys)
37 (x ': xs) ++ ys = x ': (xs ++ ys)
@@ -47,7 +43,7 @@ concatLL (LLCons l ls) ys = LLCons l (concatLL ls ys)
47-- borrowed from Data.HSet.Get
43-- borrowed from Data.HSet.Get
48data N = Z | S N
44data N = Z | S N
50−type family IndexOf (x :: Type) (xs :: [Type]) :: N where
46+type family IndexOf (x :: *) (xs :: [*]) :: N where
51 IndexOf x (x ': _) = 'Z
47 IndexOf x (x ': _) = 'Z
52 IndexOf x (_ ': xs) = 'S (IndexOf x xs)
48 IndexOf x (_ ': xs) = 'S (IndexOf x xs)
@@ -56,8 +52,8 @@ class (i ~ IndexOf e es) => GetLens e es i | i es -> e where
57type Elem e es = GetLens e es (IndexOf e es)
53type Elem e es = GetLens e es (IndexOf e es)
59−class Fieldy (r :: Type) where
55+class Fieldy (r :: *) where
60− type Fields r :: [Type]
56+ type Fields r :: [*]
61 type Fields r = GFields (Rep r)
57 type Fields r = GFields (Rep r)
62 lensList :: LensList r (Fields r)
58 lensList :: LensList r (Fields r)
63 default lensList
59 default lensList
@@ -77,16 +73,16 @@ instance (GetLens e' es n, 'S n ~ IndexOf e' (e ': es))
77 => GetLens e' (e ': es) ('S n) where
73 => GetLens e' (e ': es) ('S n) where
78 getLens (LLCons _ ls) = getLens ls
74 getLens (LLCons _ ls) = getLens ls
80−class GFieldy (r :: Type -> Type) where
76+class GFieldy (r :: * -> *) where
81− type GFields r :: [Type]
77+ type GFields r :: [*]
82 glensList :: LensList (r x) (GFields r)
78 glensList :: LensList (r x) (GFields r)
84instance GFieldyProduct r => GFieldy (D1 d (C1 c r)) where
80instance GFieldyProduct r => GFieldy (D1 d (C1 c r)) where
85 type GFields (D1 d (C1 c r)) = GFieldsProduct r
81 type GFields (D1 d (C1 c r)) = GFieldsProduct r
86 glensList = mapLL (iso unM1 M1 . iso unM1 M1) glensListProduct
82 glensList = mapLL (iso unM1 M1 . iso unM1 M1) glensListProduct
88−class GFieldyProduct (r :: Type -> Type) where
84+class GFieldyProduct (r :: * -> *) where
89− type GFieldsProduct r :: [Type]
85+ type GFieldsProduct r :: [*]
90 glensListProduct :: LensList (r x) (GFieldsProduct r)
86 glensListProduct :: LensList (r x) (GFieldsProduct r)
92instance (GFieldyProduct r, GFieldyProduct s) => GFieldyProduct (r :*: s) where
88instance (GFieldyProduct r, GFieldyProduct s) => GFieldyProduct (r :*: s) where
@@ -105,7 +101,7 @@ instance GFieldyProduct (S1 s (K1 k r)) where
105 type GFieldsProduct (S1 s (K1 k r)) = '[r]
101 type GFieldsProduct (S1 s (K1 k r)) = '[r]
106 glensListProduct = LLCons (iso unM1 M1 . iso unK1 K1) LLNil
102 glensListProduct = LLCons (iso unM1 M1 . iso unK1 K1) LLNil
108−type family AllElem (xs :: [Type]) (es :: [Type]) :: Constraint where
104+type family AllElem (xs :: [*]) (es :: [*]) :: Constraint where
109 AllElem '[] _ = ()
105 AllElem '[] _ = ()
110 AllElem (x ': xs) es = (Elem x es, AllElem xs es)
106 AllElem (x ': xs) es = (Elem x es, AllElem xs es)