generic-lens 0.1.0.0 → 0.2.0.0
raw patch · 6 files changed
+22/−10 lines, 6 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- Data.Generics.Record: subtype :: forall sup sub. Subtype sub sup => Lens' sub sup
- Data.Generics.Record.Subtype: subtype :: forall sup sub. Subtype sub sup => Lens' sub sup
+ Data.Generics.Internal.Lens: combine :: Lens' (s x) a -> Lens' (t x) a -> Lens' ((:+:) s t x) a
+ Data.Generics.Internal.Lens: infixl 8 ^.
+ Data.Generics.Record: super :: forall sup sub. Subtype sub sup => Lens' sub sup
+ Data.Generics.Record.HasField: instance (Data.Generics.Record.HasField.GHasField field s a, Data.Generics.Record.HasField.GHasField field s' a) => Data.Generics.Record.HasField.GHasField field (s GHC.Generics.:+: s') a
+ Data.Generics.Record.Subtype: super :: forall sup sub. Subtype sub sup => Lens' sub sup
Files
- generic-lens.cabal +1/−1
- src/Data/Generics/Internal/Lens.hs +6/−1
- src/Data/Generics/Record.hs +1/−1
- src/Data/Generics/Record/HasField.hs +3/−0
- src/Data/Generics/Record/Internal/Contains.hs +6/−2
- src/Data/Generics/Record/Subtype.hs +5/−5
generic-lens.cabal view
@@ -1,6 +1,6 @@ name: generic-lens -version: 0.1.0.0+version: 0.2.0.0 synopsis: Generic data-structure operations exposed as lenses.
src/Data/Generics/Internal/Lens.hs view
@@ -16,7 +16,7 @@ module Data.Generics.Internal.Lens where import Control.Applicative ( Const (..) )-import GHC.Generics ( (:*:) (..), Generic (..), M1 (..), Rep )+import GHC.Generics ( (:*:) (..), Generic (..), M1 (..), Rep, (:+:) (..) ) -- | Identity functor newtype Identity a@@ -34,6 +34,7 @@ -- | Getting (^.) :: s -> ((a -> Const a a) -> s -> Const a s) -> a s ^. l = getConst (l Const s)+infixl 8 ^. -- | Setting set :: ((a -> Identity b) -> s -> Identity t) -> b -> s -> t@@ -49,6 +50,10 @@ second :: Lens' ((a :*: b) x) (b x) second f (a :*: b) = fmap (a :*:) (f b)++combine :: Lens' (s x) a -> Lens' (t x) a -> Lens' ((:+:) s t x) a+combine sa _ f (L1 s) = fmap (\a -> L1 (set sa a s)) (f (s ^. sa))+combine _ ta f (R1 t) = fmap (\a -> R1 (set ta a t)) (f (t ^. ta)) -- | A type and its generic representation are isomorphic repIso :: Generic a => Lens' a (Rep a x)
src/Data/Generics/Record.hs view
@@ -18,7 +18,7 @@ ( -- * Subtype relationship Subtype (..)- , subtype+ , super -- * Magic lens , HasField (..)
src/Data/Generics/Record/HasField.hs view
@@ -118,6 +118,9 @@ instance (GHasFieldProd field s s' a (Contains field s)) => GHasField field (s :*: s') a where glabel = prodLabel @field @_ @_ @_ @(Contains field s) +instance (GHasField field s a, GHasField field s' a) => GHasField field (s :+: s') a where+ glabel = combine (glabel @field @s) (glabel @field @s')+ instance GHasField field (S1 ('MetaSel ('Just field) p f b) (Rec0 a)) a where glabel = lensM . glabel @field
src/Data/Generics/Record/Internal/Contains.hs view
@@ -1,11 +1,9 @@ {-# LANGUAGE AllowAmbiguousTypes #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE FunctionalDependencies #-} {-# LANGUAGE PolyKinds #-} {-# LANGUAGE Rank2Types #-} {-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeOperators #-} {-# LANGUAGE UndecidableInstances #-}@@ -38,6 +36,8 @@ = 'Just t Contains field (f :*: g) = Contains field f <|> Contains field g+ Contains field (f :+: g)+ = Contains field f <&> Contains field g Contains field (S1 _ _) = 'Nothing Contains field (C1 m f)@@ -56,4 +56,8 @@ type family (a :: Maybe k) <|> (b :: Maybe k) :: Maybe k where 'Just x <|> _ = 'Just x _ <|> b = b++type family (a :: Maybe k) <&> (b :: Maybe k) :: Maybe k where+ 'Just x <&> 'Just x = 'Just x+ _ <&> _ = 'Nothing
src/Data/Generics/Record/Subtype.hs view
@@ -49,7 +49,7 @@ ----------------------------------------------------------------------------- module Data.Generics.Record.Subtype ( Subtype (..)- , subtype+ , super ) where import Data.Generics.Record.HasField@@ -86,13 +86,13 @@ -- | Structural subtype lens. Given a subtype relationship @sub :< sup@, -- we can focus on the @sub@ structure of @sup@. ----- >>> human ^. subtype @Animal+-- >>> human ^. super @Animal -- Animal {name = "Tunyasz", age = 50} ----- >>> set (subtype @Animal) (Animal "dog" 10) human+-- >>> set (super @Animal) (Animal "dog" 10) human -- Human {name = "dog", age = 10, address = "London"}-subtype :: forall sup sub. Subtype sub sup => Lens' sub sup-subtype f sub = fmap (flip smash sub) (f (upcast sub))+super :: forall sup sub. Subtype sub sup => Lens' sub sup+super f sub = fmap (flip smash sub) (f (upcast sub)) -------------------------------------------------------------------------------- -- * Generic upcasting