on master help sign in
Add generic-optics instance
187646cSridhar Ratnakumar
jrec.cabal+3
@@ -51,6 +51,7 @@ library
51 UnicodeSyntax
51 UnicodeSyntax
52 ViewPatterns
52 ViewPatterns
53 ConstraintKinds
53 ConstraintKinds
54+ PackageImports
54
55
55 build-depends:
56 build-depends:
56 aeson
57 aeson
@@ -59,7 +60,9 @@ library
59 , deepseq
60 , deepseq
60 , generic-data
61 , generic-data
61 , generic-lens
62 , generic-lens
63+ , generic-optics
62 , ghc-prim
64 , ghc-prim
65+ , optics-core
63 , lens
66 , lens
64 , mtl
67 , mtl
65 , text
68 , text
src/JRec.hs+15−2
@@ -12,8 +12,10 @@ module JRec
12where
12where
13
13
14import Control.Lens ((&), (.~), (^.), coerced)
14import Control.Lens ((&), (.~), (^.), coerced)
15−import qualified Data.Generics.Product.Fields as GL
15+import qualified "generic-lens" Data.Generics.Product.Fields as GL
16−import qualified Data.Generics.Wrapped as GL
16+import qualified "generic-lens" Data.Generics.Wrapped as GL
17+import qualified "generic-optics" Data.Generics.Product.Fields as GO
18+import qualified "generic-optics" Data.Generics.Wrapped as GO
17import Data.Proxy
19import Data.Proxy
18import GHC.Exts (Any)
20import GHC.Exts (Any)
19import GHC.Generics
21import GHC.Generics
@@ -90,6 +92,17 @@ instance {-# OVERLAPPING #-} (R.Set field fields a' ~ fields', R.Set field field
90instance {-# OVERLAPPING #-} (R.Set field fields a ~ fields, R.Has field fields a) => GL.HasField' field (Rec fields) a where
92instance {-# OVERLAPPING #-} (R.Set field fields a ~ fields, R.Has field fields a) => GL.HasField' field (Rec fields) a where
91 field' = R.lens (R.FldProxy @field)
93 field' = R.lens (R.FldProxy @field)
92
94
95+----------------------------------------------------------------------------
96+-- generic-optics
97+----------------------------------------------------------------------------
98+
99+instance {-# OVERLAPPING #-} (R.Set field fields a' ~ fields', R.Set field fields' a ~ fields, R.Has field fields a, R.Has field fields' a') => GO.HasField field (Rec fields) (Rec fields') a a' where
100+ field = R.opticLens (R.FldProxy @field)
101+
102+instance {-# OVERLAPPING #-} (R.Set field fields a ~ fields, R.Has field fields a) => GO.HasField' field (Rec fields) a where
103+ field' = R.opticLens (R.FldProxy @field)
104+
105+
93pattern Rec ::
106pattern Rec ::
94 ( RecTuple tuple fields
107 ( RecTuple tuple fields
95 ) =>
108 ) =>
src/JRec/Field.hs+2−2
@@ -1,7 +1,7 @@
1module JRec.Field where
1module JRec.Field where
2
2
3−import qualified Data.Generics.Labels as GL
3+import qualified "generic-lens" Data.Generics.Labels as GL
4−import qualified Data.Generics.Product.Fields as GL
4+import qualified "generic-lens" Data.Generics.Product.Fields as GL
5import GHC.TypeLits
5import GHC.TypeLits
6
6
7type Field' (s :: Symbol) a b = (GL.HasField' s a b, GL.Field' s a b)
7type Field' (s :: Symbol) a b = (GL.HasField' s a b, GL.Field' s a b)
src/JRec/Super.hs+7
@@ -42,6 +42,7 @@ import GHC.ST (ST (..), runST)
42import GHC.TypeLits
42import GHC.TypeLits
43import Generic.Data (gshowsPrec)
43import Generic.Data (gshowsPrec)
44import Generic.Data.Internal.Show (GShow)
44import Generic.Data.Internal.Show (GShow)
45+import qualified Optics.Lens as OL
45import Unsafe.Coerce
46import Unsafe.Coerce
46import Prelude
47import Prelude
47
48
@@ -660,6 +661,12 @@ lens lbl f r =
660 fmap (\v -> set lbl v r) (f (get lbl r))
661 fmap (\v -> set lbl v r) (f (get lbl r))
661{-# INLINE lens #-}
662{-# INLINE lens #-}
662
663
664+opticLens ::
665+ (Has l lts v, Set l lts v' ~ lts') => FldProxy l -> OL.Lens (Rec lts) (Rec lts') v v'
666+opticLens lbl =
667+ OL.lensVL $ lens lbl
668+{-# INLINE opticLens #-}
669+
663class NoConstraint x
670class NoConstraint x
664
671
665instance NoConstraint x
672instance NoConstraint x