generic-lens 0.3.0.0 → 0.3.0.1
raw patch · 14 files changed
+103/−84 lines, 14 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Data.Generics.Product.Fields: class GHasField (field :: Symbol) (f :: Type -> Type) a | field f -> a
- Data.Generics.Product.Fields: gfield :: GHasField field f a => Lens' (f x) a
- Data.Generics.Product.Fields: instance (Data.Generics.Product.Fields.GHasField field l a, Data.Generics.Product.Fields.GHasField field r a) => Data.Generics.Product.Fields.GHasField field (l GHC.Generics.:+: r) a
- Data.Generics.Product.Fields: instance (GHC.Generics.Generic s, Data.Generics.Product.Fields.ErrorUnless field s (Data.Generics.Internal.Families.Has.HasTotalFieldP field (GHC.Generics.Rep s)), Data.Generics.Product.Fields.GHasField field (GHC.Generics.Rep s) a) => Data.Generics.Product.Fields.HasField field a s
- Data.Generics.Product.Fields: instance Data.Generics.Product.Fields.GHasField field (GHC.Generics.S1 ('GHC.Generics.MetaSel ('GHC.Base.Just field) upkd str infstr) (GHC.Generics.Rec0 a)) a
- Data.Generics.Product.Fields: instance Data.Generics.Product.Fields.GHasField field f a => Data.Generics.Product.Fields.GHasField field (GHC.Generics.M1 GHC.Generics.C meta f) a
- Data.Generics.Product.Fields: instance Data.Generics.Product.Fields.GHasField field f a => Data.Generics.Product.Fields.GHasField field (GHC.Generics.M1 GHC.Generics.D meta f) a
- Data.Generics.Product.Fields: instance Data.Generics.Product.Fields.GHasField field l a => Data.Generics.Product.Fields.GProductHasField field l r a 'GHC.Types.True
- Data.Generics.Product.Fields: instance Data.Generics.Product.Fields.GHasField field r a => Data.Generics.Product.Fields.GProductHasField field l r a 'GHC.Types.False
- Data.Generics.Product.Fields: instance Data.Generics.Product.Fields.GProductHasField field l r a (Data.Generics.Internal.Families.Has.HasTotalFieldP field l) => Data.Generics.Product.Fields.GHasField field (l GHC.Generics.:*: r) a
- Data.Generics.Product.Positions: class GHasPosition (offset :: Nat) (i :: Nat) (f :: Type -> Type) a | offset i f -> a
- Data.Generics.Product.Positions: gposition :: GHasPosition offset i f a => Lens' (f x) a
- Data.Generics.Product.Positions: instance (GHC.Generics.Generic s, Data.Generics.Product.Positions.ErrorUnless i s ((0 Data.Generics.Product.Positions.<? i) Data.Type.Bool.&& (i GHC.TypeLits.<=? Data.Generics.Product.Positions.Size (GHC.Generics.Rep s))), Data.Generics.Product.Positions.GHasPosition 1 i (GHC.Generics.Rep s) a) => Data.Generics.Product.Positions.HasPosition i a s
- Data.Generics.Product.Positions: instance (goLeft ~ (i Data.Generics.Product.Positions.<? (offset GHC.TypeLits.+ Data.Generics.Product.Positions.Size l)), offset' ~ Data.Type.Bool.If goLeft offset (offset GHC.TypeLits.+ Data.Generics.Product.Positions.Size l), Data.Generics.Product.Positions.GProductHasPosition offset' i l r a goLeft) => Data.Generics.Product.Positions.GHasPosition offset i (l GHC.Generics.:*: r) a
- Data.Generics.Product.Positions: instance Data.Generics.Product.Positions.GHasPosition i i (GHC.Generics.S1 meta (GHC.Generics.Rec0 a)) a
- Data.Generics.Product.Positions: instance Data.Generics.Product.Positions.GHasPosition offset i f a => Data.Generics.Product.Positions.GHasPosition offset i (GHC.Generics.M1 GHC.Generics.C meta f) a
- Data.Generics.Product.Positions: instance Data.Generics.Product.Positions.GHasPosition offset i f a => Data.Generics.Product.Positions.GHasPosition offset i (GHC.Generics.M1 GHC.Generics.D meta f) a
- Data.Generics.Product.Positions: instance Data.Generics.Product.Positions.GHasPosition offset i l a => Data.Generics.Product.Positions.GProductHasPosition offset i l r a 'GHC.Types.True
- Data.Generics.Product.Positions: instance Data.Generics.Product.Positions.GHasPosition offset i r a => Data.Generics.Product.Positions.GProductHasPosition offset i l r a 'GHC.Types.False
- Data.Generics.Product.Subtype: instance (Data.Generics.Product.Subtype.GSmash (GHC.Generics.Rep a) (GHC.Generics.Rep b), Data.Generics.Product.Subtype.GUpcast (GHC.Generics.Rep a) (GHC.Generics.Rep b), GHC.Generics.Generic a, GHC.Generics.Generic b) => Data.Generics.Product.Subtype.Subtype b a
- Data.Generics.Product.Subtype: instance (Data.Generics.Product.Subtype.GSmash a sup, Data.Generics.Product.Subtype.GSmash b sup) => Data.Generics.Product.Subtype.GSmash (a GHC.Generics.:*: b) sup
- Data.Generics.Product.Subtype: instance (Data.Generics.Product.Subtype.GUpcast sub a, Data.Generics.Product.Subtype.GUpcast sub b) => Data.Generics.Product.Subtype.GUpcast sub (a GHC.Generics.:*: b)
- Data.Generics.Product.Subtype: instance (leaf ~ GHC.Generics.S1 ('GHC.Generics.MetaSel ('GHC.Base.Just field) p f b) t, Data.Generics.Product.Subtype.GSmashLeaf leaf sup (Data.Generics.Internal.Families.Has.HasTotalFieldP field sup)) => Data.Generics.Product.Subtype.GSmash (GHC.Generics.S1 ('GHC.Generics.MetaSel ('GHC.Base.Just field) p f b) t) sup
- Data.Generics.Product.Subtype: instance Data.Generics.Product.Fields.GHasField field sub t => Data.Generics.Product.Subtype.GUpcast sub (GHC.Generics.S1 ('GHC.Generics.MetaSel ('GHC.Base.Just field) p f b) (GHC.Generics.Rec0 t))
- Data.Generics.Product.Subtype: instance Data.Generics.Product.Fields.GHasField field sup t => Data.Generics.Product.Subtype.GSmashLeaf (GHC.Generics.S1 ('GHC.Generics.MetaSel ('GHC.Base.Just field) p f b) (GHC.Generics.Rec0 t)) sup 'GHC.Types.True
- Data.Generics.Product.Subtype: instance Data.Generics.Product.Subtype.GSmash sub sup => Data.Generics.Product.Subtype.GSmash (GHC.Generics.C1 c sub) sup
- Data.Generics.Product.Subtype: instance Data.Generics.Product.Subtype.GSmash sub sup => Data.Generics.Product.Subtype.GSmash (GHC.Generics.D1 c sub) sup
- Data.Generics.Product.Subtype: instance Data.Generics.Product.Subtype.GSmashLeaf (GHC.Generics.S1 ('GHC.Generics.MetaSel ('GHC.Base.Just field) p f b) (GHC.Generics.Rec0 t)) sup 'GHC.Types.False
- Data.Generics.Product.Subtype: instance Data.Generics.Product.Subtype.GUpcast sub sup => Data.Generics.Product.Subtype.GUpcast sub (GHC.Generics.C1 c sup)
- Data.Generics.Product.Subtype: instance Data.Generics.Product.Subtype.GUpcast sub sup => Data.Generics.Product.Subtype.GUpcast sub (GHC.Generics.D1 c sup)
- Data.Generics.Product.Typed: class GHasType (f :: Type -> Type) a
- Data.Generics.Product.Typed: gtyped :: GHasType f a => Lens' (f x) a
- Data.Generics.Product.Typed: instance (Data.Generics.Product.Typed.GHasType l a, Data.Generics.Product.Typed.GHasType r a) => Data.Generics.Product.Typed.GHasType (l GHC.Generics.:+: r) a
- Data.Generics.Product.Typed: instance (GHC.Generics.Generic s, Data.Generics.Product.Typed.ErrorUnlessOne a s (Data.Generics.Internal.Families.Count.CountTotalType a (GHC.Generics.Rep s)), Data.Generics.Product.Typed.GHasType (GHC.Generics.Rep s) a) => Data.Generics.Product.Typed.HasType a s
- Data.Generics.Product.Typed: instance Data.Generics.Product.Typed.GHasType (GHC.Generics.K1 GHC.Generics.R a) a
- Data.Generics.Product.Typed: instance Data.Generics.Product.Typed.GHasType f a => Data.Generics.Product.Typed.GHasType (GHC.Generics.M1 m meta f) a
- Data.Generics.Product.Typed: instance Data.Generics.Product.Typed.GHasType l a => Data.Generics.Product.Typed.GProductHasType l r a 'GHC.Types.True
- Data.Generics.Product.Typed: instance Data.Generics.Product.Typed.GHasType r a => Data.Generics.Product.Typed.GProductHasType l r a 'GHC.Types.False
- Data.Generics.Product.Typed: instance Data.Generics.Product.Typed.GProductHasType l r a (Data.Generics.Internal.Families.Has.HasTotalTypeP a l) => Data.Generics.Product.Typed.GHasType (l GHC.Generics.:*: r) a
- Data.Generics.Sum.Constructors: instance (Data.Generics.Internal.HList.GCollectible f as, Data.Generics.Internal.HList.ListTuple a as) => Data.Generics.Sum.Constructors.GAsConstructor ctor (GHC.Generics.M1 GHC.Generics.C ('GHC.Generics.MetaCons ctor fixity fields) f) a
- Data.Generics.Sum.Constructors: instance (GHC.Generics.Generic s, Data.Generics.Sum.Constructors.ErrorUnless ctor s (Data.Generics.Internal.Families.Has.HasCtorP ctor (GHC.Generics.Rep s)), Data.Generics.Sum.Constructors.GAsConstructor ctor (GHC.Generics.Rep s) a) => Data.Generics.Sum.Constructors.AsConstructor ctor a s
- Data.Generics.Sum.Constructors: instance Data.Generics.Sum.Constructors.GAsConstructor ctor f a => Data.Generics.Sum.Constructors.GAsConstructor ctor (GHC.Generics.M1 GHC.Generics.D meta f) a
- Data.Generics.Sum.Constructors: instance Data.Generics.Sum.Constructors.GAsConstructor ctor f a => Data.Generics.Sum.Constructors.GAsConstructor ctor (GHC.Generics.M1 GHC.Generics.S meta f) a
- Data.Generics.Sum.Constructors: instance Data.Generics.Sum.Constructors.GAsConstructor ctor l a => Data.Generics.Sum.Constructors.GSumAsConstructor ctor l r a 'GHC.Types.True
- Data.Generics.Sum.Constructors: instance Data.Generics.Sum.Constructors.GAsConstructor ctor r a => Data.Generics.Sum.Constructors.GSumAsConstructor ctor l r a 'GHC.Types.False
- Data.Generics.Sum.Constructors: instance Data.Generics.Sum.Constructors.GSumAsConstructor ctor l r a (Data.Generics.Internal.Families.Has.HasCtorP ctor l) => Data.Generics.Sum.Constructors.GAsConstructor ctor (l GHC.Generics.:+: r) a
- Data.Generics.Sum.Typed: _GTyped :: GAsType f a => Prism' (f x) a
- Data.Generics.Sum.Typed: class GAsType (f :: Type -> Type) a
- Data.Generics.Sum.Typed: instance (GHC.Generics.Generic s, Data.Generics.Sum.Typed.ErrorUnlessOne a s (Data.Generics.Internal.Families.Count.CountPartialType a (GHC.Generics.Rep s)), Data.Generics.Sum.Typed.GAsType (GHC.Generics.Rep s) a) => Data.Generics.Sum.Typed.AsType a s
- Data.Generics.Sum.Typed: instance Data.Generics.Internal.HList.GCollectible f '[a] => Data.Generics.Sum.Typed.GAsType (GHC.Generics.M1 GHC.Generics.C meta f) a
- Data.Generics.Sum.Typed: instance Data.Generics.Sum.Typed.GAsType f a => Data.Generics.Sum.Typed.GAsType (GHC.Generics.M1 GHC.Generics.D meta f) a
- Data.Generics.Sum.Typed: instance Data.Generics.Sum.Typed.GAsType f a => Data.Generics.Sum.Typed.GAsType (GHC.Generics.M1 GHC.Generics.S meta f) a
- Data.Generics.Sum.Typed: instance Data.Generics.Sum.Typed.GAsType l a => Data.Generics.Sum.Typed.GSumAsType l r a 'GHC.Types.True
- Data.Generics.Sum.Typed: instance Data.Generics.Sum.Typed.GAsType r a => Data.Generics.Sum.Typed.GSumAsType l r a 'GHC.Types.False
- Data.Generics.Sum.Typed: instance Data.Generics.Sum.Typed.GSumAsType l r a (Data.Generics.Internal.Families.Has.HasPartialTypeP a l) => Data.Generics.Sum.Typed.GAsType (l GHC.Generics.:+: r) a
+ Data.Generics.Product.Fields: instance (GHC.Generics.Generic s, Data.Generics.Product.Fields.ErrorUnless field s (Data.Generics.Internal.Families.Has.HasTotalFieldP field (GHC.Generics.Rep s)), Data.Generics.Product.Internal.Fields.GHasField field (GHC.Generics.Rep s) a) => Data.Generics.Product.Fields.HasField field a s
+ Data.Generics.Product.Positions: instance (GHC.Generics.Generic s, Data.Generics.Product.Positions.ErrorUnless i s ((0 Data.Generics.Product.Internal.Positions.<? i) Data.Type.Bool.&& (i GHC.TypeNats.<=? Data.Generics.Product.Internal.Positions.Size (GHC.Generics.Rep s))), Data.Generics.Product.Internal.Positions.GHasPosition 1 i (GHC.Generics.Rep s) a) => Data.Generics.Product.Positions.HasPosition i a s
+ Data.Generics.Product.Subtype: instance (Data.Generics.Product.Internal.Subtype.GSmash (GHC.Generics.Rep a) (GHC.Generics.Rep b), Data.Generics.Product.Internal.Subtype.GUpcast (GHC.Generics.Rep a) (GHC.Generics.Rep b), GHC.Generics.Generic a, GHC.Generics.Generic b) => Data.Generics.Product.Subtype.Subtype b a
+ Data.Generics.Product.Typed: instance (GHC.Generics.Generic s, Data.Generics.Product.Typed.ErrorUnlessOne a s (Data.Generics.Internal.Families.Count.CountTotalType a (GHC.Generics.Rep s)), Data.Generics.Product.Internal.Typed.GHasType (GHC.Generics.Rep s) a) => Data.Generics.Product.Typed.HasType a s
+ Data.Generics.Sum: _Sub :: AsSubtype sub sup => Prism' sup sub
+ Data.Generics.Sum: class AsSubtype sub sup
+ Data.Generics.Sum: injectSub :: AsSubtype sub sup => sub -> sup
+ Data.Generics.Sum: projectSub :: AsSubtype sub sup => sup -> Either sup sub
+ Data.Generics.Sum.Constructors: instance (GHC.Generics.Generic s, Data.Generics.Sum.Constructors.ErrorUnless ctor s (Data.Generics.Internal.Families.Has.HasCtorP ctor (GHC.Generics.Rep s)), Data.Generics.Sum.Internal.Constructors.GAsConstructor ctor (GHC.Generics.Rep s) a) => Data.Generics.Sum.Constructors.AsConstructor ctor a s
+ Data.Generics.Sum.Subtype: _Sub :: AsSubtype sub sup => Prism' sup sub
+ Data.Generics.Sum.Subtype: class AsSubtype sub sup
+ Data.Generics.Sum.Subtype: injectSub :: AsSubtype sub sup => sub -> sup
+ Data.Generics.Sum.Subtype: instance (GHC.Generics.Generic sub, GHC.Generics.Generic sup, Data.Generics.Sum.Internal.Subtype.GAsSubtype (GHC.Generics.Rep sub) (GHC.Generics.Rep sup)) => Data.Generics.Sum.Subtype.AsSubtype sub sup
+ Data.Generics.Sum.Subtype: projectSub :: AsSubtype sub sup => sup -> Either sup sub
+ Data.Generics.Sum.Typed: instance (GHC.Generics.Generic s, Data.Generics.Sum.Typed.ErrorUnlessOne a s (Data.Generics.Internal.Families.Count.CountPartialType a (GHC.Generics.Rep s)), Data.Generics.Sum.Internal.Typed.GAsType (GHC.Generics.Rep s) a) => Data.Generics.Sum.Typed.AsType a s
- Data.Generics.Product: class HasField (field :: Symbol) a s | s field -> a where field f s = fmap (flip (setField @field) s) (f (getField @field s)) getField s = s ^. field @field setField = set (field @field)
+ Data.Generics.Product: class HasField (field :: Symbol) a s | s field -> a
- Data.Generics.Product: class HasPosition (i :: Nat) a s | s i -> a where position f s = fmap (flip (setPosition @i) s) (f (getPosition @i s)) getPosition s = s ^. position @i setPosition = set (position @i)
+ Data.Generics.Product: class HasPosition (i :: Nat) a s | s i -> a
- Data.Generics.Product: class HasType a s where typed f t = fmap (flip (setTyped @a) t) (f (getTyped @a t)) getTyped s = s ^. typed @a setTyped = set (typed @a)
+ Data.Generics.Product: class HasType a s
- Data.Generics.Product: class Subtype sup sub where super f sub = fmap (`smash` sub) (f (upcast sub)) upcast s = s ^. super @sup smash = set (super @sup)
+ Data.Generics.Product: class Subtype sup sub
- Data.Generics.Product.Fields: class HasField (field :: Symbol) a s | s field -> a where field f s = fmap (flip (setField @field) s) (f (getField @field s)) getField s = s ^. field @field setField = set (field @field)
+ Data.Generics.Product.Fields: class HasField (field :: Symbol) a s | s field -> a
- Data.Generics.Product.Positions: class HasPosition (i :: Nat) a s | s i -> a where position f s = fmap (flip (setPosition @i) s) (f (getPosition @i s)) getPosition s = s ^. position @i setPosition = set (position @i)
+ Data.Generics.Product.Positions: class HasPosition (i :: Nat) a s | s i -> a
- Data.Generics.Product.Subtype: class Subtype sup sub where super f sub = fmap (`smash` sub) (f (upcast sub)) upcast s = s ^. super @sup smash = set (super @sup)
+ Data.Generics.Product.Subtype: class Subtype sup sub
- Data.Generics.Product.Typed: class HasType a s where typed f t = fmap (flip (setTyped @a) t) (f (getTyped @a t)) getTyped s = s ^. typed @a setTyped = set (typed @a)
+ Data.Generics.Product.Typed: class HasType a s
Files
- README.md +3/−3
- generic-lens.cabal +1/−1
- src/Data/Generics/Internal/Families/Count.hs +8/−20
- src/Data/Generics/Internal/Families/Has.hs +13/−26
- src/Data/Generics/Internal/HList.hs +20/−2
- src/Data/Generics/Internal/Lens.hs +1/−1
- src/Data/Generics/Product/Any.hs +1/−0
- src/Data/Generics/Product/Fields.hs +2/−2
- src/Data/Generics/Product/Positions.hs +3/−3
- src/Data/Generics/Product/Subtype.hs +1/−1
- src/Data/Generics/Product/Typed.hs +2/−2
- src/Data/Generics/Sum/Any.hs +1/−0
- src/Data/Generics/Sum/Constructors.hs +2/−5
- src/Data/Generics/Sum/Typed.hs +45/−18
README.md view
@@ -175,10 +175,10 @@ type Age = Int data Dog = MkDog { name :: Name, age :: Age } deriving (Generic, Show)-data Animal = Dog Dog | Cat (Name, Age) | Duck Age deriving (Generic, Show)+data Animal = Dog Dog | Cat Name Age | Duck Age deriving (Generic, Show) shep = Dog (MkDog "Shep" 4)-mog = Cat ("Mog", 5)+mog = Cat "Mog" 5 donald = Duck 4 ``` @@ -193,7 +193,7 @@ Just ("Mog",5) >>> _Ctor @"Cat" # ("Garfield", 6) :: Animal-Cat ("Garfield",6)+Cat "Garfield" 6 >>> donald ^? _Ctor @"Giraffe" error:
generic-lens.cabal view
@@ -1,5 +1,5 @@ name: generic-lens-version: 0.3.0.0+version: 0.3.0.1 synopsis: Generic data-structure operations exposed as lenses. description: This package uses the GHC 8 Generic representation to derive various operations on data structures with a lens interface, including structural subtype relationship between records and positional indexing into arbitrary product types.
src/Data/Generics/Internal/Families/Count.hs view
@@ -21,8 +21,13 @@ ) where import GHC.Generics-import GHC.TypeLits +import Data.Type.Bool (If)+import Data.Type.Equality (type (==))+import GHC.TypeLits (TypeError, ErrorMessage (..))++import Data.Generics.Internal.HList+ type family CountTotalType t f :: Count where CountTotalType t (S1 _ (Rec0 t)) = 'One@@ -49,29 +54,12 @@ ) type family CountPartialType t f :: Count where- CountPartialType t (S1 _ (Rec0 t))- = 'One- CountPartialType t (l :*: r)- = CountPartialType t l <|> CountPartialType t r CountPartialType t (l :+: r) = CountPartialType t l <|> CountPartialType t r- CountPartialType t (S1 _ _)- = 'None- CountPartialType t (C1 _ f)- = CountPartialType t f+ CountPartialType t (C1 m f)+ = If (t == ListToTuple (GCollect f)) 'One 'None CountPartialType t (D1 _ f) = CountPartialType t f- CountPartialType t (Rec0 _)- = 'None- CountPartialType t U1- = 'None- CountPartialType t V1- = 'None- CountPartialType t f- = TypeError- ( 'ShowType f- ':<>: 'Text " is not a valid GHC.Generics representation type"- ) data Count = None
src/Data/Generics/Internal/Families/Has.hs view
@@ -17,14 +17,18 @@ module Data.Generics.Internal.Families.Has ( HasTotalFieldP , HasTotalTypeP- , HasPartialTypeP+ , HasPartialTypeTupleP , HasCtorP ) where -import Data.Type.Bool (type (||), type (&&)) import GHC.Generics-import GHC.TypeLits +import Data.Type.Bool (type (||), type (&&))+import Data.Type.Equality (type (==))+import GHC.TypeLits (Symbol, TypeError, ErrorMessage (..))++import Data.Generics.Internal.HList+ type family HasTotalFieldP (field :: Symbol) f :: Bool where HasTotalFieldP field (S1 ('MetaSel ('Just field) _ _ _) _) = 'True@@ -75,30 +79,13 @@ ':<>: 'Text " is not a valid GHC.Generics representation type" ) -type family HasPartialTypeP a f :: Bool where- HasPartialTypeP t (S1 meta (Rec0 t))- = 'True- HasPartialTypeP t (l :*: r)- = HasPartialTypeP t l || HasPartialTypeP t r- HasPartialTypeP t (l :+: r)- = HasPartialTypeP t l || HasPartialTypeP t r- HasPartialTypeP t (S1 _ _)- = 'False- HasPartialTypeP t (C1 m f)- = HasPartialTypeP t f- HasPartialTypeP t (D1 m f)- = HasPartialTypeP t f- HasPartialTypeP t (Rec0 _)- = 'False- HasPartialTypeP t U1- = 'False- HasPartialTypeP t V1+type family HasPartialTypeTupleP a f :: Bool where+ HasPartialTypeTupleP t (l :+: r)+ = HasPartialTypeTupleP t l || HasPartialTypeTupleP t r+ HasPartialTypeTupleP t (C1 m f)+ = t == ListToTuple (GCollect f)+ HasPartialTypeTupleP t _ = 'False- HasPartialTypeP t f- = TypeError- ( 'ShowType f- ':<>: 'Text " is not a valid GHC.Generics representation type"- ) type family HasCtorP (ctor :: Symbol) f :: Bool where HasCtorP ctor (C1 ('MetaCons ctor _ _) _)
src/Data/Generics/Internal/HList.hs view
@@ -29,7 +29,7 @@ , GCollectible (..) ) where -import Data.Kind+import Data.Kind (Type) import GHC.Generics data HList (xs :: [Type]) where@@ -67,74 +67,87 @@ -- * Convert tuples to/from HLists class ListTuple (tuple :: Type) (as :: [Type]) | as -> tuple where+ type ListToTuple as :: Type tupleToList :: tuple -> HList as listToTuple :: HList as -> tuple instance ListTuple () '[] where+ type ListToTuple '[] = () tupleToList _ = Nil listToTuple _ = () instance ListTuple a '[a] where+ type ListToTuple '[a] = a tupleToList a = a :> Nil listToTuple (a :> Nil) = a instance ListTuple (a, b) '[a, b] where+ type ListToTuple '[a, b] = (a, b) tupleToList (a, b) = a :> b :> Nil listToTuple (a :> b :> Nil) = (a, b) instance ListTuple (a, b, c) '[a, b, c] where+ type ListToTuple '[a, b, c] = (a, b, c) tupleToList (a, b, c) = a :> b :> c :> Nil listToTuple (a :> b :> c :> Nil) = (a, b, c) instance ListTuple (a, b, c, d) '[a, b, c, d] where+ type ListToTuple '[a, b, c, d] = (a, b, c, d) tupleToList (a, b, c, d) = a :> b :> c :> d:> Nil listToTuple (a :> b :> c :> d :> Nil) = (a, b, c, d) instance ListTuple (a, b, c, d, e) '[a, b, c, d, e] where+ type ListToTuple '[a, b, c, d, e] = (a, b, c, d, e) tupleToList (a, b, c, d, e) = a :> b :> c :> d:> e :> Nil listToTuple (a :> b :> c :> d :> e :> Nil) = (a, b, c, d, e) instance ListTuple (a, b, c, d, e, f) '[a, b, c, d, e, f] where+ type ListToTuple '[a, b, c, d, e, f] = (a, b, c, d, e, f) tupleToList (a, b, c, d, e, f) = a :> b :> c :> d:> e :> f :> Nil listToTuple (a :> b :> c :> d :> e :> f :> Nil) = (a, b, c, d, e, f) instance ListTuple (a, b, c, d, e, f, g) '[a, b, c, d, e, f, g] where+ type ListToTuple '[a, b, c, d, e, f, g] = (a, b, c, d, e, f, g) tupleToList (a, b, c, d, e, f, g) = a :> b :> c :> d:> e :> f :> g :> Nil listToTuple (a :> b :> c :> d :> e :> f :> g :> Nil) = (a, b, c, d, e, f, g) instance ListTuple (a, b, c, d, e, f, g, h) '[a, b, c, d, e, f, g, h] where+ type ListToTuple '[a, b, c, d, e, f, g, h] = (a, b, c, d, e, f, g, h) tupleToList (a, b, c, d, e, f, g, h) = a :> b :> c :> d:> e :> f :> g :> h :> Nil listToTuple (a :> b :> c :> d :> e :> f :> g :> h :> Nil) = (a, b, c, d, e, f, g, h) instance ListTuple (a, b, c, d, e, f, g, h, j) '[a, b, c, d, e, f, g, h, j] where+ type ListToTuple '[a, b, c, d, e, f, g, h, j] = (a, b, c, d, e, f, g, h, j) tupleToList (a, b, c, d, e, f, g, h, j) = a :> b :> c :> d:> e :> f :> g :> h :> j :> Nil listToTuple (a :> b :> c :> d :> e :> f :> g :> h :> j :> Nil) = (a, b, c, d, e, f, g, h, j) instance ListTuple (a, b, c, d, e, f, g, h, j, k) '[a, b, c, d, e, f, g, h, j, k] where+ type ListToTuple '[a, b, c, d, e, f, g, h, j, k] = (a, b, c, d, e, f, g, h, j, k) tupleToList (a, b, c, d, e, f, g, h, j, k) = a :> b :> c :> d:> e :> f :> g :> h :> j :> k :> Nil listToTuple (a :> b :> c :> d :> e :> f :> g :> h :> j :> k :> Nil) = (a, b, c, d, e, f, g, h, j, k) instance ListTuple (a, b, c, d, e, f, g, h, j, k, l) '[a, b, c, d, e, f, g, h, j, k, l] where+ type ListToTuple '[a, b, c, d, e, f, g, h, j, k, l] = (a, b, c, d, e, f, g, h, j, k, l) tupleToList (a, b, c, d, e, f, g, h, j, k, l) = a :> b :> c :> d:> e :> f :> g :> h :> j :> k :> l :> Nil listToTuple (a :> b :> c :> d :> e :> f :> g :> h :> j :> k :> l :> Nil)@@ -143,6 +156,7 @@ -------------------------------------------------------------------------------- class GCollectible (f :: Type -> Type) (as :: [Type]) | f -> as where+ type GCollect f :: [Type] gtoCollection :: f x -> HList as gfromCollection :: HList as -> f x @@ -152,6 +166,7 @@ , cs ~ (as ++ bs) , Splittable as bs cs ) => GCollectible (l :*: r) cs where+ type GCollect (l :*: r) = GCollect l ++ GCollect r gtoCollection (l :*: r) = gtoCollection l `append` gtoCollection r@@ -160,14 +175,17 @@ = gfromCollection as :*: gfromCollection bs where (as, bs) = split cs -instance GCollectible (K1 R a) '[a] where+instance GCollectible (Rec0 a) '[a] where+ type GCollect (Rec0 a) = '[a] gtoCollection = (:> Nil) . unK1 gfromCollection = K1 . head' instance GCollectible U1 '[] where+ type GCollect U1 = '[] gtoCollection U1 = Nil gfromCollection Nil = U1 instance GCollectible f as => GCollectible (M1 m meta f) as where+ type GCollect (M1 m meta f) = GCollect f gtoCollection = gtoCollection . unM1 gfromCollection = M1 . gfromCollection
src/Data/Generics/Internal/Lens.hs view
@@ -18,7 +18,7 @@ import Control.Applicative (Const(..)) import Data.Functor.Identity (Identity(..)) import Data.Profunctor (Choice(right'), Profunctor(dimap))-import GHC.Generics ((:*:)(..), Generic(..), K1(..), M1(..), Rep, (:+:)(..))+import GHC.Generics ((:*:)(..), (:+:)(..), Generic(..), K1(..), M1(..), Rep) -- | Type alias for lens type Lens' s a
src/Data/Generics/Product/Any.hs view
@@ -1,6 +1,7 @@ {-# LANGUAGE AllowAmbiguousTypes #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE FunctionalDependencies #-}+{-# LANGUAGE MonoLocalBinds #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE PolyKinds #-} {-# LANGUAGE ScopedTypeVariables #-}
src/Data/Generics/Product/Fields.hs view
@@ -36,9 +36,9 @@ import Data.Generics.Internal.Families import Data.Generics.Internal.Lens -import Data.Kind+import Data.Kind (Constraint, Type) import GHC.Generics-import GHC.TypeLits+import GHC.TypeLits (Symbol, ErrorMessage(..), TypeError) -- $example -- @
src/Data/Generics/Product/Positions.hs view
@@ -36,10 +36,10 @@ import Data.Generics.Internal.Lens -import Data.Kind-import Data.Type.Bool+import Data.Kind (Constraint, Type)+import Data.Type.Bool (If, type (&&), Not) import GHC.Generics-import GHC.TypeLits+import GHC.TypeLits (type (<=?), type (+), Nat, TypeError, ErrorMessage(..)) -- $example -- @
src/Data/Generics/Product/Subtype.hs view
@@ -57,7 +57,7 @@ import Data.Generics.Internal.Lens import Data.Generics.Product.Fields -import Data.Kind+import Data.Kind (Type) import GHC.Generics -- |Structural subtype relationship
src/Data/Generics/Product/Typed.hs view
@@ -36,9 +36,9 @@ import Data.Generics.Internal.Families import Data.Generics.Internal.Lens -import Data.Kind+import Data.Kind (Constraint, Type) import GHC.Generics-import GHC.TypeLits+import GHC.TypeLits (TypeError, ErrorMessage (..)) -- $example -- @
src/Data/Generics/Sum/Any.hs view
@@ -1,6 +1,7 @@ {-# LANGUAGE AllowAmbiguousTypes #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE FunctionalDependencies #-}+{-# LANGUAGE MonoLocalBinds #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE PolyKinds #-} {-# LANGUAGE ScopedTypeVariables #-}
src/Data/Generics/Sum/Constructors.hs view
@@ -34,9 +34,9 @@ import Data.Generics.Internal.HList import Data.Generics.Internal.Lens -import Data.Kind+import Data.Kind (Constraint, Type) import GHC.Generics-import GHC.TypeLits+import GHC.TypeLits (Symbol, TypeError, ErrorMessage (..)) -- $example -- @@@ -121,9 +121,6 @@ _GCtor = _GSumCtor @ctor @l @r @a @(HasCtorP ctor l) instance GAsConstructor ctor f a => GAsConstructor ctor (M1 D meta f) a where- _GCtor = mIso . _GCtor @ctor--instance GAsConstructor ctor f a => GAsConstructor ctor (M1 S meta f) a where _GCtor = mIso . _GCtor @ctor class GSumAsConstructor (ctor :: Symbol) l r a (contains :: Bool) | ctor l r contains -> a where
src/Data/Generics/Sum/Typed.hs view
@@ -11,6 +11,8 @@ {-# LANGUAGE TypeOperators #-} {-# LANGUAGE UndecidableInstances #-} +{-# LANGUAGE DeriveGeneric #-}+ ----------------------------------------------------------------------------- -- | -- Module : Data.Generics.Sum.Typed@@ -34,14 +36,14 @@ , GAsType (..) ) where +import Data.Kind+import GHC.Generics+import GHC.TypeLits (TypeError, ErrorMessage (..))+ import Data.Generics.Internal.Families import Data.Generics.Internal.HList import Data.Generics.Internal.Lens -import Data.Kind-import GHC.Generics-import GHC.TypeLits- -- $example -- @ -- module Example where@@ -51,7 +53,7 @@ -- -- data Animal -- = Dog Dog--- | Cat (Name, Age)+-- | Cat Name Age -- | Duck Age -- deriving (Generic, Show) --@@ -116,27 +118,52 @@ -- |As 'AsType' but over generic representations as defined by "GHC.Generics". class GAsType (f :: Type -> Type) a where _GTyped :: Prism' (f x) a+ _GTyped = prism ginjectTyped gprojectTyped + ginjectTyped :: a -> f x+ gprojectTyped :: f x -> Either (f x) a+ instance- ( GCollectible f '[a]+ ( GCollectible f as+ , ListTuple a as ) => GAsType (M1 C meta f) a where - _GTyped = prism (M1 . gfromCollection . tupleToList) (Right . listToTuple @_ @'[a] . gtoCollection . unM1)+ ginjectTyped+ = M1 . gfromCollection . tupleToList+ gprojectTyped+ = Right . listToTuple @_ @as . gtoCollection . unM1 -instance GSumAsType l r a (HasPartialTypeP a l) => GAsType (l :+: r) a where- _GTyped = _GSumTyped @l @r @a @(HasPartialTypeP a l)+instance GSumAsType (HasPartialTypeTupleP a l) l r a => GAsType (l :+: r) a where+ ginjectTyped+ = ginjectSumTyped @(HasPartialTypeTupleP a l) @l @r @a+ gprojectTyped+ = gprojectSumTyped @(HasPartialTypeTupleP a l) @l @r @a instance GAsType f a => GAsType (M1 D meta f) a where- _GTyped = mIso . _GTyped--instance GAsType f a => GAsType (M1 S meta f) a where- _GTyped = mIso . _GTyped+ ginjectTyped+ = M1 . ginjectTyped+ gprojectTyped+ = either (Left . M1) Right . gprojectTyped . unM1 -class GSumAsType l r a (contains :: Bool) where+class GSumAsType (contains :: Bool) l r a where _GSumTyped :: Prism' ((l :+: r) x) a+ _GSumTyped = prism (ginjectSumTyped @contains) (gprojectSumTyped @contains) -instance GAsType l a => GSumAsType l r a 'True where- _GSumTyped = left . _GTyped+ ginjectSumTyped :: a -> (l :+: r) x+ gprojectSumTyped :: (l :+: r) x -> Either ((l :+: r) x) a -instance GAsType r a => GSumAsType l r a 'False where- _GSumTyped = right . _GTyped+instance GAsType l a => GSumAsType 'True l r a where+ ginjectSumTyped+ = L1 . ginjectTyped+ gprojectSumTyped+ = \x -> case x of+ L1 l -> either (Left . L1) Right (gprojectTyped l)+ R1 _ -> Left x++instance GAsType r a => GSumAsType 'False l r a where+ ginjectSumTyped+ = R1 . ginjectTyped+ gprojectSumTyped+ = \x -> case x of+ R1 r -> either (Left . R1) Right (gprojectTyped r)+ L1 _ -> Left x