@@ -1,17 +1,21 @@
1−{-# LANGUAGE DataKinds #-}
2−{-# LANGUAGE DeriveGeneric #-}
3−{-# LANGUAGE DuplicateRecordFields #-}
4−{-# LANGUAGE FlexibleContexts #-}
5−{-# LANGUAGE TypeApplications #-}
6−{-# LANGUAGE UndecidableInstances #-}
1+{-# LANGUAGE DataKinds #-}
2+{-# LANGUAGE DeriveGeneric #-}
3+{-# LANGUAGE DuplicateRecordFields #-}
4+{-# LANGUAGE FlexibleContexts #-}
5+{-# LANGUAGE NoMonomorphismRestriction #-}
6+{-# LANGUAGE PartialTypeSignatures #-}
7+{-# LANGUAGE TypeApplications #-}
8+{-# LANGUAGE UndecidableInstances #-}
79
810{-# OPTIONS_GHC -fno-warn-unused-imports #-}
911
1012module Examples where
1113
12−import GHC.Generics
14+import Data.Function ((&))
15+import Data.Generics.Internal.Lens
1316import Data.Generics.Product
14−import Control.Lens
17+import Data.Generics.Sum
18+import GHC.Generics
1519
1620data Animal = Animal
1721 { name :: String
@@ -47,12 +51,36 @@ data Test a b = Test { fieldInt :: Int, fieldA :: a, fieldB :: b } deriving (Gen
4751-- changedA :: Test Int String
4852-- >>> changedA
4953-- Test {fieldInt = 10, fieldA = 10, fieldB = "world"}
50−changedA = set (field @"fieldA") (10 :: Int) (Test 10 "hello" "world")
54+changedA = Test 10 "hello" "world" & field @"fieldA" .~ (10 :: Int)
5155
5256-- changedB :: Test String Int
5357-- >>> changedB
5458-- Test {fieldInt = 10, fieldA = "hello", fieldB = 10}
55−changedB = set (field @"fieldB") (10 :: Int) (Test 10 "hello" "world")
59+changedB = (Test 10 "hello" "world") & field @"fieldB" .~ (10 :: Int)
5660
5761--changedInt = set (field @"fieldInt") ("hello") (Test 10 "hello" "world")
5862-- type error
63+
64+data Animal2 a
65+ = Dog (Dog a)
66+ | Cat Name Age
67+ | Duck Age
68+ deriving (Generic, Show)
69+
70+data Dog a
71+ = MkDog
72+ { name :: Name
73+ , age :: Age
74+ , fieldA :: a
75+ }
76+ deriving (Generic, Show)
77+type Name = String
78+type Age = Int
79+dog, cat, duck :: Animal2 Int
80+dog = Dog (MkDog "Shep" 3 30)
81+cat = Cat "Mog" 5
82+duck = Duck 2
83+
84+
85+--dog' :: Animal2 String
86+dog' = dog & _Ctor @"Dog" . field @"fieldA" .~ "now it's a String"