data-diverse-lens 3.1.0.0 → 3.1.1.0
raw patch · 5 files changed
+31/−55 lines, 5 filesdep ~data-diversePVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: data-diverse
API changes (from Hackage documentation)
- Data.Diverse.Lens.Many: class HadL l (Tagged l a) s => HadTag (l :: k) a s
- Data.Diverse.Lens.Many: class HasL l (Tagged l a) s => HasTag (l :: k) a s
- Data.Diverse.Lens.Many: instance forall k (l :: k) a s. Data.Diverse.Lens.Many.HadL l (Data.Tagged.Tagged l a) s => Data.Diverse.Lens.Many.HadTag l a s
- Data.Diverse.Lens.Many: instance forall k (l :: k) a s. Data.Diverse.Lens.Many.HasL l (Data.Tagged.Tagged l a) s => Data.Diverse.Lens.Many.HasTag l a s
- Data.Diverse.Lens.Which: class AsFacetTag (l :: k) a s | s l -> a
- Data.Diverse.Lens.Which: class AsFacetTag l a s => MatchingFacetTag l a s t | l s a -> t
- Data.Diverse.Lens.Which: instance forall k (l :: k) (xs :: [*]) x (ys :: [*]). (Data.Diverse.TypeLevel.UniqueLabelMember l xs, Data.Tagged.Tagged l x ~ Data.Diverse.TypeLevel.KindAtLabel l xs, ys ~ Data.Diverse.TypeLevel.Remove (Data.Tagged.Tagged l x) xs) => Data.Diverse.Lens.Which.MatchingFacetTag l x (Data.Diverse.Which.Internal.Which xs) (Data.Diverse.Which.Internal.Which ys)
- Data.Diverse.Lens.Which: instance forall k (l :: k) (xs :: [*]) x. (Data.Diverse.TypeLevel.UniqueLabelMember l xs, Data.Tagged.Tagged l x ~ Data.Diverse.TypeLevel.KindAtLabel l xs) => Data.Diverse.Lens.Which.AsFacetTag l x (Data.Diverse.Which.Internal.Which xs)
- Data.Diverse.Lens.Many: itemTag :: HadTag l a s => Lens s (ReplacedL l (Tagged l a) (Tagged l b) s) a b
+ Data.Diverse.Lens.Many: itemTag :: forall l a b s. Had (Tagged l a) s => Lens s (Replaced (Tagged l a) (Tagged l b) s) a b
- Data.Diverse.Lens.Many: itemTag' :: HasTag l a s => Lens' s a
+ Data.Diverse.Lens.Many: itemTag' :: forall l a s. Has (Tagged l a) s => Lens' s a
- Data.Diverse.Lens.Which: facetTag :: AsFacetTag l a s => Prism' s a
+ Data.Diverse.Lens.Which: facetTag :: forall l a s. (AsFacet (Tagged l a) s) => Prism' s a
- Data.Diverse.Lens.Which: matchingFacetTag :: MatchingFacetTag l a s t => s -> Either t a
+ Data.Diverse.Lens.Which: matchingFacetTag :: forall l a s t. MatchingFacet (Tagged l a) s t => s -> Either t a
Files
- README.md +3/−0
- data-diverse-lens.cabal +3/−3
- src/Data/Diverse/Lens/Many.hs +9/−18
- src/Data/Diverse/Lens/Which.hs +12/−30
- test/Data/Diverse/Lens/WhichSpec.hs +4/−4
README.md view
@@ -7,6 +7,9 @@ # Changelog +* 3.1.1.0+ - `itemTag` only requires `Has` and likewise `facetTag` only requires `AsFacet`.+ * 3.1.0.0 - Replaced `HasItem` with `Data.Has`.
data-diverse-lens.cabal view
@@ -1,5 +1,5 @@ name: data-diverse-lens-version: 3.1.0.0+version: 3.1.1.0 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.@@ -24,7 +24,7 @@ Data.Diverse.Profunctor.Many Data.Diverse.Profunctor.Which build-depends: base >= 4.7 && < 5- , data-diverse >= 3.0.0.0+ , data-diverse >= 3.1.0.0 , tagged >= 0.8.5 , profunctors >= 5.2 , generic-lens >= 0.5.0.0@@ -40,7 +40,7 @@ other-modules: Data.Diverse.Lens.ManySpec Data.Diverse.Lens.WhichSpec build-depends: base- , data-diverse >= 3.0.0.0+ , data-diverse >= 3.1.0.0 , data-diverse-lens , hspec >= 2 , lens >= 4
src/Data/Diverse/Lens/Many.hs view
@@ -25,11 +25,11 @@ -- ** Lens for a single field , Has(..) , item'+ , itemTag+ , itemTag' , Had(..) , HasL(..) , HadL(..)- , HasTag(..)- , HadTag(..) -- , genericItemTag , HasN(..) , HadN(..)@@ -91,6 +91,13 @@ type Replaced x b (Many xs) = Many (Replace x b xs) item = lens grab (replace @x) +itemTag' :: forall l a s. Has (Tagged l a) s => Lens' s a+itemTag' = item' @(Tagged l a) . iso unTagged Tagged++itemTag :: forall l a b s. Had (Tagged l a) s+ => Lens s (Replaced (Tagged l a) (Tagged l b) s) a b+itemTag = item @(Tagged l a) . iso unTagged (Tagged @l)+ -- | 'grabL' ('view' 'itemL') and 'replaceL' ('set' 'itemL') in 'Lens'' form. -- -- @@@ -126,22 +133,6 @@ instance (UniqueLabelMember l xs, x ~ KindAtLabel l xs) => HadL l x (Many xs) where type ReplacedL l x b (Many xs) = Many (Replace (KindAtLabel l xs) b xs) itemL = lens (grabL @l) (replaceL @l)---- | Variation of 'itemL'' that automatically tags and untags a Tagged field.--- @-class HasL l (Tagged l a) s => HasTag (l :: k) a s where- itemTag' :: Lens' s a--instance HasL l (Tagged l a) s => HasTag (l :: k) a s where- itemTag' = itemL' @l . iso unTagged Tagged---- | Polymorphic version of 'itemTag''--- @-class HadL l (Tagged l a) s => HadTag (l :: k) a s where- itemTag :: Lens s (ReplacedL l (Tagged l a) (Tagged l b) s) a b--instance HadL l (Tagged l a) s => HadTag (l :: k) a s where- itemTag = itemL @l . iso unTagged (Tagged @l) -- | 'grabN' ('view' 'item') and 'replaceN'' ('set' 'item'') in 'Lens'' form. --
src/Data/Diverse/Lens/Which.hs view
@@ -18,11 +18,10 @@ -- ** Prism AsFacet(..) , MatchingFacet(..)+ , facetTag+ , matchingFacetTag , AsFacetL(..) , MatchingFacetL(..)- , AsFacetTag(..)- , MatchingFacetTag(..)- -- , genericFacetTag , AsFacetN(..) , MatchingFacetN(..) @@ -98,6 +97,16 @@ instance (UniqueMember x xs, ys ~ Remove x xs) => MatchingFacet x (Which xs) (Which ys) where matchingFacet = trial +-- | Variation of 'facet' 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.+facetTag :: forall l a s. (AsFacet (Tagged l a) s) => Prism' s a+facetTag = facet @(Tagged l a) . iso unTagged (Tagged @l)++-- | Untagged version of 'MatchingFacet'+matchingFacetTag :: forall l a s t. MatchingFacet (Tagged l a) s t => s -> Either t a+matchingFacetTag = fmap unTagged . matchingFacet @(Tagged l a)+ -- | 'pickL' ('review' 'facetL') and 'trialL'' ('preview' 'facetL'') in 'Prism'' form. -- -- @@@ -118,33 +127,6 @@ instance (UniqueLabelMember l xs, x ~ KindAtLabel l xs, ys ~ Remove x xs) => MatchingFacetL l x (Which xs) (Which ys) where matchingFacetL = trialL @l---- | Variation of 'grabL' 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) => 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)---- | Untagged version of 'MatchingFacet'-class AsFacetTag l a s => MatchingFacetTag l a s t | l s a -> t where- matchingFacetTag :: s -> Either t a--instance (UniqueLabelMember l xs, Tagged l x ~ KindAtLabel l xs, ys ~ Remove (Tagged l x) xs)- => MatchingFacetTag l x (Which xs) (Which ys) where- matchingFacetTag = trialTag @l -- | 'pickN' ('review' 'facetN') and 'trialN' ('preview' 'facetN') in 'Prism'' form. --
test/Data/Diverse/Lens/WhichSpec.hs view
@@ -2,10 +2,10 @@ {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE RankNTypes #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeOperators #-}-{-# LANGUAGE RankNTypes #-} module Data.Diverse.Lens.WhichSpec (main, spec) where @@ -52,11 +52,11 @@ x `shouldBe` Just (Tagged 5) z `shouldBe` Nothing - it "can be constructed and destructed by label with 'facetTag'" $ do+ it "can be constructed and destructed by label with 'facetTag" $ do let y = review (facetTag @Bar) (5 :: Int) :: Which '[Tagged Foo Bool, Tagged Bar Int, Char, Bool, Char] x = preview (facetTag @Bar) y- z = preview (facetTag @Foo) y- x `shouldBe` Just 5+ z = preview (facetTag @Foo @Bool) y+ x `shouldBe` Just (5 :: Int) z `shouldBe` Nothing it "can be constructed and destructed by index with 'facetN'" $ do