data-diverse-lens 1.0.0.0 → 1.0.0.1
raw patch · 4 files changed
+49/−32 lines, 4 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Data.Diverse.Lens.Many: genericItemTag :: forall l a b s t. (HasField l s t a b) => Lens s t a b
- Data.Diverse.Lens.Which: genericFacetTag :: forall l a s proxy. (AsConstructor l s s a a) => proxy l -> Prism' s a
+ Data.Diverse.Lens.Many: class HasItem' a s where item' = typed
+ Data.Diverse.Lens.Many: class HasItemL (l :: k) a b s t | s l -> a, t l -> b, s l b -> t, t l a -> s
+ Data.Diverse.Lens.Many: class HasItemL' (l :: k) a s | s l -> a
+ Data.Diverse.Lens.Many: class HasItemN (n :: Nat) a b s t | s n -> a, t n -> b, s n b -> t, t n a -> s where itemN = position @n
+ Data.Diverse.Lens.Many: class HasItemN' (n :: Nat) a s | s n -> a
+ Data.Diverse.Lens.Many: class HasItemTag (l :: k) a b s t | s l -> a, t l -> b, s l b -> t, t l a -> s
+ Data.Diverse.Lens.Many: class HasItemTag' (l :: k) a s
+ Data.Diverse.Lens.Many: class HasProject (as :: k) (bs :: k) (ss :: k) (ts :: k) a b s t | a -> as, b -> bs, s -> ss, t -> ts, b as -> a, s as -> a, t as -> a, a bs -> b, s bs -> b, t bs -> b, a ss -> s, b ss -> s, t ss -> s, a ts -> t, b ts -> t, s ts -> t, s a b -> t, t a b -> s
+ Data.Diverse.Lens.Many: class HasProject' (as :: k) (ss :: k) a s | a -> as, s -> ss, s as -> a, a ss -> s where project' = super
+ Data.Diverse.Lens.Many: class HasProjectL (ls :: k1) (as :: k) (bs :: k) (ss :: k) (ts :: k) a b s t | a -> as, b -> bs, s -> ss, t -> ts, b as -> a, s as -> a, t as -> a, a bs -> b, s bs -> b, t bs -> b, a ss -> s, b ss -> s, t ss -> s, a ts -> t, b ts -> t, s ts -> t, s ls -> as, t ls -> bs, s ls b -> t, t ls a -> s
+ Data.Diverse.Lens.Many: class HasProjectL' (ls :: k1) (as :: k) (ss :: k) a s | a -> as, s -> ss, s as -> a, a ss -> s, s ls -> as
+ Data.Diverse.Lens.Many: class HasProjectN (ns :: [Nat]) (as :: k) (bs :: k) (ss :: k) (ts :: k) a b s t | a -> as, b -> bs, s -> ss, t -> ts, b as -> a, s as -> a, t as -> a, a bs -> b, s bs -> b, t bs -> b, a ss -> s, b ss -> s, t ss -> s, a ts -> t, b ts -> t, s ts -> t, s ns -> as, t ns -> bs, s ns b -> t, t ns a -> s
+ Data.Diverse.Lens.Many: class HasProjectN' (ns :: [Nat]) (as :: k) (ss :: k) a s | a -> as, s -> ss, s as -> a, a ss -> s, s ns -> as
+ Data.Diverse.Lens.Which: class AsFacet a s where facet = _Typed
+ Data.Diverse.Lens.Which: class AsFacetL (l :: k) a s | s l -> a
+ Data.Diverse.Lens.Which: class AsFacetN (n :: Nat) a s | s n -> a
+ Data.Diverse.Lens.Which: class AsFacetTag (l :: k) a s | s l -> a
+ Data.Diverse.Lens.Which: class AsInject (as :: k) (ss :: k) a s | a -> as, s -> ss, s as -> a, a ss -> s
+ Data.Diverse.Lens.Which: class AsInjectL (ls :: k1) (as :: k) (ss :: k) a s | a -> as, s -> ss, s as -> a, a ss -> s, s ls -> as
+ Data.Diverse.Lens.Which: class AsInjectN (ns :: [Nat]) (as :: k) (ss :: k) a s | a -> as, s -> ss, s as -> a, a ss -> s, s ns -> as
- Data.Diverse.Lens.Many: item' :: HasItem' a s => Lens' s a
+ Data.Diverse.Lens.Many: item' :: (HasItem' a s, HasType a s) => Lens' s a
- Data.Diverse.Lens.Many: itemN :: HasItemN n a b s t => Lens s t a b
+ Data.Diverse.Lens.Many: itemN :: (HasItemN n a b s t, HasPosition n s t a b) => Lens s t a b
- Data.Diverse.Lens.Many: project' :: HasProject' as ss a s => Lens' s a
+ Data.Diverse.Lens.Many: project' :: (HasProject' as ss a s, Subtype a s) => Lens' s a
- Data.Diverse.Lens.Which: facet :: AsFacet a s => Prism' s a
+ Data.Diverse.Lens.Which: facet :: (AsFacet a s, AsType a s) => Prism' s a
Files
- README.md +3/−0
- data-diverse-lens.cabal +1/−1
- src/Data/Diverse/Lens/Many.hs +26/−19
- src/Data/Diverse/Lens/Which.hs +19/−12
README.md view
@@ -8,6 +8,9 @@ # Changelog +* 1.0.0.1+ - Fixed missing exports of the new lens classes.+ * 1.0.0.0 - Removed overlapping instances of Data.Generics lens - Using typeclass instead of plain functions so that lens can be used for other data types
data-diverse-lens.cabal view
@@ -1,5 +1,5 @@ name: data-diverse-lens-version: 1.0.0.0+version: 1.0.0.1 synopsis: Isos & Lens for Data.Diverse.Many and Prisms for Data.Diverse.Which description: Isos & Lens for Data.Diverse.Many and Prisms for Data.Diverse.Which Refer to [ManySpec.hs](https://github.com/louispan/data-diverse-lens/blob/master/test/Data/Diverse/Lens/ManySpec.hs) and [WhichSpec.hs](https://github.com/louispan/data-diverse-lens/blob/master/test/Data/Diverse/Lens/WhichSpec.hs) for example usages.
src/Data/Diverse/Lens/Many.hs view
@@ -20,23 +20,23 @@ -- * Single field -- ** Lens for a single field , HasItem(..)- , item'- , itemL- , itemL'- , itemTag- , itemTag'- , genericItemTag- , itemN- , itemN'+ , HasItem'(..)+ , HasItemL(..)+ , HasItemL'(..)+ , HasItemTag(..)+ , HasItemTag'(..)+ -- , genericItemTag+ , HasItemN(..)+ , HasItemN'(..) -- * Multiple fields -- ** Lens for multiple fields- , project- , project'- , projectL- , projectL'- , projectN- , projectN'+ , HasProject(..)+ , HasProject'(..)+ , HasProjectL(..)+ , HasProjectL'(..)+ , HasProjectN(..)+ , HasProjectN'(..) ) where import Control.Lens@@ -107,7 +107,14 @@ itemL = lens (fetchL @l) (replaceL @l) -- | Variation of 'itemL'' that automatically tags and untags the field.-class HasItemTag' (l :: k) a s | s l -> a where+-- A default implementation using generics is not provided as it make GHC think that @l@ must be type @Symbol@+-- when @l@ can actually be any kind.+-- Create instances of 'HasItemTag'' using "Data.Generics.Product.Fields" as follows:+-- @+-- instance HasField' l Foo a => HasItemTag' l a Foo where+-- itemTag' = field @l+-- @+class HasItemTag' (l :: k) a s where itemTag' :: Lens' s a instance (UniqueLabelMember l xs, Tagged l x ~ KindAtLabel l xs) => HasItemTag' l x (Many xs) where@@ -117,10 +124,10 @@ class HasItemTag (l :: k) a b s t | s l -> a, t l -> b, s l b -> t, t l a -> s where itemTag :: Lens s t a b --- | Make it easy to create an instance of 'itemTag' using 'Data.Generics.Product.Fields'--- NB. This is not a default signature for HasItemTag, as this makes GHC think that l must be type 'Symbol'-genericItemTag :: forall l a b s t. (HasField l s t a b) => Lens s t a b-genericItemTag = field @l+-- -- | Make it easy to create an instance of 'itemTag' using 'Data.Generics.Product.Fields'+-- -- NB. This is not a default signature for HasItemTag, as this makes GHC think that l must be type 'Symbol'+-- genericItemTag :: forall l a b s t. (HasField l s t a b) => Lens s t a b+-- genericItemTag = field @l instance (UniqueLabelMember l xs, Tagged l x ~ KindAtLabel l xs, ys ~ Replace (Tagged l x) (Tagged l y) xs) => HasItemTag l x y (Many xs) (Many ys) where
src/Data/Diverse/Lens/Which.hs view
@@ -15,17 +15,17 @@ module Data.Diverse.Lens.Which ( -- * Single type -- ** Prism- facet- , facetL- , facetTag- , genericFacetTag- , facetN+ AsFacet(..)+ , AsFacetL(..)+ , AsFacetTag(..)+ -- , genericFacetTag+ , AsFacetN(..) -- * Multiple types -- ** Prism- , inject- , injectL- , injectN+ , AsInject(..)+ , AsInjectL(..)+ , AsInjectN(..) ) where import Control.Lens@@ -72,13 +72,20 @@ facetL = prism' (pickL @l) (trialL' @l) -- | Variation of 'fetchL' specialized to 'Tagged' which automatically tags and untags the field.+-- A default implementation using generics is not provided as it make GHC think that @l@ must be type @Symbol@+-- when @l@ can actually be any kind.+-- Create instances of 'AsFacetTag'' using "Data.Generics.Sum.Constructors" as follows:+-- @+-- instance AsConstructor' l Foo Foo a a => AsFacetTag l a Foo where+-- facetTag = _Ctor @l+-- @ class AsFacetTag (l :: k) a s | s l -> a where facetTag :: Prism' s a --- | Make it easy to create an instance of 'AsFacetTag' using 'Data.Generics.Sum.Constructors'--- NB. This is not a default signature for AsFacetTag, as this makes GHC think that l must be type 'Symbol', when actually @l@ can be any kind @k@-genericFacetTag :: forall l a s proxy. (AsConstructor l s s a a) => proxy l -> Prism' s a-genericFacetTag _ = _Ctor @l+-- -- | Make it easy to create an instance of 'AsFacetTag' using 'Data.Generics.Sum.Constructors'+-- -- NB. This is not a default signature for AsFacetTag, as this makes GHC think that l must be type 'Symbol', when actually @l@ can be any kind @k@+-- genericFacetTag :: forall l a s proxy. (AsConstructor l s s a a) => Prism' s a+-- genericFacetTag = _Ctor @l instance (UniqueLabelMember l xs, Tagged l x ~ KindAtLabel l xs) => AsFacetTag l x (Which xs) where facetTag = prism' (pickTag @l) (trialTag' @l)