packages feed

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 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