on 3961716 help sign in
.github/FUNDING.ymldeleted−12
since splitsnapshots
unifiedsplit
@@ -1,12 +0,0 @@
1−# These are supported funding model platforms
2−
3−github: [kcsongor] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
4−patreon: # Replace with a single Patreon username
5−open_collective: # Replace with a single Open Collective username
6−ko_fi: # Replace with a single Ko-fi username
7−tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
8−community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
9−liberapay: # Replace with a single Liberapay username
10−issuehunt: # Replace with a single IssueHunt username
11−otechie: # Replace with a single Otechie username
12−custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
.gitignore−3
@@ -7,6 +7,3 @@ cabal.sandbox.config
7*.hi
7*.hi
8*.o
8*.o
9core-html
9core-html
10−*~
11−*.org
12−cabal.project.local
.travis.yml+71−132
@@ -1,155 +1,94 @@
1# This Travis job script has been generated by a script via
1# This Travis job script has been generated by a script via
2#
2#
3−# haskell-ci '--config=cabal.haskell-ci' 'cabal.project'
3+# make_travis_yml_2.hs 'generic-lens.cabal'
4#
4#
5−# For more information, see https://github.com/haskell-CI/haskell-ci
5+# For more information, see https://github.com/hvr/multi-ghc-travis
6−#
7−# version: 0.5.20190908
8#
6#
9language: c
7language: c
10−dist: xenial
8+sudo: false
9+
11git:
10git:
12− # whether to recursively clone submodules
11+ submodules: false # whether to recursively clone submodules
13− submodules: false
12+
14cache:
13cache:
15 directories:
14 directories:
16 - $HOME/.cabal/packages
15 - $HOME/.cabal/packages
17 - $HOME/.cabal/store
16 - $HOME/.cabal/store
17+
18before_cache:
18before_cache:
19− - rm -fv $CABALHOME/packages/hackage.haskell.org/build-reports.log
19+ - rm -fv $HOME/.cabal/packages/hackage.haskell.org/build-reports.log
20 # remove files that are regenerated by 'cabal update'
20 # remove files that are regenerated by 'cabal update'
21− - rm -fv $CABALHOME/packages/hackage.haskell.org/00-index.*
21+ - rm -fv $HOME/.cabal/packages/hackage.haskell.org/00-index.*
22− - rm -fv $CABALHOME/packages/hackage.haskell.org/*.json
22+ - rm -fv $HOME/.cabal/packages/hackage.haskell.org/*.json
23− - rm -fv $CABALHOME/packages/hackage.haskell.org/01-index.cache
23+ - rm -fv $HOME/.cabal/packages/hackage.haskell.org/01-index.cache
24− - rm -fv $CABALHOME/packages/hackage.haskell.org/01-index.tar
24+ - rm -fv $HOME/.cabal/packages/hackage.haskell.org/01-index.tar
25− - rm -fv $CABALHOME/packages/hackage.haskell.org/01-index.tar.idx
25+ - rm -fv $HOME/.cabal/packages/hackage.haskell.org/01-index.tar.idx
26− - rm -rfv $CABALHOME/packages/head.hackage
26+
27matrix:
27matrix:
28 include:
28 include:
29− - compiler: ghc-8.8.1
29+ - compiler: "ghc-8.0.2"
30+ # env: TEST=--disable-tests BENCH=--disable-benchmarks
30− addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-8.8.1","cabal-install-3.0"]}}
31+ addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-8.0.2], sources: [hvr-ghc]}}
31− - compiler: ghc-8.6.5
32+ - compiler: "ghc-8.2.1"
32− addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-8.6.5","cabal-install-3.0"]}}
33+ # env: TEST=--disable-tests BENCH=--disable-benchmarks
33− - compiler: ghc-8.4.4
34− addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-8.4.4","cabal-install-3.0"]}}
34+ addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-8.2.1], sources: [hvr-ghc]}}
35− - compiler: ghc-8.4.1
36− addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-8.4.1","cabal-install-3.0"]}}
37− - compiler: ghc-8.2.2
35+ - compiler: "ghc-8.2.2"
38− addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-8.2.2","cabal-install-3.0"]}}
36+ # env: TEST=--disable-tests BENCH=--disable-benchmarks
37+ addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-8.2.2], sources: [hvr-ghc]}}
39− - compiler: ghc-8.0.2
38+ - compiler: "ghc-8.4.1"
40− addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-8.0.2","cabal-install-3.0"]}}
39+ # env: TEST=--disable-tests BENCH=--disable-benchmarks
40+ addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-8.4.1], sources: [hvr-ghc]}}
41+
41before_install:
42before_install:
42− - HC=$(echo "/opt/$CC/bin/ghc" | sed 's/-/\//')
43+ - HC=${CC}
43− - WITHCOMPILER="-w $HC"
44− - HADDOCK=$(echo "/opt/$CC/bin/haddock" | sed 's/-/\//')
45− - HCPKG="$HC-pkg"
44+ - HCPKG=${HC/ghc/ghc-pkg}
46 - unset CC
45 - unset CC
47− - CABAL=/opt/ghc/bin/cabal
46+ - PATH=/opt/ghc/bin:/opt/ghc-ppa-tools/bin:$PATH
48− - CABALHOME=$HOME/.cabal
47+
49− - export PATH="$CABALHOME/bin:$PATH"
50− - TOP=$(pwd)
51− - "HCNUMVER=$(${HC} --numeric-version|perl -ne '/^(\\d+)\\.(\\d+)\\.(\\d+)(\\.(\\d+))?$/; print(10000 * $1 + 100 * $2 + ($3 == 0 ? $5 != 1 : $3))')"
52− - echo $HCNUMVER
53− - CABAL="$CABAL -vnormal+nowrap+markoutput"
54− - set -o pipefail
55− - |
56− echo 'function blue(s) { printf "\033[0;34m" s "\033[0m " }' >> .colorful.awk
57− echo 'BEGIN { state = "output"; }' >> .colorful.awk
58− echo '/^-----BEGIN CABAL OUTPUT-----$/ { state = "cabal" }' >> .colorful.awk
59− echo '/^-----END CABAL OUTPUT-----$/ { state = "output" }' >> .colorful.awk
60− echo '!/^(-----BEGIN CABAL OUTPUT-----|-----END CABAL OUTPUT-----)/ {' >> .colorful.awk
61− echo ' if (state == "cabal") {' >> .colorful.awk
62− echo ' print blue($0)' >> .colorful.awk
63− echo ' } else {' >> .colorful.awk
64− echo ' print $0' >> .colorful.awk
65− echo ' }' >> .colorful.awk
66− echo '}' >> .colorful.awk
67− - cat .colorful.awk
68− - |
69− color_cabal_output () {
70− awk -f $TOP/.colorful.awk
71− }
72− - echo text | color_cabal_output
73install:
48install:
74− - ${CABAL} --version
49+ - cabal --version
75 - echo "$(${HC} --version) [$(${HC} --print-project-git-commit-id 2> /dev/null || echo '?')]"
50 - echo "$(${HC} --version) [$(${HC} --print-project-git-commit-id 2> /dev/null || echo '?')]"
76− - TEST=--enable-tests
77− - if [ $HCNUMVER -ge 80600 ] ; then TEST=--disable-tests ; fi
78− - BENCH=--enable-benchmarks
51+ - BENCH=${BENCH---enable-benchmarks}
79− - if [ $HCNUMVER -ge 80800 ] ; then BENCH=--disable-benchmarks ; fi
52+ - TEST=${TEST---enable-tests}
80− - HEADHACKAGE=false
53+ - HADDOCK=${HADDOCK-true}
81− - rm -f $CABALHOME/config
54+ - INSTALLED=${INSTALLED-true}
82− - |
83− echo "verbose: normal +nowrap +markoutput" >> $CABALHOME/config
84− echo "remote-build-reporting: anonymous" >> $CABALHOME/config
85− echo "write-ghc-environment-files: always" >> $CABALHOME/config
86− echo "remote-repo-cache: $CABALHOME/packages" >> $CABALHOME/config
87− echo "logs-dir: $CABALHOME/logs" >> $CABALHOME/config
88− echo "world-file: $CABALHOME/world" >> $CABALHOME/config
89− echo "extra-prog-path: $CABALHOME/bin" >> $CABALHOME/config
90− echo "symlink-bindir: $CABALHOME/bin" >> $CABALHOME/config
91− echo "installdir: $CABALHOME/bin" >> $CABALHOME/config
92− echo "build-summary: $CABALHOME/logs/build.log" >> $CABALHOME/config
93− echo "store-dir: $CABALHOME/store" >> $CABALHOME/config
94− echo "install-dirs user" >> $CABALHOME/config
95− echo " prefix: $CABALHOME" >> $CABALHOME/config
96− echo "repository hackage.haskell.org" >> $CABALHOME/config
97− echo " url: http://hackage.haskell.org/" >> $CABALHOME/config
98− - |
99− echo "program-default-options" >> $CABALHOME/config
100− echo " ghc-options: $GHCJOBS +RTS -M6G -RTS" >> $CABALHOME/config
101− - cat $CABALHOME/config
102− - rm -fv cabal.project cabal.project.local cabal.project.freeze
103− - travis_retry ${CABAL} v2-update -v
55+ - travis_retry cabal update -v
104− # Generate cabal.project
56+ - sed -i.bak 's/^jobs:/-- jobs:/' ${HOME}/.cabal/config
105− - rm -rf cabal.project cabal.project.local cabal.project.freeze
106− - touch cabal.project
107− - |
108− echo "packages: ." >> cabal.project
57+ - rm -fv cabal.project.local
109− - |
58+ - "echo 'packages: .' > cabal.project"
110− - "for pkg in $($HCPKG list --simple-output); do echo $pkg | sed 's/-[^-]*$//' | (grep -vE -- '^(generic-lens)$' || true) | sed 's/^/constraints: /' | sed 's/$/ installed/' >> cabal.project.local; done"
111− - cat cabal.project || true
112− - cat cabal.project.local || true
113− - if [ -f "./configure.ac" ]; then (cd "." && autoreconf -i); fi
59+ - if [ -f "./configure.ac" ]; then
114− - ${CABAL} v2-freeze $WITHCOMPILER ${TEST} ${BENCH} | color_cabal_output
60+ (cd "."; autoreconf -i);
61+ fi
115− - "cat cabal.project.freeze | sed -E 's/^(constraints: *| *)//' | sed 's/any.//'"
62+ - rm -f cabal.project.freeze
116− - rm cabal.project.freeze
63+ - cabal new-build -w ${HC} ${TEST} ${BENCH} --project-file="cabal.project" --dep -j2 all
117− - ${CABAL} v2-build $WITHCOMPILER ${TEST} ${BENCH} --dep -j2 all | color_cabal_output
118− - ${CABAL} v2-build $WITHCOMPILER --disable-tests --disable-benchmarks --dep -j2 all | color_cabal_output
64+ - cabal new-build -w ${HC} --disable-tests --disable-benchmarks --project-file="cabal.project" --dep -j2 all
119−script:
65+ - rm -rf "."/.ghc.environment.* "."/dist
120 - DISTDIR=$(mktemp -d /tmp/dist-test.XXXX)
66 - DISTDIR=$(mktemp -d /tmp/dist-test.XXXX)
121− # Packaging...
67+
122− - ${CABAL} v2-sdist all | color_cabal_output
68+# Here starts the actual work to be performed for the package under test;
123− # Unpacking...
69+# any command which exits with a non-zero exit code causes the build to fail.
70+script:
71+ # test that source-distributions can be generated
72+ - (cd "."; cabal sdist)
124− - mv dist-newstyle/sdist/*.tar.gz ${DISTDIR}/
73+ - mv "."/dist/generic-lens-*.tar.gz ${DISTDIR}/
125− - cd ${DISTDIR} || false
74+ - cd ${DISTDIR}
126− - find . -maxdepth 1 -type f -name '*.tar.gz' -exec tar -xvf '{}' \;
75+ - find . -maxdepth 1 -name '*.tar.gz' -exec tar -xvf '{}' \;
127− - find . -maxdepth 1 -type f -name '*.tar.gz' -exec rm '{}' \;
76+ - "printf 'packages: generic-lens-*/*.cabal' > cabal.project"
128− - PKGDIR_generic_lens="$(find . -maxdepth 1 -type d -regex '.*/generic-lens-[0-9.]*')"
129− # Generate cabal.project
130− - rm -rf cabal.project cabal.project.local cabal.project.freeze
131− - touch cabal.project
132− - |
133− echo "packages: ${PKGDIR_generic_lens}" >> cabal.project
134− - |
135− - "for pkg in $($HCPKG list --simple-output); do echo $pkg | sed 's/-[^-]*$//' | (grep -vE -- '^(generic-lens)$' || true) | sed 's/^/constraints: /' | sed 's/$/ installed/' >> cabal.project.local; done"
136− - cat cabal.project || true
137− - cat cabal.project.local || true
138− # Building...
139 # this builds all libraries and executables (without tests/benchmarks)
77 # this builds all libraries and executables (without tests/benchmarks)
140− - ${CABAL} v2-build $WITHCOMPILER --disable-tests --disable-benchmarks all | color_cabal_output
78+ - cabal new-build -w ${HC} --disable-tests --disable-benchmarks all
141− # Building with tests and benchmarks...
79+
80+ # Build with installed constraints for packages in global-db
81+ - if $INSTALLED; then
82+ echo cabal new-build -w ${HC} --disable-tests --disable-benchmarks $(${HCPKG} list --global --simple-output --names-only | sed 's/\([a-zA-Z0-9-]\{1,\}\) */--constraint="\1 installed" /g') all | sh;
83+ else echo "Not building with installed constraints"; fi
84+
142 # build & run tests, build benchmarks
85 # build & run tests, build benchmarks
143− - ${CABAL} v2-build $WITHCOMPILER ${TEST} ${BENCH} all | color_cabal_output
86+ - cabal new-build -w ${HC} ${TEST} ${BENCH} all
144− # Testing...
87+ - if [ "x$TEST" = "x--enable-tests" ]; then cabal new-test -w ${HC} ${TEST} all; fi
145− - if [ $HCNUMVER -lt 80600 ] ; then ${CABAL} v2-test $WITHCOMPILER ${TEST} ${BENCH} all | color_cabal_output ; fi
88+
146− # cabal check...
147− - (cd ${PKGDIR_generic_lens} && ${CABAL} -vnormal check)
148− # haddock...
89+ # haddock
149− - ${CABAL} v2-haddock $WITHCOMPILER --with-haddock $HADDOCK ${TEST} ${BENCH} all | color_cabal_output
90+ - rm -rf ./dist-newstyle
150− # Building without installed constraints for packages in global-db...
91+ - if $HADDOCK; then cabal new-haddock -w ${HC} --disable-tests --disable-benchmarks all; else echo "Skipping haddock generation";fi
151− - rm -f cabal.project.local
152− - ${CABAL} v2-build $WITHCOMPILER --disable-tests --disable-benchmarks all | color_cabal_output
153
92
154−# REGENDATA ["--config=cabal.haskell-ci","cabal.project"]
93+# REGENDATA ["generic-lens.cabal"]
155# EOF
94# EOF
ChangeLog.md−13
@@ -1,22 +1,9 @@
1−## 1.2.0.1
2−- Give HasAny/AsAny the same VTA behavior on 8.6 and 8.8 (Ryan Scott)
3−
4−## 1.2.0.0
5−- Add `HasTypesUsing` and `HasTypesCustom` for custom traversals (Lysxia)
6−- Improve type errors when no Generic instance is defined
7−- `types` now supports Text by default
8−
9−### Breaking API changes
10−- `HasType` now includes a reflexive case so that every type 'contains' itself (Matt Parsons)
11−- `AsSubtype` and `Subtype` now include a reflexive case so that every type is a subtype of itself
12−
13## 1.1.0.0
1## 1.1.0.0
14- Fix regression in type inference for polymorphic optics
2- Fix regression in type inference for polymorphic optics
15- Add `HasField0`, `HasPosition0`, `AsConstructor0`, `HasField_`, `HasPositon_`, and `AsConstructor_` (Lysxia)
3- Add `HasField0`, `HasPosition0`, `AsConstructor0`, `HasField_`, `HasPositon_`, and `AsConstructor_` (Lysxia)
16- `types` now supports Data.Word and Data.Int (Lysxia)
4- `types` now supports Data.Word and Data.Int (Lysxia)
17- Add `Wrapped` iso for newtypes (Isaac Elliott)
5- Add `Wrapped` iso for newtypes (Isaac Elliott)
18- Expose internals through Data.GenericLens.Internal
6- Expose internals through Data.GenericLens.Internal
19−- Add labels for prisms (Daniel Winograd-Cort)
20
7
21## 1.0.0.2
8## 1.0.0.2
22- Fix compile-time performance regression
9- Fix compile-time performance regression
LICENSE+1−1
@@ -1,4 +1,4 @@
1−Copyright (c) 2019, Csongor Kiss
1+Copyright (c) 2018, Csongor Kiss
2
2
3All rights reserved.
3All rights reserved.
4
4
cabal.haskell-cideleted−5
@@ -1,5 +0,0 @@
1−-- inspection tests fail
2−tests: <8.6
3−
4−-- blocked on vector-th-unbox
5−benchmarks: <8.8
cabal.project−1
@@ -1,2 +1 @@
1packages: generic-lens.cabal
1packages: generic-lens.cabal
2−write-ghc-environment-files: always
generic-lens.cabal+6−9
@@ -1,5 +1,5 @@
1name: generic-lens
1name: generic-lens
2−version: 1.2.0.1
2+version: 1.1.0.0
3synopsis: Generically derive traversals, lenses and prisms.
3synopsis: Generically derive traversals, lenses and prisms.
4description: This library uses GHC.Generics to derive efficient optics (traversals, lenses and prisms) for algebraic data types in a type-directed way, with a focus on good type inference and error messages when possible.
4description: This library uses GHC.Generics to derive efficient optics (traversals, lenses and prisms) for algebraic data types in a type-directed way, with a focus on good type inference and error messages when possible.
5
5
@@ -11,7 +11,7 @@ maintainer: kiss.csongor.kiss@gmail.com
11category: Generics, Records, Lens
11category: Generics, Records, Lens
12build-type: Simple
12build-type: Simple
13cabal-version: >= 1.10
13cabal-version: >= 1.10
14−Tested-With: GHC == 8.0.2, GHC == 8.2.2, GHC == 8.4.1, GHC == 8.4.4, GHC == 8.6.5, GHC == 8.8.1
14+Tested-With: GHC == 8.0.2, GHC == 8.2.1, GHC == 8.4.1, GHC == 8.4.3
15
15
16extra-source-files: ChangeLog.md
16extra-source-files: ChangeLog.md
17 , examples/StarWars.hs
17 , examples/StarWars.hs
@@ -34,7 +34,6 @@ library
34 , Data.Generics.Product.Types
34 , Data.Generics.Product.Types
35 , Data.Generics.Product.Constraints
35 , Data.Generics.Product.Constraints
36 , Data.Generics.Product.HList
36 , Data.Generics.Product.HList
37− , Data.Generics.Labels
38 , Data.Generics.Internal.GenericN
37 , Data.Generics.Internal.GenericN
39
38
40 , Data.Generics.Sum
39 , Data.Generics.Sum
@@ -56,7 +55,6 @@ library
56 , Data.Generics.Internal.Families.Changing
55 , Data.Generics.Internal.Families.Changing
57 , Data.Generics.Internal.Families.Collect
56 , Data.Generics.Internal.Families.Collect
58 , Data.Generics.Internal.Families.Has
57 , Data.Generics.Internal.Families.Has
59− , Data.Generics.Internal.Errors
60 , Data.Generics.Internal.Void
58 , Data.Generics.Internal.Void
61
59
62 , Data.Generics.Sum.Internal.Constructors
60 , Data.Generics.Sum.Internal.Constructors
@@ -70,10 +68,9 @@ library
70 , Data.Generics.Product.Internal.Constraints
68 , Data.Generics.Product.Internal.Constraints
71 , Data.Generics.Product.Internal.HList
69 , Data.Generics.Product.Internal.HList
72
70
73− build-depends: base >= 4.9 && < 5
71+ build-depends: base >= 4.9 && <= 5.0
74− , profunctors >= 5.0 && < 6.0
72+ , profunctors >= 5.0 && <= 6.0
75− , tagged >= 0.8 && < 1
73+ , tagged >= 0.8 && <= 0.9
76− , text >= 1.2 && < 1.3
77
74
78 hs-source-dirs: src
75 hs-source-dirs: src
79 default-language: Haskell2010
76 default-language: Haskell2010
@@ -103,7 +100,7 @@ test-suite generic-lens-test
103 type: exitcode-stdio-1.0
100 type: exitcode-stdio-1.0
104 hs-source-dirs: test
101 hs-source-dirs: test
105 main-is: Spec.hs
102 main-is: Spec.hs
106− other-modules: Util Test24 Test25 Test40 Test62 Test63 CustomChildren
103+ other-modules: Util Test24 Test25 Test40 Test62 Test63
107
104
108 build-depends: base >= 4.9 && <= 5.0
105 build-depends: base >= 4.9 && <= 5.0
109 , generic-lens
106 , generic-lens
src/Data/GenericLens/Internal.hs+1−18
@@ -1,7 +1,7 @@
1-----------------------------------------------------------------------------
1-----------------------------------------------------------------------------
2-- |
2-- |
3-- Module : Data.GenericLens.Internal
3-- Module : Data.GenericLens.Internal
4−-- Copyright : (C) 2019 Csongor Kiss
4+-- Copyright : (C) 2018 Csongor Kiss
5-- License : BSD3
5-- License : BSD3
6-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
6-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
7-- Stability : experimental
7-- Stability : experimental
@@ -18,7 +18,6 @@ module Data.GenericLens.Internal
18 , module Data.Generics.Internal.Families.Collect
18 , module Data.Generics.Internal.Families.Collect
19 , module Data.Generics.Internal.Families.Has
19 , module Data.Generics.Internal.Families.Has
20 , module Data.Generics.Internal.Void
20 , module Data.Generics.Internal.Void
21− , module Data.Generics.Internal.Errors
22
21
23 , module Data.Generics.Sum.Internal.Constructors
22 , module Data.Generics.Sum.Internal.Constructors
24 , module Data.Generics.Sum.Internal.Typed
23 , module Data.Generics.Sum.Internal.Typed
@@ -29,14 +28,6 @@ module Data.GenericLens.Internal
29 , module Data.Generics.Product.Internal.Subtype
28 , module Data.Generics.Product.Internal.Subtype
30 , module Data.Generics.Product.Internal.Constraints
29 , module Data.Generics.Product.Internal.Constraints
31 , module Data.Generics.Product.Internal.HList
30 , module Data.Generics.Product.Internal.HList
32−
33− , module Data.Generics.Internal.GenericN
34−
35− -- * van Laarhoven optics
36− , module Data.Generics.Internal.VL.Iso
37− , module Data.Generics.Internal.VL.Lens
38− , module Data.Generics.Internal.VL.Prism
39− , module Data.Generics.Internal.VL.Traversal
40 ) where
31 ) where
41
32
42import Data.Generics.Internal.Families
33import Data.Generics.Internal.Families
@@ -44,7 +35,6 @@ import Data.Generics.Internal.Families.Changing
44import Data.Generics.Internal.Families.Collect
35import Data.Generics.Internal.Families.Collect
45import Data.Generics.Internal.Families.Has
36import Data.Generics.Internal.Families.Has
46import Data.Generics.Internal.Void
37import Data.Generics.Internal.Void
47−import Data.Generics.Internal.Errors
48
38
49import Data.Generics.Sum.Internal.Constructors
39import Data.Generics.Sum.Internal.Constructors
50import Data.Generics.Sum.Internal.Typed
40import Data.Generics.Sum.Internal.Typed
@@ -55,10 +45,3 @@ import Data.Generics.Product.Internal.GLens
55import Data.Generics.Product.Internal.Subtype
45import Data.Generics.Product.Internal.Subtype
56import Data.Generics.Product.Internal.Constraints
46import Data.Generics.Product.Internal.Constraints
57import Data.Generics.Product.Internal.HList
47import Data.Generics.Product.Internal.HList
58−
59−import Data.Generics.Internal.GenericN
60−
61−import Data.Generics.Internal.VL.Iso
62−import Data.Generics.Internal.VL.Lens
63−import Data.Generics.Internal.VL.Prism
64−import Data.Generics.Internal.VL.Traversal
src/Data/Generics/Internal/Errors.hsdeleted−59
@@ -1,59 +0,0 @@
1−{-# LANGUAGE UndecidableInstances #-}
2−{-# LANGUAGE TypeFamilies #-}
3−{-# LANGUAGE KindSignatures #-}
4−{-# LANGUAGE PolyKinds #-}
5−{-# LANGUAGE DataKinds #-}
6−{-# LANGUAGE TypeOperators #-}
7−{-# LANGUAGE KindSignatures #-}
8−
9−-------------------------------------------------------------------------------
10−---- |
11−---- Module : Data.Generics.Internal.Errors
12−---- Copyright : (C) 2019 Csongor Kiss
13−---- License : BSD3
14−---- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
15−---- Stability : experimental
16−---- Portability : non-portable
17−----
18−---- Provide more legible type errors as described in
19−---- (https://kcsongor.github.io/report-stuck-families/)[this blog post].
20−-------------------------------------------------------------------------------
21−
22−module Data.Generics.Internal.Errors
23− ( NoGeneric
24− , Defined
25− , Defined_list
26−
27− , QuoteType
28− , PrettyError
29− ) where
30−
31−import GHC.Generics
32−import GHC.TypeLits
33−import Data.Kind
34−
35−type family NoGeneric (a :: Type) (ctxt :: [ErrorMessage]) :: Constraint where
36− NoGeneric a ctxt = PrettyError ('Text "No instance for " ':<>: QuoteType (Generic a)
37− ': ctxt)
38−type family PrettyError (ctxt :: [ErrorMessage]) :: k where
39− PrettyError '[] = TypeError ('Text "")
40− PrettyError (c ': cs) = TypeError ('Text "| " ':<>: c ':$$: PrettyLines cs)
41−
42−type family PrettyLines (ctxt :: [ErrorMessage]) :: ErrorMessage where
43− PrettyLines '[] = 'Text ""
44− PrettyLines (c ': cs) = 'Text "| " ':<>: c ':$$: PrettyLines cs
45−
46−type family Defined (break :: Type -> Type) (err :: Constraint) (a :: k) :: k where
47− Defined Void1 _ _ = Any
48− Defined _ _ k = k
49−
50−type family Defined_list (break :: [*]) (err :: Constraint) (a :: k) :: k where
51− Defined_list '[Void] _ _ = Any
52− Defined_list _ _ k = k
53−
54−data Void1 a
55−data Void
56−type family Any :: k
57−
58−type family QuoteType (typ :: k) :: ErrorMessage where
59− QuoteType typ = 'Text "‘" ':<>: 'ShowType typ ':<>: 'Text "’"
src/Data/Generics/Internal/Families.hs+1−1
@@ -9,7 +9,7 @@
9-----------------------------------------------------------------------------
9-----------------------------------------------------------------------------
10-- |
10-- |
11-- Module : Data.Generics.Internal.Families
11-- Module : Data.Generics.Internal.Families
12−-- Copyright : (C) 2019 Csongor Kiss
12+-- Copyright : (C) 2018 Csongor Kiss
13-- License : BSD3
13-- License : BSD3
14-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
14-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
15-- Stability : experimental
15-- Stability : experimental
src/Data/Generics/Internal/Families/Collect.hs+1−1
@@ -7,7 +7,7 @@
7-----------------------------------------------------------------------------
7-----------------------------------------------------------------------------
8-- |
8-- |
9-- Module : Data.Generics.Internal.Families.Collect
9-- Module : Data.Generics.Internal.Families.Collect
10−-- Copyright : (C) 2019 Csongor Kiss
10+-- Copyright : (C) 2018 Csongor Kiss
11-- License : BSD3
11-- License : BSD3
12-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
12-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
13-- Stability : experimental
13-- Stability : experimental
src/Data/Generics/Internal/Families/Has.hs+1−1
@@ -7,7 +7,7 @@
7-----------------------------------------------------------------------------
7-----------------------------------------------------------------------------
8-- |
8-- |
9-- Module : Data.Generics.Internal.Families.Has
9-- Module : Data.Generics.Internal.Families.Has
10−-- Copyright : (C) 2019 Csongor Kiss
10+-- Copyright : (C) 2018 Csongor Kiss
11-- License : BSD3
11-- License : BSD3
12-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
12-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
13-- Stability : experimental
13-- Stability : experimental
src/Data/Generics/Internal/GenericN.hs+2−3
@@ -1,4 +1,3 @@
1−{-# OPTIONS_HADDOCK hide #-}
2{-# LANGUAGE DataKinds #-}
1{-# LANGUAGE DataKinds #-}
3{-# LANGUAGE FlexibleContexts #-}
2{-# LANGUAGE FlexibleContexts #-}
4{-# LANGUAGE FlexibleInstances #-}
3{-# LANGUAGE FlexibleInstances #-}
@@ -12,9 +11,9 @@
12--------------------------------------------------------------------------------
11--------------------------------------------------------------------------------
13-- |
12-- |
14-- Module : Data.Generics.Internal.GenericN
13-- Module : Data.Generics.Internal.GenericN
15−-- Copyright : (C) 2019 Csongor Kiss
14+-- Copyright : (C) 2018 Csongor Kiss
16−-- License : BSD3
17-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
15-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
16+-- License : BSD3
18-- Stability : experimental
17-- Stability : experimental
19-- Portability : non-portable
18-- Portability : non-portable
20--
19--
src/Data/Generics/Internal/Profunctor/Iso.hs+1−2
@@ -1,4 +1,3 @@
1−{-# OPTIONS_HADDOCK hide #-}
2{-# LANGUAGE TupleSections #-}
1{-# LANGUAGE TupleSections #-}
3{-# LANGUAGE GADTs #-}
2{-# LANGUAGE GADTs #-}
4{-# LANGUAGE NoMonomorphismRestriction #-}
3{-# LANGUAGE NoMonomorphismRestriction #-}
@@ -11,7 +10,7 @@
11-----------------------------------------------------------------------------
10-----------------------------------------------------------------------------
12-- |
11-- |
13-- Module : Data.Generics.Internal.Profunctor.Iso
12-- Module : Data.Generics.Internal.Profunctor.Iso
14−-- Copyright : (C) 2019 Csongor Kiss
13+-- Copyright : (C) 2018 Csongor Kiss
15-- License : BSD3
14-- License : BSD3
16-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
15-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
17-- Stability : experimental
16-- Stability : experimental
src/Data/Generics/Internal/Profunctor/Lens.hs+1−2
@@ -1,4 +1,3 @@
1−{-# OPTIONS_HADDOCK hide #-}
2{-# LANGUAGE GADTs #-}
1{-# LANGUAGE GADTs #-}
3{-# LANGUAGE NoMonomorphismRestriction #-}
2{-# LANGUAGE NoMonomorphismRestriction #-}
4{-# LANGUAGE Rank2Types #-}
3{-# LANGUAGE Rank2Types #-}
@@ -11,7 +10,7 @@
11-----------------------------------------------------------------------------
10-----------------------------------------------------------------------------
12-- |
11-- |
13-- Module : Data.Generics.Internal.Profunctor.Lens
12-- Module : Data.Generics.Internal.Profunctor.Lens
14−-- Copyright : (C) 2019 Csongor Kiss
13+-- Copyright : (C) 2018 Csongor Kiss
15-- License : BSD3
14-- License : BSD3
16-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
15-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
17-- Stability : experimental
16-- Stability : experimental
src/Data/Generics/Internal/Profunctor/Prism.hs+1−2
@@ -1,4 +1,3 @@
1−{-# OPTIONS_HADDOCK hide #-}
2{-# LANGUAGE GADTs #-}
1{-# LANGUAGE GADTs #-}
3{-# LANGUAGE LambdaCase #-}
2{-# LANGUAGE LambdaCase #-}
4{-# LANGUAGE NoMonomorphismRestriction #-}
3{-# LANGUAGE NoMonomorphismRestriction #-}
@@ -11,7 +10,7 @@
11-----------------------------------------------------------------------------
10-----------------------------------------------------------------------------
12-- |
11-- |
13-- Module : Data.Generics.Internal.Profunctor.Prism
12-- Module : Data.Generics.Internal.Profunctor.Prism
14−-- Copyright : (C) 2019 Csongor Kiss
13+-- Copyright : (C) 2018 Csongor Kiss
15-- License : BSD3
14-- License : BSD3
16-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
15-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
17-- Stability : experimental
16-- Stability : experimental
src/Data/Generics/Internal/VL/Iso.hs+1−2
@@ -1,4 +1,3 @@
1−{-# OPTIONS_HADDOCK hide #-}
2{-# LANGUAGE GADTs #-}
1{-# LANGUAGE GADTs #-}
3{-# LANGUAGE NoMonomorphismRestriction #-}
2{-# LANGUAGE NoMonomorphismRestriction #-}
4{-# LANGUAGE Rank2Types #-}
3{-# LANGUAGE Rank2Types #-}
@@ -10,7 +9,7 @@
10-----------------------------------------------------------------------------
9-----------------------------------------------------------------------------
11-- |
10-- |
12-- Module : Data.Generics.Internal.VL.Iso
11-- Module : Data.Generics.Internal.VL.Iso
13−-- Copyright : (C) 2019 Csongor Kiss
12+-- Copyright : (C) 2018 Csongor Kiss
14-- License : BSD3
13-- License : BSD3
15-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
14-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
16-- Stability : experimental
15-- Stability : experimental
src/Data/Generics/Internal/VL/Lens.hs+1−2
@@ -1,4 +1,3 @@
1−{-# OPTIONS_HADDOCK hide #-}
2{-# LANGUAGE GADTs #-}
1{-# LANGUAGE GADTs #-}
3{-# LANGUAGE NoMonomorphismRestriction #-}
2{-# LANGUAGE NoMonomorphismRestriction #-}
4{-# LANGUAGE Rank2Types #-}
3{-# LANGUAGE Rank2Types #-}
@@ -11,7 +10,7 @@
11-----------------------------------------------------------------------------
10-----------------------------------------------------------------------------
12-- |
11-- |
13-- Module : Data.Generics.Internal.VL.Lens
12-- Module : Data.Generics.Internal.VL.Lens
14−-- Copyright : (C) 2019 Csongor Kiss
13+-- Copyright : (C) 2018 Csongor Kiss
15-- License : BSD3
14-- License : BSD3
16-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
15-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
17-- Stability : experimental
16-- Stability : experimental
src/Data/Generics/Internal/VL/Prism.hs+1−2
@@ -1,4 +1,3 @@
1−{-# OPTIONS_HADDOCK hide #-}
2{-# LANGUAGE GADTs #-}
1{-# LANGUAGE GADTs #-}
3{-# LANGUAGE NoMonomorphismRestriction #-}
2{-# LANGUAGE NoMonomorphismRestriction #-}
4{-# LANGUAGE Rank2Types #-}
3{-# LANGUAGE Rank2Types #-}
@@ -10,7 +9,7 @@
10-----------------------------------------------------------------------------
9-----------------------------------------------------------------------------
11-- |
10-- |
12-- Module : Data.Generics.Internal.VL.Prism
11-- Module : Data.Generics.Internal.VL.Prism
13−-- Copyright : (C) 2019 Csongor Kiss
12+-- Copyright : (C) 2018 Csongor Kiss
14-- License : BSD3
13-- License : BSD3
15-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
14-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
16-- Stability : experimental
15-- Stability : experimental
src/Data/Generics/Internal/VL/Traversal.hs+1−2
@@ -1,4 +1,3 @@
1−{-# OPTIONS_HADDOCK hide #-}
2{-# LANGUAGE AllowAmbiguousTypes #-}
1{-# LANGUAGE AllowAmbiguousTypes #-}
3{-# LANGUAGE ConstraintKinds #-}
2{-# LANGUAGE ConstraintKinds #-}
4{-# LANGUAGE GADTs #-}
3{-# LANGUAGE GADTs #-}
@@ -12,7 +11,7 @@
12-----------------------------------------------------------------------------
11-----------------------------------------------------------------------------
13-- |
12-- |
14-- Module : Data.Generics.Internal.VL.Traversal
13-- Module : Data.Generics.Internal.VL.Traversal
15−-- Copyright : (C) 2019 Csongor Kiss
14+-- Copyright : (C) 2018 Csongor Kiss
16-- License : BSD3
15-- License : BSD3
17-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
16-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
18-- Stability : experimental
17-- Stability : experimental
src/Data/Generics/Labels.hs+17−123
@@ -1,142 +1,36 @@
1−{-# LANGUAGE AllowAmbiguousTypes #-}
1+{-# LANGUAGE CPP #-}
2−{-# LANGUAGE CPP #-}
3−{-# LANGUAGE ConstraintKinds #-}
4−{-# LANGUAGE DataKinds #-}
5−{-# LANGUAGE FlexibleInstances #-}
2+{-# LANGUAGE FlexibleInstances #-}
6−{-# LANGUAGE FunctionalDependencies #-}
7−{-# LANGUAGE MultiParamTypeClasses #-}
3+{-# LANGUAGE MultiParamTypeClasses #-}
8−{-# LANGUAGE PolyKinds #-}
9−{-# LANGUAGE ScopedTypeVariables #-}
4+{-# LANGUAGE ScopedTypeVariables #-}
10−{-# LANGUAGE TypeApplications #-}
5+{-# LANGUAGE TypeApplications #-}
11−{-# LANGUAGE TypeOperators #-}
6+{-# LANGUAGE TypeFamilies #-}
12−{-# LANGUAGE TypeFamilies #-}
13−{-# LANGUAGE UndecidableInstances #-}
7+{-# LANGUAGE UndecidableInstances #-}
14−{-# OPTIONS_GHC -Wno-orphans #-}
8+{-# OPTIONS_GHC -Wno-orphans #-}
9+
15
10
16--------------------------------------------------------------------------------
11--------------------------------------------------------------------------------
17-- |
12-- |
18-- Module : Data.Generics.Labels
13-- Module : Data.Generics.Labels
19−-- Copyright : (C) 2019 Csongor Kiss
14+-- Copyright : (C) 2018 Csongor Kiss
20−-- License : BSD3
21-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
15-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
16+-- License : BSD3
22-- Stability : experimental
17-- Stability : experimental
23-- Portability : non-portable
18-- Portability : non-portable
24--
19--
25−-- Provides an (orphan) IsLabel instance for field lenses and constructor prisms.
20+-- Provides an (orphan) IsLabel instance for field lenses.
26-- Use at your own risk.
21-- Use at your own risk.
27--------------------------------------------------------------------------------
22--------------------------------------------------------------------------------
28
23
29−module Data.Generics.Labels
24+module Data.Generics.Labels () where
30− ( -- * Orphan IsLabel Instance
31− -- $sec1
32− Field(..)
33− , Field'
34− , Constructor(..)
35− , Constructor'
36− ) where
37
25
38import Data.Generics.Product
26import Data.Generics.Product
39−import Data.Generics.Sum
40−import Data.Generics.Internal.VL.Lens (Lens)
41−import Data.Generics.Internal.VL.Prism (Prism)
42−
43−import Data.Profunctor (Choice)
44−import Data.Type.Bool (type (&&))
45−import Data.Type.Equality (type (==))
46−
47import GHC.OverloadedLabels
27import GHC.OverloadedLabels
48−import GHC.TypeLits
49−
50−-- $sec1
51−-- An instance for creating lenses and prisms with @#identifiers@ from the
52−-- @OverloadedLabels@ extension. Note that since overloaded labels do not
53−-- support symbols starting with capital letters, all prisms (which come from
54−-- constructor names, which are capitalized) must be prefixed with an underscore
55−-- (e.g. @#_ConstructorName@).
56−--
57−-- Morally:
58−--
59−-- @
60−-- instance (HasField name s t a b) => IsLabel name (Lens s t a b) where ...
61−-- @
62−-- and
63−--
64−-- @
65−-- instance (AsConstructor name s t a b) => IsLabel name (Prism s t a b) where ...
66−-- @
67−--
68−-- Remember:
69−--
70−-- @
71−-- type Lens = forall f. Functor f => (a -> f b) -> s -> f t
72−--
73−-- type Prism s t a b = forall p f. (Choice p, Applicative f) => p a (f b) -> p s (f t)
74−-- @
75−--
76−-- The orphan instance is unavoidable if we want to work with
77−-- lenses-as-functions (as opposed to a 'ReifiedLens'-like newtype).
78−
79−-- | 'Field' is morally the same as 'HasField', but it is constructed from an
80−-- incoherent combination of 'HasField' and 'HasField''. In this way, it can be
81−-- seamlessly used in the 'IsLabel' instance even when dealing with data types
82−-- that don't have 'Field' instances (like data instances).
83−class Field name s t a b | s name -> a, t name -> b, s name b -> t, t name a -> s where
84− fieldLens :: Lens s t a b
85−
86−type Field' name s a = Field name s s a a
87−
88−instance {-# INCOHERENT #-} HasField name s t a b => Field name s t a b where
89− fieldLens = field @name
90−
91−instance {-# INCOHERENT #-} HasField' name s a => Field name s s a a where
92− fieldLens = field' @name
93−
94−-- | 'Constructor' is morally the same as 'AsConstructor', but it is constructed from an
95−-- incoherent combination of 'AsConstructor' and 'AsConstructor''. In this way, it can be
96−-- seamlessly used in the 'IsLabel' instance even when dealing with data types
97−-- that don't have 'Constructor' instances (like data instances).
98−class Constructor name s t a b | name s -> a, name t -> b where
99− constructorPrism :: Prism s t a b
100−
101−type Constructor' name s a = Constructor name s s a a
102−
103−instance {-# INCOHERENT #-} AsConstructor name s t a b => Constructor name s t a b where
104− constructorPrism = _Ctor @name
105−
106−instance {-# INCOHERENT #-} AsConstructor' name s a => Constructor name s s a a where
107− constructorPrism = _Ctor' @name
108−
109−type family BeginsWithCapital (name :: Symbol) :: Bool where
110− BeginsWithCapital name = CmpSymbol "_@" name == 'LT && CmpSymbol "_[" name == 'GT
111−
112−instance ( capital ~ BeginsWithCapital name
113− , IsLabelHelper capital name p f s t a b
114− , pafb ~ p a (f b), psft ~ p s (f t)) => IsLabel name (pafb -> psft) where
115−#if __GLASGOW_HASKELL__ >= 802
116− fromLabel = labelOutput @capital @name @p @f
117−#else
118− fromLabel _ = labelOutput @capital @name @p @f
119−#endif
120−
121−-- | This helper class allows us to customize the output type of the lens to be
122−-- either 'Prism' or 'Lens' (by choosing appropriate @p@ and @f@) as well as to
123−-- choose between whether we're dealing with a lens or a prism. The choice is
124−-- made by whether the @capital@ argument is true or false, which is determined by
125−-- whether the symbol starts with an underscore followed by a capital letter
126−-- (a check done in the 'IsLabel' instance above). If so, then we're dealing
127−-- with a constructor name, which should be a prism, and otherwise, it's a field
128−-- name, so we have a lens.
129−class IsLabelHelper capital name p f s t a b where
130− labelOutput :: p a (f b) -> p s (f t)
131
28
132−instance (Functor f, Field name s t a b) => IsLabelHelper 'False name (->) f s t a b where
133− labelOutput = fieldLens @name
134
29
30+instance (HasField field s t a b, Functor f, sft ~ (s -> f t)) =>
31+ IsLabel field ((a -> f b) -> sft) where
135#if __GLASGOW_HASKELL__ >= 802
32#if __GLASGOW_HASKELL__ >= 802
136−instance ( Applicative f, Choice p, Constructor name s t a b
33+ fromLabel = field @field
137− , name' ~ AppendSymbol "_" name) => IsLabelHelper 'True name' p f s t a b where
138− labelOutput = constructorPrism @name
139#else
34#else
140−instance (TypeError ('Text "Labels for Prisms require at least GHC 8.2"), Choice p) => IsLabelHelper 'True name' p f s t a b where
35+ fromLabel _ = field @field
141− labelOutput = undefined
142#endif
36#endif
src/Data/Generics/Product.hs+1−1
@@ -1,7 +1,7 @@
1-----------------------------------------------------------------------------
1-----------------------------------------------------------------------------
2-- |
2-- |
3-- Module : Data.Generics.Product
3-- Module : Data.Generics.Product
4−-- Copyright : (C) 2019 Csongor Kiss
4+-- Copyright : (C) 2018 Csongor Kiss
5-- License : BSD3
5-- License : BSD3
6-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
6-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
7-- Stability : experimental
7-- Stability : experimental
src/Data/Generics/Product/Any.hs+2−2
@@ -12,7 +12,7 @@
12-----------------------------------------------------------------------------
12-----------------------------------------------------------------------------
13-- |
13-- |
14-- Module : Data.Generics.Product.Any
14-- Module : Data.Generics.Product.Any
15−-- Copyright : (C) 2019 Csongor Kiss
15+-- Copyright : (C) 2018 Csongor Kiss
16-- License : BSD3
16-- License : BSD3
17-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
17-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
18-- Stability : experimental
18-- Stability : experimental
@@ -53,7 +53,7 @@ import Data.Generics.Product.Typed
53-- human = Human "Tunyasz" 50 "London"
53-- human = Human "Tunyasz" 50 "London"
54-- :}
54-- :}
55
55
56−class HasAny sel s t a b | s sel -> a where
56+class HasAny (sel :: k) s t a b | s sel k -> a where
57 -- |A lens that focuses on a part of a product as identified by some
57 -- |A lens that focuses on a part of a product as identified by some
58 -- selector. Currently supported selectors are field names, positions and
58 -- selector. Currently supported selectors are field names, positions and
59 -- unique types. Compatible with the lens package's 'Control.Lens.Lens'
59 -- unique types. Compatible with the lens package's 'Control.Lens.Lens'
src/Data/Generics/Product/Constraints.hs+1−1
@@ -11,7 +11,7 @@
11-----------------------------------------------------------------------------
11-----------------------------------------------------------------------------
12-- |
12-- |
13-- Module : Data.Generics.Product.Constraints
13-- Module : Data.Generics.Product.Constraints
14−-- Copyright : (C) 2019 Csongor Kiss
14+-- Copyright : (C) 2018 Csongor Kiss
15-- License : BSD3
15-- License : BSD3
16-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
16-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
17-- Stability : experimental
17-- Stability : experimental
src/Data/Generics/Product/Fields.hs+13−29
@@ -16,7 +16,7 @@
16-----------------------------------------------------------------------------
16-----------------------------------------------------------------------------
17-- |
17-- |
18-- Module : Data.Generics.Product.Fields
18-- Module : Data.Generics.Product.Fields
19−-- Copyright : (C) 2019 Csongor Kiss
19+-- Copyright : (C) 2018 Csongor Kiss
20-- License : BSD3
20-- License : BSD3
21-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
21-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
22-- Stability : experimental
22-- Stability : experimental
@@ -47,7 +47,6 @@ import Data.Kind (Constraint, Type)
47import GHC.Generics
47import GHC.Generics
48import GHC.TypeLits (Symbol, ErrorMessage(..), TypeError)
48import GHC.TypeLits (Symbol, ErrorMessage(..), TypeError)
49import Data.Generics.Internal.Profunctor.Lens as P
49import Data.Generics.Internal.Profunctor.Lens as P
50−import Data.Generics.Internal.Errors
51
50
52-- $setup
51-- $setup
53-- == /Running example:/
52-- == /Running example:/
@@ -153,47 +152,39 @@ instance
153 ( Generic s
152 ( Generic s
154 , ErrorUnless field s (CollectField field (Rep s))
153 , ErrorUnless field s (CollectField field (Rep s))
155 , GLens' (HasTotalFieldPSym field) (Rep s) a
154 , GLens' (HasTotalFieldPSym field) (Rep s) a
156− , Defined (Rep s)
157− (NoGeneric s '[ 'Text "arising from a generic lens focusing on the "
158− ':<>: QuoteType field ':<>: 'Text " field of type " ':<>: QuoteType a
159− , 'Text "in " ':<>: QuoteType s])
160− (() :: Constraint)
161 ) => HasField' field s a where
155 ) => HasField' field s a where
162− field' f s = field0 @field f s
156+ field' f s = VL.ravel (repLens . glens @(HasTotalFieldPSym field)) f s
163
157
164class (~~) (a :: k) (b :: k) | a -> b, b -> a
158class (~~) (a :: k) (b :: k) | a -> b, b -> a
165instance (a ~ b) => (~~) a b
159instance (a ~ b) => (~~) a b
166
160
167instance -- see Note [Changing type parameters]
161instance -- see Note [Changing type parameters]
162+ ( Generic s
163+ , Generic t
164+ , ErrorUnless field s (CollectField field (Rep s))
168− ( HasTotalFieldP field (Rep s) ~~ 'Just a
165+ , HasTotalFieldP field (Rep s) ~~ 'Just a
169 , HasTotalFieldP field (Rep t) ~~ 'Just b
166 , HasTotalFieldP field (Rep t) ~~ 'Just b
170 , HasTotalFieldP field (Rep (Indexed s)) ~~ 'Just a'
167 , HasTotalFieldP field (Rep (Indexed s)) ~~ 'Just a'
171 , HasTotalFieldP field (Rep (Indexed t)) ~~ 'Just b'
168 , HasTotalFieldP field (Rep (Indexed t)) ~~ 'Just b'
172 , t ~~ Infer s a' b
169 , t ~~ Infer s a' b
173 , s ~~ Infer t b' a
170 , s ~~ Infer t b' a
174− , HasField0 field s t a b
171+ , GLens (HasTotalFieldPSym field) (Rep s) (Rep t) a b
175 ) => HasField field s t a b where
172 ) => HasField field s t a b where
176 field f s = field0 @field f s
173 field f s = field0 @field f s
177
174
178−-- | See Note [Uncluttering type signatures]
175+-- -- See Note [Uncluttering type signatures]
179−#if __GLASGOW_HASKELL__ < 804
180−-- >>> :t field
181−-- field
182−-- :: (HasField field s t a b, Functor f) => (a -> f b) -> s -> f t
183−#else
184−-- >>> :t field
185−-- field
186−-- :: (Functor f, HasField field s t a b) => (a -> f b) -> s -> f t
187−#endif
188instance {-# OVERLAPPING #-} HasField f (Void1 a) (Void1 b) a b where
176instance {-# OVERLAPPING #-} HasField f (Void1 a) (Void1 b) a b where
189 field = undefined
177 field = undefined
190
178
191instance
179instance
180+ ( Generic s
181+ , Generic t
182+ , ErrorUnless field s (CollectField field (Rep s))
192− ( HasTotalFieldP field (Rep s) ~~ 'Just a
183+ , HasTotalFieldP field (Rep s) ~~ 'Just a
193 , HasTotalFieldP field (Rep t) ~~ 'Just b
184 , HasTotalFieldP field (Rep t) ~~ 'Just b
194 , UnifyHead s t
185 , UnifyHead s t
195 , UnifyHead t s
186 , UnifyHead t s
196− , HasField0 field s t a b
187+ , GLens (HasTotalFieldPSym field) (Rep s) (Rep t) a b
197 ) => HasField_ field s t a b where
188 ) => HasField_ field s t a b where
198 field_ f s = field0 @field f s
189 field_ f s = field0 @field f s
199
190
@@ -204,15 +195,8 @@ instance
204 ( Generic s
195 ( Generic s
205 , Generic t
196 , Generic t
206 , GLens (HasTotalFieldPSym field) (Rep s) (Rep t) a b
197 , GLens (HasTotalFieldPSym field) (Rep s) (Rep t) a b
207− , ErrorUnless field s (CollectField field (Rep s))
208− , Defined (Rep s)
209− (NoGeneric s '[ 'Text "arising from a generic lens focusing on the "
210− ':<>: QuoteType field ':<>: 'Text " field of type " ':<>: QuoteType a
211− , 'Text "in " ':<>: QuoteType s])
212− (() :: Constraint)
213 ) => HasField0 field s t a b where
198 ) => HasField0 field s t a b where
214 field0 = VL.ravel (repLens . glens @(HasTotalFieldPSym field))
199 field0 = VL.ravel (repLens . glens @(HasTotalFieldPSym field))
215− {-# INLINE field0 #-}
216
200
217type family ErrorUnless (field :: Symbol) (s :: Type) (stat :: TypeStat) :: Constraint where
201type family ErrorUnless (field :: Symbol) (s :: Type) (stat :: TypeStat) :: Constraint where
218 ErrorUnless field s ('TypeStat _ _ '[])
202 ErrorUnless field s ('TypeStat _ _ '[])
src/Data/Generics/Product/HList.hs+1−1
@@ -10,7 +10,7 @@
10-----------------------------------------------------------------------------
10-----------------------------------------------------------------------------
11-- |
11-- |
12-- Module : Data.Generics.Product.HList
12-- Module : Data.Generics.Product.HList
13−-- Copyright : (C) 2019 Csongor Kiss
13+-- Copyright : (C) 2018 Csongor Kiss
14-- License : BSD3
14-- License : BSD3
15-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
15-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
16-- Stability : experimental
16-- Stability : experimental
src/Data/Generics/Product/Internal/Constraints.hs+1−1
@@ -15,7 +15,7 @@
15-----------------------------------------------------------------------------
15-----------------------------------------------------------------------------
16-- |
16-- |
17-- Module : Data.Generics.Product.Internal.Constraints
17-- Module : Data.Generics.Product.Internal.Constraints
18−-- Copyright : (C) 2019 Csongor Kiss
18+-- Copyright : (C) 2018 Csongor Kiss
19-- License : BSD3
19-- License : BSD3
20-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
20-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
21-- Stability : experimental
21-- Stability : experimental
src/Data/Generics/Product/Internal/GLens.hs+1−1
@@ -17,7 +17,7 @@
17-----------------------------------------------------------------------------
17-----------------------------------------------------------------------------
18-- |
18-- |
19-- Module : Data.Generics.Product.Internal.GLens
19-- Module : Data.Generics.Product.Internal.GLens
20−-- Copyright : (C) 2019 Csongor Kiss
20+-- Copyright : (C) 2018 Csongor Kiss
21-- License : BSD3
21-- License : BSD3
22-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
22-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
23-- Stability : experimental
23-- Stability : experimental
src/Data/Generics/Product/Internal/HList.hs+1−1
@@ -20,7 +20,7 @@
20-----------------------------------------------------------------------------
20-----------------------------------------------------------------------------
21-- |
21-- |
22-- Module : Data.Generics.Product.Internal.HList
22-- Module : Data.Generics.Product.Internal.HList
23−-- Copyright : (C) 2019 Csongor Kiss
23+-- Copyright : (C) 2018 Csongor Kiss
24-- License : BSD3
24-- License : BSD3
25-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
25-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
26-- Stability : experimental
26-- Stability : experimental
src/Data/Generics/Product/Internal/Positions.hs+1−1
@@ -17,7 +17,7 @@
17-----------------------------------------------------------------------------
17-----------------------------------------------------------------------------
18-- |
18-- |
19-- Module : Data.Generics.Product.Internal.Positions
19-- Module : Data.Generics.Product.Internal.Positions
20−-- Copyright : (C) 2019 Csongor Kiss
20+-- Copyright : (C) 2018 Csongor Kiss
21-- License : BSD3
21-- License : BSD3
22-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
22-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
23-- Stability : experimental
23-- Stability : experimental
src/Data/Generics/Product/Internal/Subtype.hs+1−1
@@ -16,7 +16,7 @@
16-----------------------------------------------------------------------------
16-----------------------------------------------------------------------------
17-- |
17-- |
18-- Module : Data.Generics.Product.Internal.Subtype
18-- Module : Data.Generics.Product.Internal.Subtype
19−-- Copyright : (C) 2019 Csongor Kiss
19+-- Copyright : (C) 2018 Csongor Kiss
20-- License : BSD3
20-- License : BSD3
21-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
21-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
22-- Stability : experimental
22-- Stability : experimental
src/Data/Generics/Product/Param.hs+3−10
@@ -15,13 +15,13 @@
15--------------------------------------------------------------------------------
15--------------------------------------------------------------------------------
16-- |
16-- |
17-- Module : Data.Generics.Product.Param
17-- Module : Data.Generics.Product.Param
18−-- Copyright : (C) 2019 Csongor Kiss
18+-- Copyright : (C) 2018 Csongor Kiss
19−-- License : BSD3
20-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
19-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
20+-- License : BSD3
21-- Stability : experimental
21-- Stability : experimental
22-- Portability : non-portable
22-- Portability : non-portable
23--
23--
24−-- Derive traversals over type parameters
24+-- Derive traversal over type parameters
25--
25--
26--------------------------------------------------------------------------------
26--------------------------------------------------------------------------------
27
27
@@ -39,7 +39,6 @@ import GHC.Generics
39import Data.Kind
39import Data.Kind
40import Data.Generics.Internal.VL.Iso
40import Data.Generics.Internal.VL.Iso
41import Data.Generics.Internal.GenericN
41import Data.Generics.Internal.GenericN
42−import Data.Generics.Internal.Errors
43
42
44class HasParam (p :: Nat) s t a b | p t a -> s, p s b -> t, p s -> a, p t -> b where
43class HasParam (p :: Nat) s t a b | p t a -> s, p s b -> t, p s -> a, p t -> b where
45 param :: Applicative g => (a -> g b) -> s -> g t
44 param :: Applicative g => (a -> g b) -> s -> g t
@@ -48,12 +47,6 @@ instance
48 ( GenericN s
47 ( GenericN s
49 , GenericN t
48 , GenericN t
50 -- TODO: merge the old 'Changing' code with 'GenericN'
49 -- TODO: merge the old 'Changing' code with 'GenericN'
51− , Defined (Rep s)
52− (NoGeneric s
53− '[ 'Text "arising from a generic traversal of the type parameter at position " ':<>: QuoteType n
54− , 'Text "of type " ':<>: QuoteType a ':<>: 'Text " in " ':<>: QuoteType s
55− ])
56− (() :: Constraint)
57 , s ~ Infer t (P n b 'PTag) a
50 , s ~ Infer t (P n b 'PTag) a
58 , t ~ Infer s (P n a 'PTag) b
51 , t ~ Infer s (P n a 'PTag) b
59 , Error ((ArgCount s) <=? n) n (ArgCount s) s
52 , Error ((ArgCount s) <=? n) n (ArgCount s) s
src/Data/Generics/Product/Positions.hs+10−34
@@ -19,7 +19,7 @@
19-----------------------------------------------------------------------------
19-----------------------------------------------------------------------------
20-- |
20-- |
21-- Module : Data.Generics.Product.Positions
21-- Module : Data.Generics.Product.Positions
22−-- Copyright : (C) 2019 Csongor Kiss
22+-- Copyright : (C) 2018 Csongor Kiss
23-- License : BSD3
23-- License : BSD3
24-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
24-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
25-- Stability : experimental
25-- Stability : experimental
@@ -47,7 +47,6 @@ import Data.Generics.Internal.Void
47import Data.Generics.Internal.Families
47import Data.Generics.Internal.Families
48import Data.Generics.Product.Internal.Positions
48import Data.Generics.Product.Internal.Positions
49import Data.Generics.Product.Internal.GLens
49import Data.Generics.Product.Internal.GLens
50−import Data.Generics.Internal.Errors
51
50
52import Data.Kind (Constraint, Type)
51import Data.Kind (Constraint, Type)
53import Data.Type.Bool (type (&&))
52import Data.Type.Bool (type (&&))
@@ -115,15 +114,9 @@ class HasPosition' (i :: Nat) s a | s i -> a where
115class HasPosition0 (i :: Nat) s t a b where
114class HasPosition0 (i :: Nat) s t a b where
116 position0 :: VL.Lens s t a b
115 position0 :: VL.Lens s t a b
117
116
118−-- |
119−-- >>> getPosition @2 human
120−-- 50
121getPosition :: forall i s a. HasPosition' i s a => s -> a
117getPosition :: forall i s a. HasPosition' i s a => s -> a
122getPosition s = s ^. position' @i
118getPosition s = s ^. position' @i
123
119
124−-- |
125−-- >>> setPosition @2 60 human
126−-- Human {name = "Tunyasz", age = 60, address = "London"}
127setPosition :: forall i s a. HasPosition' i s a => a -> s -> s
120setPosition :: forall i s a. HasPosition' i s a => a -> s -> s
128setPosition = VL.set (position' @i)
121setPosition = VL.set (position' @i)
129
122
@@ -133,12 +126,6 @@ instance
133 , cs ~ CRep s
126 , cs ~ CRep s
134 , Coercible (Rep s) cs
127 , Coercible (Rep s) cs
135 , GLens' (HasTotalPositionPSym i) cs a
128 , GLens' (HasTotalPositionPSym i) cs a
136− , Defined (Rep s)
137− (NoGeneric s '[ 'Text "arising from a generic lens focusing on the field at"
138− , 'Text "position " ':<>: QuoteType i ':<>: 'Text " of type " ':<>: QuoteType a
139− ':<>: 'Text " in " ':<>: QuoteType s
140− ])
141− (() :: Constraint)
142 ) => HasPosition' i s a where
129 ) => HasPosition' i s a where
143 position' f s = VL.ravel (repLens . coerced @cs @cs . glens @(HasTotalPositionPSym i)) f s
130 position' f s = VL.ravel (repLens . coerced @cs @cs . glens @(HasTotalPositionPSym i)) f s
144 {-# INLINE position' #-}
131 {-# INLINE position' #-}
@@ -149,7 +136,10 @@ class (~~) (a :: k) (b :: k) | a -> b, b -> a
149instance (a ~ b) => (~~) a b
136instance (a ~ b) => (~~) a b
150
137
151instance -- see Note [Changing type parameters]
138instance -- see Note [Changing type parameters]
139+ ( Generic s
140+ , Generic t
152− ( ErrorUnless i s (0 <? i && i <=? Size (Rep s))
141+ , ErrorUnless i s (0 <? i && i <=? Size (Rep s))
142+ , GLens (HasTotalPositionPSym i) (CRep s) (CRep t) a b
153 , HasTotalPositionP i (CRep s) ~~ 'Just a
143 , HasTotalPositionP i (CRep s) ~~ 'Just a
154 , HasTotalPositionP i (CRep t) ~~ 'Just b
144 , HasTotalPositionP i (CRep t) ~~ 'Just b
155 , HasTotalPositionP i (CRep (Indexed s)) ~~ 'Just a'
145 , HasTotalPositionP i (CRep (Indexed s)) ~~ 'Just a'
@@ -158,7 +148,6 @@ instance -- see Note [Changing type parameters]
158 , s ~~ Infer t b' a
148 , s ~~ Infer t b' a
159 , Coercible (CRep s) (Rep s)
149 , Coercible (CRep s) (Rep s)
160 , Coercible (CRep t) (Rep t)
150 , Coercible (CRep t) (Rep t)
161− , HasPosition0 i s t a b
162 ) => HasPosition i s t a b where
151 ) => HasPosition i s t a b where
163
152
164 position = position0 @i
153 position = position0 @i
@@ -172,26 +161,19 @@ coerced :: forall s t s' t' x a b. (Coercible t t', Coercible s s')
172coerced = coerce
161coerced = coerce
173{-# INLINE coerced #-}
162{-# INLINE coerced #-}
174
163
175−-- | See Note [Uncluttering type signatures]
164+-- See Note [Uncluttering type signatures]
176−#if __GLASGOW_HASKELL__ < 804
177−-- >>> :t position
178−-- position
179−-- :: (HasPosition i s t a b, Functor f) => (a -> f b) -> s -> f t
180−#else
181−-- >>> :t position
182−-- position
183−-- :: (Functor f, HasPosition i s t a b) => (a -> f b) -> s -> f t
184−#endif
185instance {-# OVERLAPPING #-} HasPosition f (Void1 a) (Void1 b) a b where
165instance {-# OVERLAPPING #-} HasPosition f (Void1 a) (Void1 b) a b where
186 position = undefined
166 position = undefined
187
167
188instance
168instance
169+ ( Generic s
170+ , Generic t
189− ( ErrorUnless i s (0 <? i && i <=? Size (Rep s))
171+ , ErrorUnless i s (0 <? i && i <=? Size (Rep s))
172+ , GLens (HasTotalPositionPSym i) (CRep s) (CRep t) a b
190 , UnifyHead s t
173 , UnifyHead s t
191 , UnifyHead t s
174 , UnifyHead t s
192 , Coercible (CRep s) (Rep s)
175 , Coercible (CRep s) (Rep s)
193 , Coercible (CRep t) (Rep t)
176 , Coercible (CRep t) (Rep t)
194− , HasPosition0 i s t a b
195 ) => HasPosition_ i s t a b where
177 ) => HasPosition_ i s t a b where
196
178
197 position_ = position0 @i
179 position_ = position0 @i
@@ -206,12 +188,6 @@ instance
206 , GLens (HasTotalPositionPSym i) (CRep s) (CRep t) a b
188 , GLens (HasTotalPositionPSym i) (CRep s) (CRep t) a b
207 , Coercible (CRep s) (Rep s)
189 , Coercible (CRep s) (Rep s)
208 , Coercible (CRep t) (Rep t)
190 , Coercible (CRep t) (Rep t)
209− , Defined (Rep s)
210− (NoGeneric s '[ 'Text "arising from a generic lens focusing on the field at"
211− , 'Text "position " ':<>: QuoteType i ':<>: 'Text " of type " ':<>: QuoteType a
212− ':<>: 'Text " in " ':<>: QuoteType s
213− ])
214− (() :: Constraint)
215 ) => HasPosition0 i s t a b where
191 ) => HasPosition0 i s t a b where
216 position0 = VL.ravel (repLens . coerced @(CRep s) @(CRep t) . glens @(HasTotalPositionPSym i))
192 position0 = VL.ravel (repLens . coerced @(CRep s) @(CRep t) . glens @(HasTotalPositionPSym i))
217 {-# INLINE position0 #-}
193 {-# INLINE position0 #-}
src/Data/Generics/Product/Subtype.hs+3−43
@@ -1,4 +1,3 @@
1−{-# LANGUAGE CPP #-}
2{-# LANGUAGE AllowAmbiguousTypes #-}
1{-# LANGUAGE AllowAmbiguousTypes #-}
3{-# LANGUAGE DataKinds #-}
2{-# LANGUAGE DataKinds #-}
4{-# LANGUAGE FlexibleContexts #-}
3{-# LANGUAGE FlexibleContexts #-}
@@ -16,7 +15,7 @@
16-----------------------------------------------------------------------------
15-----------------------------------------------------------------------------
17-- |
16-- |
18-- Module : Data.Generics.Product.Subtype
17-- Module : Data.Generics.Product.Subtype
19−-- Copyright : (C) 2019 Csongor Kiss
18+-- Copyright : (C) 2018 Csongor Kiss
20-- License : BSD3
19-- License : BSD3
21-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
20-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
22-- Stability : experimental
21-- Stability : experimental
@@ -42,7 +41,6 @@ import GHC.Generics (Generic (Rep, to, from) )
42import GHC.TypeLits (Symbol, TypeError, ErrorMessage (..))
41import GHC.TypeLits (Symbol, TypeError, ErrorMessage (..))
43import Data.Kind (Type, Constraint)
42import Data.Kind (Type, Constraint)
44import Data.Generics.Internal.Profunctor.Lens hiding (set)
43import Data.Generics.Internal.Profunctor.Lens hiding (set)
45−import Data.Generics.Internal.Errors
46
44
47-- $setup
45-- $setup
48-- == /Running example:/
46-- == /Running example:/
@@ -115,52 +113,14 @@ instance
115 , Generic b
113 , Generic b
116 , GSmash (Rep a) (Rep b)
114 , GSmash (Rep a) (Rep b)
117 , GUpcast (Rep a) (Rep b)
115 , GUpcast (Rep a) (Rep b)
118− , CustomError a b
116+ , ErrorUnless b a (CollectFieldsOrdered (Rep b) \\ CollectFieldsOrdered (Rep a))
119 ) => Subtype b a where
117 ) => Subtype b a where
120 smash p b = to $ gsmash (from p) (from b)
118 smash p b = to $ gsmash (from p) (from b)
121 upcast = to . gupcast . from
119 upcast = to . gupcast . from
122
120
123−type family CustomError a b :: Constraint where
124− CustomError a b =
125− ( ErrorUnless b a (CollectFieldsOrdered (Rep b) \\ CollectFieldsOrdered (Rep a))
126− , Defined (Rep a)
127− (NoGeneric a '[ 'Text "arising from a generic lens focusing on " ':<>: QuoteType b
128− , 'Text "as a supertype of " ':<>: QuoteType a
129− ])
130− (() :: Constraint)
131− , Defined (Rep b)
132− (NoGeneric b '[ 'Text "arising from a generic lens focusing on " ':<>: QuoteType b
133− , 'Text "as a supertype of " ':<>: QuoteType a
134− ])
135− (() :: Constraint)
136− )
137−
138−instance {-# OVERLAPPING #-} Subtype a a where
139− super = id
140−
141−-- | See Note [Uncluttering type signatures]
121+-- See Note [Uncluttering type signatures]
142−#if __GLASGOW_HASKELL__ < 804
143−-- >>> :t super
144−-- super
145−-- :: (Subtype sup sub, Functor f) => (sup -> f sup) -> sub -> f sub
146−#else
147−-- >>> :t super
148−-- super
149−-- :: (Functor f, Subtype sup sub) => (sup -> f sup) -> sub -> f sub
150−#endif
151instance {-# OVERLAPPING #-} Subtype a Void where
122instance {-# OVERLAPPING #-} Subtype a Void where
152 super = undefined
123 super = undefined
153−
154−-- | See Note [Uncluttering type signatures]
155−#if __GLASGOW_HASKELL__ < 804
156−-- >>> :t super @Int
157−-- super @Int
158−-- :: (Subtype Int sub, Functor f) => (Int -> f Int) -> sub -> f sub
159−#else
160−-- >>> :t super @Int
161−-- super @Int
162−-- :: (Functor f, Subtype Int sub) => (Int -> f Int) -> sub -> f sub
163−#endif
164instance {-# OVERLAPPING #-} Subtype Void a where
124instance {-# OVERLAPPING #-} Subtype Void a where
165 super = undefined
125 super = undefined
166
126
src/Data/Generics/Product/Typed.hs+5−22
@@ -1,4 +1,3 @@
1−{-# LANGUAGE CPP #-}
2{-# LANGUAGE AllowAmbiguousTypes #-}
1{-# LANGUAGE AllowAmbiguousTypes #-}
3{-# LANGUAGE DataKinds #-}
2{-# LANGUAGE DataKinds #-}
4{-# LANGUAGE FlexibleContexts #-}
3{-# LANGUAGE FlexibleContexts #-}
@@ -15,7 +14,7 @@
15-----------------------------------------------------------------------------
14-----------------------------------------------------------------------------
16-- |
15-- |
17-- Module : Data.Generics.Product.Typed
16-- Module : Data.Generics.Product.Typed
18−-- Copyright : (C) 2019 Csongor Kiss
17+-- Copyright : (C) 2018 Csongor Kiss
19-- License : BSD3
18-- License : BSD3
20-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
19-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
21-- Stability : experimental
20-- Stability : experimental
@@ -41,7 +40,6 @@ import Data.Kind (Constraint, Type)
41import GHC.Generics (Generic (Rep))
40import GHC.Generics (Generic (Rep))
42import GHC.TypeLits (TypeError, ErrorMessage (..))
41import GHC.TypeLits (TypeError, ErrorMessage (..))
43import Data.Generics.Internal.Profunctor.Lens
42import Data.Generics.Internal.Profunctor.Lens
44−import Data.Generics.Internal.Errors
45
43
46-- $setup
44-- $setup
47-- == /Running example:/
45-- == /Running example:/
@@ -113,31 +111,16 @@ class HasType a s where
113instance
111instance
114 ( Generic s
112 ( Generic s
115 , ErrorUnlessOne a s (CollectTotalType a (Rep s))
113 , ErrorUnlessOne a s (CollectTotalType a (Rep s))
116− , Defined (Rep s)
117− (NoGeneric s '[ 'Text "arising from a generic lens focusing on a field of type " ':<>: QuoteType a])
118− (() :: Constraint)
119 , GLens (HasTotalTypePSym a) (Rep s) (Rep s) a a
114 , GLens (HasTotalTypePSym a) (Rep s) (Rep s) a a
120 ) => HasType a s where
115 ) => HasType a s where
121
116
122 typed f s = VL.ravel (repLens . glens @(HasTotalTypePSym a)) f s
117 typed f s = VL.ravel (repLens . glens @(HasTotalTypePSym a)) f s
123
118
124instance {-# OVERLAPPING #-} HasType a a where
119instance {-# OVERLAPPING #-} HasType a a where
125− getTyped = id
120+ typed = id
126− {-# INLINE getTyped #-}
121+ {-# INLINE typed #-}
127−
122+
128− setTyped a _ = a
129− {-# INLINE setTyped #-}
130−
131−-- | See Note [Uncluttering type signatures]
123+-- See Note [Uncluttering type signatures]
132−#if __GLASGOW_HASKELL__ < 804
133−-- >>> :t typed
134−-- typed :: (HasType a s, Functor f) => (a -> f a) -> s -> f s
135−#else
136−-- >>> :t typed
137−-- typed :: (Functor f, HasType a s) => (a -> f a) -> s -> f s
138−#endif
139−--
140−-- Note that this might not longer be needed given the above 'HasType a a' instance.
141instance {-# OVERLAPPING #-} HasType a Void where
124instance {-# OVERLAPPING #-} HasType a Void where
142 typed = undefined
125 typed = undefined
143
126
src/Data/Generics/Product/Types.hs+87−269
@@ -16,7 +16,7 @@
16-----------------------------------------------------------------------------
16-----------------------------------------------------------------------------
17-- |
17-- |
18-- Module : Data.Generics.Product.Types
18-- Module : Data.Generics.Product.Types
19−-- Copyright : (C) 2019 Csongor Kiss
19+-- Copyright : (C) 2018 Csongor Kiss
20-- License : BSD3
20-- License : BSD3
21-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
21-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
22-- Stability : experimental
22-- Stability : experimental
@@ -29,65 +29,22 @@
29module Data.Generics.Product.Types
29module Data.Generics.Product.Types
30 ( -- *Traversals
30 ( -- *Traversals
31 --
31 --
32− -- $setup
32+ -- $example
33 HasTypes
33 HasTypes
34 , types
34 , types
35
35
36− -- * Custom traversal strategies
36+ , Interesting
37− -- $custom
38− , Children
39− , ChGeneric
40−
41− , HasTypesUsing
42− , typesUsing
43−
44− , HasTypesCustom (typesCustom)
45−
46 ) where
37 ) where
47
38
48import Data.Kind
39import Data.Kind
49import Data.Int (Int8, Int16, Int32, Int64)
40import Data.Int (Int8, Int16, Int32, Int64)
50import Data.Word (Word, Word8, Word16, Word32, Word64)
41import Data.Word (Word, Word8, Word16, Word32, Word64)
51−import qualified Data.Text as T
52
42
53import GHC.Generics
43import GHC.Generics
54−import GHC.TypeLits
55import Data.Generics.Internal.VL.Traversal
44import Data.Generics.Internal.VL.Traversal
56−import Data.Generics.Internal.Errors
57−
58−-- $setup
59−-- == /Running example:/
60−--
61−-- >>> :set -XTypeApplications
62−-- >>> :set -XDeriveGeneric
63−-- >>> :set -XScopedTypeVariables
64−-- >>> import GHC.Generics
65−-- >>> :m +Data.Generics.Internal.VL.Traversal
66−-- >>> :m +Data.Generics.Internal.VL.Lens
67−-- >>> :{
68−-- data WTree a w
69−-- = Leaf a
70−-- | Fork (WTree a w) (WTree a w)
71−-- | WithWeight (WTree a w) w
72−-- deriving (Generic, Show)
73−-- :}
74−
75−--------------------------------------------------------------------------------
76−-- HasTypes
77−--------------------------------------------------------------------------------
78
45
79-- TODO [1.0.0.0]: use type-changing variant internally
46-- TODO [1.0.0.0]: use type-changing variant internally
80
47
81−-- | Traverse all types in the given structure.
82−--
83−-- For example, to update all 'String's in a @WTree (Maybe String) String@, we can write
84−--
85−-- >>> myTree = WithWeight (Fork (Leaf (Just "hello")) (Leaf Nothing)) "world"
86−-- >>> over (types @String) (++ "!") myTree
87−-- WithWeight (Fork (Leaf (Just "hello!")) (Leaf Nothing)) "world!"
88−--
89−-- The traversal is /deep/, which means that not just the immediate
90−-- children are visited, but all nested values too.
91types :: forall a s. HasTypes s a => Traversal' s a
48types :: forall a s. HasTypes s a => Traversal' s a
92types = types_ @s @a
49types = types_ @s @a
93{-# INLINE types #-}
50{-# INLINE types #-}
@@ -100,268 +57,129 @@ class HasTypes s a where
100 {-# INLINE types_ #-}
57 {-# INLINE types_ #-}
101
58
102instance
59instance
103− ( HasTypesUsing ChGeneric s a
60+ ( HasTypes' (Interesting s a) s a
104 ) => HasTypes s a where
61 ) => HasTypes s a where
105− types_ = typesUsing_ @ChGeneric
62+ types_ = types' @(Interesting s a)
106 {-# INLINE types_ #-}
63 {-# INLINE types_ #-}
107
64
108−--------------------------------------------------------------------------------
65+class HasTypes' (t :: Bool) s a where
109−data Void
110−instance {-# OVERLAPPING #-} HasTypes Void a where
111− types_ _ = pure
112−
113−instance {-# OVERLAPPING #-} HasTypes s Void where
114− types_ _ = pure
115−
116−instance {-# OVERLAPPING #-} HasTypesUsing ch Void a where
117− typesUsing_ _ = pure
118−
119−instance {-# OVERLAPPING #-} HasTypesUsing ch s Void where
120− typesUsing_ _ = pure
121−--------------------------------------------------------------------------------
122−
123−--------------------------------------------------------------------------------
124−-- HasTypesUsing
125−--------------------------------------------------------------------------------
126−
127−-- $custom
128−--
129−-- The default traversal strategy 'types' recurses into each node of the type
130−-- using the 'Generic' instance for the nodes. However, in general not all
131−-- nodes will have a 'Generic' instance. For example:
132−--
133−-- >>> data Opaque = Opaque String deriving Show
134−-- >>> myTree = WithWeight (Fork (Leaf (Opaque "foo")) (Leaf (Opaque "bar"))) False
135−-- >>> over (types @String) (++ "!") myTree
136−-- ...
137−-- ... | No instance for ‘Generic Opaque’
138−-- ... | arising from a generic traversal.
139−-- ... | Either derive the instance, or define a custom traversal using ‘HasTypesCustom’
140−-- ...
141−--
142−-- In these cases, we can define a custom traversal strategy to override the
143−-- generic behaviour for certain types.
144−-- For a self-contained example, see the CustomChildren module in the tests directory.
145−
146−-- | The children of a type are the types of its fields.
147−-- The 'Children' type family maps a type @a@ to its set of children.
148−--
149−-- This type family is parameterized by a symbol @ch@ (that can be declared as
150−-- an empty data type).
151−-- The symbol 'ChGeneric' provides a default definition. You can create new
152−-- symbols to override the set of children of abstract, non-generic types.
153−--
154−-- The following example declares a @Custom@ symbol to redefine 'Children'
155−-- for some abstract types from the @time@ library.
156−--
157−-- @
158−-- data Custom
159−-- type instance 'Children' Custom a = ChildrenCustom a
160−--
161−-- type family ChildrenCustom (a :: Type) where
162−-- ChildrenCustom DiffTime = '[]
163−-- ChildrenCustom NominalDiffTime = '[]
164−-- -- Add more custom mappings here.
165−--
166−-- ChildrenCustom a = Children ChGeneric a
167−-- @
168−--
169−-- To use this definition, replace 'types' with @'typesUsing' \@Custom@.
170−type family Children (ch :: Type) (a :: Type) :: [Type]
171−
172−-- | @since 1.2.0.0
173−typesUsing :: forall ch a s. HasTypesUsing ch s a => Traversal' s a
174−typesUsing = typesUsing_ @ch @s @a
175−{-# INLINE typesUsing #-}
176−
177−-- | @since 1.2.0.0
178−class HasTypesUsing (ch :: Type) s a where
179− typesUsing_ :: Traversal' s a
180−
181−instance {-# OVERLAPPABLE #-}
182− ( HasTypesOpt ch (Interesting ch a s) s a
183− ) => HasTypesUsing ch s a where
184− typesUsing_ = typesOpt @ch @(Interesting ch a s)
185− {-# INLINE typesUsing_ #-}
186−
187−-- TODO: should this instance be incoherent?
188−instance {-# OVERLAPPABLE #-} HasTypesUsing ch a a where
189− typesUsing_ = id
190−
191−-- | By adding instances to this class, we can override the default
192−-- behaviour in an ad-hoc manner.
193−-- For example:
194−--
195−-- @
196−-- instance HasTypesCustom Custom Opaque String where
197−-- typesCustom f (Opaque str) = Opaque <$> f str
198−-- @
199−--
200−-- @since 1.2.0.0
201−class HasTypesCustom (ch :: Type) s a where
202− -- | This function should never be used directly, only to override
203− -- the default traversal behaviour. To actually use the custom
204− -- traversal strategy, see 'typesUsing'. This is because 'typesUsing' does
205− -- additional optimisations, like ensuring that nodes with no relevant members will
206− -- not be traversed at runtime.
207− typesCustom :: Traversal' s a
66+ types' :: Traversal' s a
208
67
209−instance {-# OVERLAPPABLE #-}
68+instance
210− ( GHasTypes ch (Rep s) a
69+ ( GHasTypes (Rep s) a
211 , Generic s
70 , Generic s
212− -- if there's no Generic instance here, it means we got through the
71+ ) => HasTypes' 'True s a where
213− -- Children check by a user-defined custom strategy.
214− -- Therefore, we can ignore the missing Generic instance, and
215− -- instead report a missing HasTypesCustom instance
216− , Defined (Rep s)
217− (PrettyError '[ 'Text "No instance " ':<>: QuoteType (HasTypesCustom ch s a)])
218− (() :: Constraint)
219− ) => HasTypesCustom ch s a where
220− typesCustom f s = to <$> gtypes_ @ch f (from s)
72+ types' f s = to <$> gtypes_ f (from s)
221 --{-# INLINE types' #-}
73 --{-# INLINE types' #-}
222
74
75+instance HasTypes' 'False s a where
76+ types' _ = pure
77+ --{-# INLINE types' #-}
223
78
224−-- | The default definition of 'Children'.
79+instance {-# OVERLAPPING #-} HasTypes Bool a
225−-- Primitive types from core libraries have no children, and other types are
80+instance {-# OVERLAPPING #-} HasTypes Char a
226−-- assumed to be 'Generic'.
81+instance {-# OVERLAPPING #-} HasTypes Double a
227−data ChGeneric
82+instance {-# OVERLAPPING #-} HasTypes Float a
228−type instance Children ChGeneric a = ChildrenDefault a
83+instance {-# OVERLAPPING #-} HasTypes Integer a
229−
84+instance {-# OVERLAPPING #-} HasTypes Ordering a
230−type family ChildrenDefault (a :: Type) :: [Type] where
85+instance {-# OVERLAPPING #-} HasTypes Int a
231− ChildrenDefault Char = '[]
86+instance {-# OVERLAPPING #-} HasTypes Int8 a
232− ChildrenDefault Double = '[]
87+instance {-# OVERLAPPING #-} HasTypes Int16 a
233− ChildrenDefault Float = '[]
88+instance {-# OVERLAPPING #-} HasTypes Int32 a
234− ChildrenDefault Integer = '[]
89+instance {-# OVERLAPPING #-} HasTypes Int64 a
235− ChildrenDefault Int = '[]
90+instance {-# OVERLAPPING #-} HasTypes Word a
236− ChildrenDefault Int8 = '[]
91+instance {-# OVERLAPPING #-} HasTypes Word8 a
237− ChildrenDefault Int16 = '[]
92+instance {-# OVERLAPPING #-} HasTypes Word16 a
238− ChildrenDefault Int32 = '[]
93+instance {-# OVERLAPPING #-} HasTypes Word32 a
239− ChildrenDefault Int64 = '[]
94+instance {-# OVERLAPPING #-} HasTypes Word64 a
240− ChildrenDefault Word = '[]
241− ChildrenDefault Word8 = '[]
242− ChildrenDefault Word16 = '[]
243− ChildrenDefault Word32 = '[]
244− ChildrenDefault Word64 = '[]
245− ChildrenDefault T.Text = '[]
246− ChildrenDefault a
247− = Defined (Rep a)
248− (NoGeneric a
249− '[ 'Text "arising from a generic traversal."
250− , 'Text "Either derive the instance, or define a custom traversal using " ':<>: QuoteType HasTypesCustom
251− ])
252− (ChildrenGeneric (Rep a) '[])
253−
254−type family ChildrenGeneric (f :: k -> Type) (cs :: [Type]) :: [Type] where
255− ChildrenGeneric (M1 _ _ f) cs = ChildrenGeneric f cs
256− ChildrenGeneric (l :*: r) cs = ChildrenGeneric l (ChildrenGeneric r cs)
257− ChildrenGeneric (l :+: r) cs = ChildrenGeneric l (ChildrenGeneric r cs)
258− ChildrenGeneric (Rec0 a) cs = a ': cs
259− ChildrenGeneric _ cs = cs
260−
261−--------------------------------------------------------------------------------
262−-- Internals
263−--------------------------------------------------------------------------------
264−-- TODO: these should never leak out in error messages
265−
266−class HasTypesOpt (ch :: Type) (t :: Bool) s a where
267− typesOpt :: Traversal' s a
268−
269−instance HasTypesCustom ch s a => HasTypesOpt ch 'True s a where
270− typesOpt = typesCustom @ch
271−
272−instance HasTypesOpt ch 'False s a where
273− typesOpt _ = pure
274− --{-# INLINE typesOpt #-}
275
95
276--------------------------------------------------------------------------------
96--------------------------------------------------------------------------------
277
97
278−class GHasTypes ch s a where
98+class GHasTypes s a where
279 gtypes_ :: Traversal' (s x) a
99 gtypes_ :: Traversal' (s x) a
280
100
281instance
101instance
282− ( GHasTypes ch l a
102+ ( GHasTypes l a
283− , GHasTypes ch r a
103+ , GHasTypes r a
284− ) => GHasTypes ch (l :*: r) a where
104+ ) => GHasTypes (l :*: r) a where
285− gtypes_ f (l :*: r) = (:*:) <$> gtypes_ @ch f l <*> gtypes_ @ch f r
105+ gtypes_ f (l :*: r) = (:*:) <$> gtypes_ f l <*> gtypes_ f r
286 {-# INLINE gtypes_ #-}
106 {-# INLINE gtypes_ #-}
287
107
288instance
108instance
289− ( GHasTypes ch l a
109+ ( GHasTypes l a
290− , GHasTypes ch r a
110+ , GHasTypes r a
291− ) => GHasTypes ch (l :+: r) a where
111+ ) => GHasTypes (l :+: r) a where
292− gtypes_ f (L1 l) = L1 <$> gtypes_ @ch f l
112+ gtypes_ f (L1 l) = L1 <$> gtypes_ f l
293− gtypes_ f (R1 r) = R1 <$> gtypes_ @ch f r
113+ gtypes_ f (R1 r) = R1 <$> gtypes_ f r
294 {-# INLINE gtypes_ #-}
114 {-# INLINE gtypes_ #-}
295
115
296−instance (GHasTypes ch s a) => GHasTypes ch (M1 m meta s) a where
116+instance (GHasTypes s a) => GHasTypes (M1 m meta s) a where
297− gtypes_ f (M1 s) = M1 <$> gtypes_ @ch f s
117+ gtypes_ f (M1 s) = M1 <$> gtypes_ f s
298 {-# INLINE gtypes_ #-}
118 {-# INLINE gtypes_ #-}
299
119
300−-- | In the recursive case, we invoke 'HasTypesUsing' again, using the
301−-- same strategy
302−instance HasTypesUsing ch b a => GHasTypes ch (Rec0 b) a where
120+instance {-# OVERLAPPING #-} GHasTypes (Rec0 a) a where
303− gtypes_ f (K1 x) = K1 <$> typesUsing_ @ch @b @a f x
121+ gtypes_ f (K1 x) = K1 <$> f x
304 {-# INLINE gtypes_ #-}
122 {-# INLINE gtypes_ #-}
305
123
306−-- | The default instance for 'HasTypes' acts as a synonym for
307−-- 'HasTypesUsing ChGeneric', so in most cases this instance should
308−-- behave the same as the one above.
309−-- However, there might be overlapping instances defined for
310−-- 'HasTypes' directly, in which case we want to prefer those
311−-- instances (even though the custom instances should always be added to 'HasTypesCustom')
312−instance {-# OVERLAPPING #-} HasTypes b a => GHasTypes ChGeneric (Rec0 b) a where
124+instance HasTypes b a => GHasTypes (Rec0 b) a where
313− gtypes_ f (K1 x) = K1 <$> types_ @b @a f x
125+ gtypes_ f (K1 x) = K1 <$> types_ @_ @a f x
314 {-# INLINE gtypes_ #-}
126 {-# INLINE gtypes_ #-}
315
127
316−instance GHasTypes ch U1 a where
128+instance GHasTypes U1 a where
317 gtypes_ _ _ = pure U1
129 gtypes_ _ _ = pure U1
318 {-# INLINE gtypes_ #-}
130 {-# INLINE gtypes_ #-}
319
131
320−instance GHasTypes ch V1 a where
132+instance GHasTypes V1 a where
321 gtypes_ _ = pure
133 gtypes_ _ = pure
322 {-# INLINE gtypes_ #-}
134 {-# INLINE gtypes_ #-}
323
135
324−type Interesting (ch :: Type) (a :: Type) (t :: Type)
136+type Interesting f a = Snd (Interesting' (Rep f) a '[f])
325− = Defined_list (Children ch t) (NoChildren ch t)
137+
326− (IsNothing (Interesting' ch a '[t] (Children ch t)))
327−
328−type family NoChildren (ch :: Type) (a :: Type) :: Constraint where
138+type family Interesting' f (a :: Type) (seen :: [Type]) :: ([Type], Bool) where
329− NoChildren ch a = PrettyError
139+ Interesting' (M1 _ m f) t seen
330− '[ 'Text "No type family instance for " ':<>: QuoteType (Children ch a)
140+ = Interesting' f t seen
331− , 'Text "arising from a traversal over " ':<>: QuoteType a
141+ -- The result of the left branch is passed on to the right branch in order to avoid duplicate work
332− , 'Text "with custom strategy " ':<>: QuoteType ch
142+ Interesting' (l :*: r) t seen
333− ]
143+ = InterestingOr (Interesting' l t seen) r t
334−
335−
336−type family Interesting' (ch :: Type) (a :: Type) (seen :: [Type]) (ts :: [Type]) :: Maybe [Type] where
337− Interesting' ch _ seen '[] = 'Just seen
144+ Interesting' (l :+: r) t seen
338− Interesting' ch a seen (t ': ts) =
145+ = InterestingOr (Interesting' l t seen) r t
146+ Interesting' (Rec0 t) t seen
147+ = '(seen, 'True)
148+ Interesting' (Rec0 Char) _ seen = '(seen ,'False)
149+ Interesting' (Rec0 Double) _ seen = '(seen ,'False)
150+ Interesting' (Rec0 Float) _ seen = '(seen ,'False)
151+ Interesting' (Rec0 Integer) _ seen = '(seen ,'False)
152+ Interesting' (Rec0 Int) _ seen = '(seen ,'False)
153+ Interesting' (Rec0 Int8) _ seen = '(seen ,'False)
154+ Interesting' (Rec0 Int16) _ seen = '(seen ,'False)
155+ Interesting' (Rec0 Int32) _ seen = '(seen ,'False)
156+ Interesting' (Rec0 Int64) _ seen = '(seen ,'False)
157+ Interesting' (Rec0 Word) _ seen = '(seen ,'False)
158+ Interesting' (Rec0 Word8) _ seen = '(seen ,'False)
159+ Interesting' (Rec0 Word16) _ seen = '(seen ,'False)
160+ Interesting' (Rec0 Word32) _ seen = '(seen ,'False)
161+ Interesting' (Rec0 Word64) _ seen = '(seen ,'False)
162+ Interesting' (Rec0 r) t seen
339− InterestingOr ch a (InterestingUnless ch a seen t (Elem t seen)) ts
163+ = InterestingUnless (Elem r seen) (Rep r) t r seen
164+ Interesting' _ _ seen
165+ = '(seen, 'False)
340
166
341-- Short circuit
167-- Short circuit
342−-- Note: we only insert 't' to the seen list if it's not already there (which is precisely when `s` is 'False)
168+-- Note: we only insert 'r' to the seen list if it's not already there (which is precisely when `s` is 'False)
343−type family InterestingUnless
169+type family InterestingUnless (s :: Bool) f (a :: Type) (r :: Type) (seen :: [Type]) :: ([Type], Bool) where
344− (ch :: Type) (a :: Type) (seen :: [Type]) (t :: Type) (alreadySeen :: Bool) ::
345− Maybe [Type] where
346− InterestingUnless ch a seen a _ = 'Nothing
170+ InterestingUnless 'True _ _ _ seen = '(seen, 'False)
347− InterestingUnless ch a seen t 'True = 'Just seen
348− InterestingUnless ch a seen t 'False
349− = Defined_list (Children ch t) (NoChildren ch t)
350− (Interesting' ch a (t ': seen) (Children ch t))
171+ InterestingUnless 'False f a r seen = Interesting' f a (r ': seen)
351
172
352-- Short circuit
173-- Short circuit
353−type family InterestingOr
174+type family InterestingOr (b :: ([Type], Bool)) r t :: ([Type], Bool) where
354− (ch :: Type) (a :: Type) (seen' :: Maybe [Type]) (ts :: [Type]) ::
355− Maybe [Type] where
356− InterestingOr ch a 'Nothing _ = 'Nothing
175+ InterestingOr '(seen, 'True) _ _ = '(seen, 'True)
357− InterestingOr ch a ('Just seen) ts = Interesting' ch a seen ts
176+ InterestingOr '(seen, 'False) r t = Interesting' r t seen
358
177
359type family Elem a as where
178type family Elem a as where
360 Elem a (a ': _) = 'True
179 Elem a (a ': _) = 'True
361 Elem a (_ ': as) = Elem a as
180 Elem a (_ ': as) = Elem a as
362 Elem a '[] = 'False
181 Elem a '[] = 'False
363
182
364−type family IsNothing a where
183+type family Snd a where
365− IsNothing ('Just _) = 'False
184+ Snd '(_, b) = b
366− IsNothing 'Nothing = 'True
367
185
src/Data/Generics/Sum.hs+1−1
@@ -1,7 +1,7 @@
1-----------------------------------------------------------------------------
1-----------------------------------------------------------------------------
2-- |
2-- |
3-- Module : Data.Generics.Sum
3-- Module : Data.Generics.Sum
4−-- Copyright : (C) 2019 Csongor Kiss
4+-- Copyright : (C) 2018 Csongor Kiss
5-- License : BSD3
5-- License : BSD3
6-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
6-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
7-- Stability : experimental
7-- Stability : experimental
src/Data/Generics/Sum/Any.hs+2−2
@@ -11,7 +11,7 @@
11-----------------------------------------------------------------------------
11-----------------------------------------------------------------------------
12-- |
12-- |
13-- Module : Data.Generics.Sum.Any
13-- Module : Data.Generics.Sum.Any
14−-- Copyright : (C) 2019 Csongor Kiss
14+-- Copyright : (C) 2018 Csongor Kiss
15-- License : BSD3
15-- License : BSD3
16-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
16-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
17-- Stability : experimental
17-- Stability : experimental
@@ -61,7 +61,7 @@ import Data.Generics.Internal.VL.Prism
61-- :}
61-- :}
62
62
63-- |Sums that have generic prisms.
63-- |Sums that have generic prisms.
64−class AsAny sel a s | s sel -> a where
64+class AsAny (sel :: k) a s | s sel k -> a where
65 -- |A prism that projects a sum as identified by some selector. Currently
65 -- |A prism that projects a sum as identified by some selector. Currently
66 -- supported selectors are constructor names and unique types. Compatible
66 -- supported selectors are constructor names and unique types. Compatible
67 -- with the lens package's 'Control.Lens.Prism' type.
67 -- with the lens package's 'Control.Lens.Prism' type.
src/Data/Generics/Sum/Constructors.hs+9−31
@@ -15,7 +15,7 @@
15-----------------------------------------------------------------------------
15-----------------------------------------------------------------------------
16-- |
16-- |
17-- Module : Data.Generics.Sum.Constructors
17-- Module : Data.Generics.Sum.Constructors
18−-- Copyright : (C) 2019 Csongor Kiss
18+-- Copyright : (C) 2018 Csongor Kiss
19-- License : BSD3
19-- License : BSD3
20-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
20-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
21-- Stability : experimental
21-- Stability : experimental
@@ -45,7 +45,6 @@ import GHC.TypeLits (Symbol, TypeError, ErrorMessage (..))
45import Data.Generics.Internal.VL.Prism
45import Data.Generics.Internal.VL.Prism
46import Data.Generics.Internal.Profunctor.Iso
46import Data.Generics.Internal.Profunctor.Iso
47import Data.Generics.Internal.Profunctor.Prism (prismPRavel)
47import Data.Generics.Internal.Profunctor.Prism (prismPRavel)
48−import Data.Generics.Internal.Errors
49
48
50-- $setup
49-- $setup
51-- == /Running example:/
50-- == /Running example:/
@@ -71,7 +70,7 @@ import Data.Generics.Internal.Errors
71-- , age :: Age
70-- , age :: Age
72-- , fieldA :: a
71-- , fieldA :: a
73-- }
72-- }
74−-- deriving Show
73+-- deriving (Generic, Show)
75-- type Name = String
74-- type Name = String
76-- type Age = Int
75-- type Age = Int
77-- dog, cat, duck :: Animal Int
76-- dog, cat, duck :: Animal Int
@@ -129,55 +128,39 @@ instance
129 ( Generic s
128 ( Generic s
130 , ErrorUnless ctor s (HasCtorP ctor (Rep s))
129 , ErrorUnless ctor s (HasCtorP ctor (Rep s))
131 , GAsConstructor' ctor (Rep s) a
130 , GAsConstructor' ctor (Rep s) a
132− , Defined (Rep s)
133− (NoGeneric s '[ 'Text "arising from a generic prism focusing on the "
134− ':<>: QuoteType ctor ':<>: 'Text " constructor of type " ':<>: QuoteType a
135− , 'Text "in " ':<>: QuoteType s])
136− (() :: Constraint)
137 ) => AsConstructor' ctor s a where
131 ) => AsConstructor' ctor s a where
138 _Ctor' eta = prismRavel (prismPRavel (repIso . _GCtor @ctor)) eta
132 _Ctor' eta = prismRavel (prismPRavel (repIso . _GCtor @ctor)) eta
139 {-# INLINE[2] _Ctor' #-}
133 {-# INLINE[2] _Ctor' #-}
140
134
141instance
135instance
136+ ( Generic s
137+ , Generic t
142− ( ErrorUnless ctor s (HasCtorP ctor (Rep s))
138+ , ErrorUnless ctor s (HasCtorP ctor (Rep s))
143 , GAsConstructor' ctor (Rep s) a -- TODO: add a test similar to #62 for prisms
139 , GAsConstructor' ctor (Rep s) a -- TODO: add a test similar to #62 for prisms
144 , GAsConstructor' ctor (Rep (Indexed s)) a'
140 , GAsConstructor' ctor (Rep (Indexed s)) a'
145 , GAsConstructor ctor (Rep s) (Rep t) a b
141 , GAsConstructor ctor (Rep s) (Rep t) a b
146 , t ~ Infer s a' b
142 , t ~ Infer s a' b
147 , GAsConstructor' ctor (Rep (Indexed t)) b'
143 , GAsConstructor' ctor (Rep (Indexed t)) b'
148 , s ~ Infer t b' a
144 , s ~ Infer t b' a
149− , AsConstructor0 ctor s t a b
150 ) => AsConstructor ctor s t a b where
145 ) => AsConstructor ctor s t a b where
151
146
152 _Ctor = _Ctor0 @ctor
147 _Ctor = _Ctor0 @ctor
153 {-# INLINE[2] _Ctor #-}
148 {-# INLINE[2] _Ctor #-}
154
149
155−-- | See Note [Uncluttering type signatures]
150+-- See Note [Uncluttering type signatures]
156−#if __GLASGOW_HASKELL__ < 804
157−-- >>> :t _Ctor
158−-- _Ctor
159−-- :: (Applicative f, Data.Profunctor.Choice.Choice p,
160−-- AsConstructor ctor s t a b) =>
161−-- p a (f b) -> p s (f t)
162−#else
163−-- >>> :t _Ctor
164−-- _Ctor
165−-- :: (AsConstructor ctor s t a b, Data.Profunctor.Choice.Choice p,
166−-- Applicative f) =>
167−-- p a (f b) -> p s (f t)
168−#endif
169instance {-# OVERLAPPING #-} AsConstructor ctor (Void1 a) (Void1 b) a b where
151instance {-# OVERLAPPING #-} AsConstructor ctor (Void1 a) (Void1 b) a b where
170 _Ctor = undefined
152 _Ctor = undefined
171
153
172instance
154instance
155+ ( Generic s
156+ , Generic t
173− ( ErrorUnless ctor s (HasCtorP ctor (Rep s))
157+ , ErrorUnless ctor s (HasCtorP ctor (Rep s))
174 , GAsConstructor' ctor (Rep s) a -- TODO: add a test similar to #62 for prisms
158 , GAsConstructor' ctor (Rep s) a -- TODO: add a test similar to #62 for prisms
175 , GAsConstructor' ctor (Rep (Indexed s)) a'
159 , GAsConstructor' ctor (Rep (Indexed s)) a'
176 , GAsConstructor ctor (Rep s) (Rep t) a b
160 , GAsConstructor ctor (Rep s) (Rep t) a b
177 , GAsConstructor' ctor (Rep (Indexed t)) b'
161 , GAsConstructor' ctor (Rep (Indexed t)) b'
178 , UnifyHead s t
162 , UnifyHead s t
179 , UnifyHead t s
163 , UnifyHead t s
180− , AsConstructor0 ctor s t a b
181 ) => AsConstructor_ ctor s t a b where
164 ) => AsConstructor_ ctor s t a b where
182
165
183 _Ctor_ = _Ctor0 @ctor
166 _Ctor_ = _Ctor0 @ctor
@@ -190,11 +173,6 @@ instance
190 ( Generic s
173 ( Generic s
191 , Generic t
174 , Generic t
192 , GAsConstructor ctor (Rep s) (Rep t) a b
175 , GAsConstructor ctor (Rep s) (Rep t) a b
193− , Defined (Rep s)
194− (NoGeneric s '[ 'Text "arising from a generic prism focusing on the "
195− ':<>: QuoteType ctor ':<>: 'Text " constructor of type " ':<>: QuoteType a
196− , 'Text "in " ':<>: QuoteType s])
197− (() :: Constraint)
198 ) => AsConstructor0 ctor s t a b where
176 ) => AsConstructor0 ctor s t a b where
199 _Ctor0 = prismRavel (prismPRavel (repIso . _GCtor @ctor))
177 _Ctor0 = prismRavel (prismPRavel (repIso . _GCtor @ctor))
200 {-# INLINE[2] _Ctor0 #-}
178 {-# INLINE[2] _Ctor0 #-}
src/Data/Generics/Sum/Internal/Constructors.hs+1−1
@@ -14,7 +14,7 @@
14-----------------------------------------------------------------------------
14-----------------------------------------------------------------------------
15-- |
15-- |
16-- Module : Data.Generics.Sum.Internal.Constructors
16-- Module : Data.Generics.Sum.Internal.Constructors
17−-- Copyright : (C) 2019 Csongor Kiss
17+-- Copyright : (C) 2018 Csongor Kiss
18-- License : BSD3
18-- License : BSD3
19-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
19-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
20-- Stability : experimental
20-- Stability : experimental
src/Data/Generics/Sum/Internal/Subtype.hs+1−1
@@ -14,7 +14,7 @@
14-----------------------------------------------------------------------------
14-----------------------------------------------------------------------------
15-- |
15-- |
16-- Module : Data.Generics.Sum.Internal.Subtype
16-- Module : Data.Generics.Sum.Internal.Subtype
17−-- Copyright : (C) 2019 Csongor Kiss
17+-- Copyright : (C) 2018 Csongor Kiss
18-- License : BSD3
18-- License : BSD3
19-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
19-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
20-- Stability : experimental
20-- Stability : experimental
src/Data/Generics/Sum/Internal/Typed.hs+1−1
@@ -13,7 +13,7 @@
13-----------------------------------------------------------------------------
13-----------------------------------------------------------------------------
14-- |
14-- |
15-- Module : Data.Generics.Sum.Internal.Typed
15-- Module : Data.Generics.Sum.Internal.Typed
16−-- Copyright : (C) 2019 Csongor Kiss
16+-- Copyright : (C) 2018 Csongor Kiss
17-- License : BSD3
17-- License : BSD3
18-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
18-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
19-- Stability : experimental
19-- Stability : experimental
src/Data/Generics/Sum/Subtype.hs+2−38
@@ -1,4 +1,3 @@
1−{-# LANGUAGE CPP #-}
2{-# LANGUAGE FlexibleContexts #-}
1{-# LANGUAGE FlexibleContexts #-}
3{-# LANGUAGE FlexibleInstances #-}
2{-# LANGUAGE FlexibleInstances #-}
4{-# LANGUAGE MonoLocalBinds #-}
3{-# LANGUAGE MonoLocalBinds #-}
@@ -12,7 +11,7 @@
12-----------------------------------------------------------------------------
11-----------------------------------------------------------------------------
13-- |
12-- |
14-- Module : Data.Generics.Sum.Subtype
13-- Module : Data.Generics.Sum.Subtype
15−-- Copyright : (C) 2019 Csongor Kiss
14+-- Copyright : (C) 2018 Csongor Kiss
16-- License : BSD3
15-- License : BSD3
17-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
16-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
18-- Stability : experimental
17-- Stability : experimental
@@ -114,45 +113,10 @@ instance
114 _Sub f = prismRavel (repIso . _GSub . fromIso repIso) f
113 _Sub f = prismRavel (repIso . _GSub . fromIso repIso) f
115 {-# INLINE[2] _Sub #-}
114 {-# INLINE[2] _Sub #-}
116
115
117−-- | Reflexive case
118−-- >>> _Sub # dog :: Animal
119−-- Dog (MkDog {name = "Shep", age = 3})
120−instance {-# OVERLAPPING #-} AsSubtype a a where
121− _Sub = id
122− {-# INLINE[2] _Sub #-}
123−
124−-- | See Note [Uncluttering type signatures]
116+-- See Note [Uncluttering type signatures]
125−#if __GLASGOW_HASKELL__ < 804
126−-- >>> :t _Sub
127−--_Sub
128−-- :: (Applicative f, Data.Profunctor.Choice.Choice p,
129−-- AsSubtype sub sup) =>
130−-- p sub (f sub) -> p sup (f sup)
131−-- >>> :t _Sub
132−#else
133−--_Sub
134−-- :: (AsSubtype sub sup, Data.Profunctor.Choice.Choice p,
135−-- Applicative f) =>
136−-- p sub (f sub) -> p sup (f sup)
137−#endif
138instance {-# OVERLAPPING #-} AsSubtype a Void where
117instance {-# OVERLAPPING #-} AsSubtype a Void where
139 injectSub = undefined
118 injectSub = undefined
140 projectSub = undefined
119 projectSub = undefined
141−
142−-- | See Note [Uncluttering type signatures]
143−#if __GLASGOW_HASKELL__ < 804
144−-- >>> :t _Sub @Int
145−-- _Sub @Int
146−-- :: (Applicative f, Data.Profunctor.Choice.Choice p,
147−-- AsSubtype Int sup) =>
148−-- p Int (f Int) -> p sup (f sup)
149−#else
150−-- >>> :t _Sub @Int
151−-- _Sub @Int
152−-- :: (AsSubtype Int sup, Data.Profunctor.Choice.Choice p,
153−-- Applicative f) =>
154−-- p Int (f Int) -> p sup (f sup)
155−#endif
156instance {-# OVERLAPPING #-} AsSubtype Void a where
120instance {-# OVERLAPPING #-} AsSubtype Void a where
157 injectSub = undefined
121 injectSub = undefined
158 projectSub = undefined
122 projectSub = undefined
src/Data/Generics/Sum/Typed.hs+2−33
@@ -1,4 +1,3 @@
1−{-# LANGUAGE CPP #-}
2{-# LANGUAGE TypeApplications #-}
1{-# LANGUAGE TypeApplications #-}
3{-# LANGUAGE AllowAmbiguousTypes #-}
2{-# LANGUAGE AllowAmbiguousTypes #-}
4{-# LANGUAGE DataKinds #-}
3{-# LANGUAGE DataKinds #-}
@@ -14,7 +13,7 @@
14-----------------------------------------------------------------------------
13-----------------------------------------------------------------------------
15-- |
14-- |
16-- Module : Data.Generics.Sum.Typed
15-- Module : Data.Generics.Sum.Typed
17−-- Copyright : (C) 2019 Csongor Kiss
16+-- Copyright : (C) 2018 Csongor Kiss
18-- License : BSD3
17-- License : BSD3
19-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
18-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
20-- Stability : experimental
19-- Stability : experimental
@@ -35,7 +34,6 @@ import Data.Kind
35import GHC.Generics
34import GHC.Generics
36import GHC.TypeLits (TypeError, ErrorMessage (..), Symbol)
35import GHC.TypeLits (TypeError, ErrorMessage (..), Symbol)
37import Data.Generics.Sum.Internal.Typed
36import Data.Generics.Sum.Internal.Typed
38−import Data.Generics.Internal.Errors
39
37
40import Data.Generics.Internal.Families
38import Data.Generics.Internal.Families
41import Data.Generics.Internal.Void
39import Data.Generics.Internal.Void
@@ -111,45 +109,16 @@ instance
111 , as ~ TupleToList a
109 , as ~ TupleToList a
112 , ListTuple a as
110 , ListTuple a as
113 , GAsType (Rep s) as
111 , GAsType (Rep s) as
114− , Defined (Rep s)
115− (NoGeneric s '[ 'Text "arising from a generic prism focusing on a constructor of type " ':<>: QuoteType a])
116− (() :: Constraint)
117 ) => AsType a s where
112 ) => AsType a s where
118
113
119 _Typed eta = prismRavel (prismPRavel (repIso . _GTyped @_ @as . tupled)) eta
114 _Typed eta = prismRavel (prismPRavel (repIso . _GTyped @_ @as . tupled)) eta
120 {-# INLINE[2] _Typed #-}
115 {-# INLINE[2] _Typed #-}
121
116
122−-- | See Note [Uncluttering type signatures]
117+-- See Note [Uncluttering type signatures]
123−#if __GLASGOW_HASKELL__ < 804
124−-- >>> :t _Typed
125−-- _Typed
126−-- :: (Applicative f, Data.Profunctor.Choice.Choice p, AsType a s) =>
127−-- p a (f a) -> p s (f s)
128−#else
129−-- >>> :t _Typed
130−-- _Typed
131−-- :: (AsType a s, Data.Profunctor.Choice.Choice p, Applicative f) =>
132−-- p a (f a) -> p s (f s)
133−#endif
134instance {-# OVERLAPPING #-} AsType a Void where
118instance {-# OVERLAPPING #-} AsType a Void where
135 _Typed = undefined
119 _Typed = undefined
136 injectTyped = undefined
120 injectTyped = undefined
137 projectTyped = undefined
121 projectTyped = undefined
138−
139−-- | See Note [Uncluttering type signatures]
140−#if __GLASGOW_HASKELL__ < 804
141−-- >>> :t _Typed @Int
142−-- _Typed @Int
143−-- :: (Applicative f, Data.Profunctor.Choice.Choice p,
144−-- AsType Int s) =>
145−-- p Int (f Int) -> p s (f s)
146−#else
147−-- >>> :t _Typed @Int
148−-- _Typed @Int
149−-- :: (AsType Int s, Data.Profunctor.Choice.Choice p,
150−-- Applicative f) =>
151−-- p Int (f Int) -> p s (f s)
152−#endif
153instance {-# OVERLAPPING #-} AsType Void a where
122instance {-# OVERLAPPING #-} AsType Void a where
154 _Typed = undefined
123 _Typed = undefined
155 injectTyped = undefined
124 injectTyped = undefined
src/Data/Generics/Wrapped.hs+1−1
@@ -14,7 +14,7 @@
14-----------------------------------------------------------------------------
14-----------------------------------------------------------------------------
15-- |
15-- |
16-- Module : Data.Generics.Wrapped
16-- Module : Data.Generics.Wrapped
17−-- Copyright : (C) 2019 Csongor Kiss
17+-- Copyright : (C) 2018 Csongor Kiss
18-- License : BSD3
18-- License : BSD3
19-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
19-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
20-- Stability : experimental
20-- Stability : experimental
test/CustomChildren.hsdeleted−63
@@ -1,63 +0,0 @@
1−{-# LANGUAGE DataKinds #-}
2−{-# LANGUAGE DeriveGeneric #-}
3−{-# LANGUAGE FlexibleInstances #-}
4−{-# LANGUAGE KindSignatures #-}
5−{-# LANGUAGE MultiParamTypeClasses #-}
6−{-# LANGUAGE TypeApplications #-}
7−{-# LANGUAGE TypeFamilies #-}
8−{-# LANGUAGE UndecidableInstances #-}
9−
10−module CustomChildren
11− ( customTypesTest
12− ) where
13−
14−import GHC.Generics
15−import Data.Generics.Product
16−import Test.HUnit
17−import Data.Generics.Internal.VL.Lens
18−import Data.Generics.Labels ()
19−import Data.Kind
20−
21−-- Opaque has no Generic instance
22−data Opaque = Opaque String
23− deriving (Show, Eq)
24−
25−-- Hide does have a Generic instance, but we want to hide its contents
26−-- from the traversal
27−data Hide = Hide String
28− deriving (Show, Generic, Eq)
29−
30−-- We first define a symbol for the custom traversal
31−data Custom
32−
33−type instance Children Custom a = ChildrenCustom a
34−
35−type family ChildrenCustom (a :: Type) where
36− ChildrenCustom Opaque = '[String] -- here we state explicitly that Opaque contains a String
37− ChildrenCustom Hide = '[] -- and hide the contents of Hide
38− ChildrenCustom a = Children ChGeneric a -- for the rest, we defer to the generic children
39−
40−-- We define the traversal of Opaque like so:
41−instance HasTypesCustom Custom Opaque String where
42− typesCustom f (Opaque str) = Opaque <$> f str
43−
44−customTypesTest1 :: Test
45−customTypesTest1
46− = TestCase (assertEqual "foo" (over (typesUsing @Custom @String) (++ "!") original) expected)
47− where original = (Opaque "foo", Hide "bar")
48− expected = (Opaque "foo!", Hide "bar") -- only Opaque's String gets modified
49−
50−customTypesTest2 :: Test
51−customTypesTest2
52− = TestCase (assertEqual "foo" (over (typesUsing @Custom @String) (++ "!") original) expected)
53− where original = Opaque "foo"
54− expected = Opaque "foo!"
55−
56−customTypesTest3 :: Test
57−customTypesTest3
58− = TestCase (assertEqual "foo" (over (typesUsing @Custom @String) (++ "!") original) expected)
59− where original = Hide "foo"
60− expected = Hide "foo"
61−
62−customTypesTest :: Test
63−customTypesTest = TestList [customTypesTest1, customTypesTest2, customTypesTest3]
test/Spec.hs+2−26
@@ -2,7 +2,6 @@
2{-# OPTIONS_GHC -dsuppress-all #-}
2{-# OPTIONS_GHC -dsuppress-all #-}
3
3
4{-# LANGUAGE AllowAmbiguousTypes #-}
4{-# LANGUAGE AllowAmbiguousTypes #-}
5−{-# LANGUAGE CPP #-}
6{-# LANGUAGE DataKinds #-}
5{-# LANGUAGE DataKinds #-}
7{-# LANGUAGE DeriveGeneric #-}
6{-# LANGUAGE DeriveGeneric #-}
8{-# LANGUAGE DuplicateRecordFields #-}
7{-# LANGUAGE DuplicateRecordFields #-}
@@ -11,7 +10,6 @@
11{-# LANGUAGE ScopedTypeVariables #-}
10{-# LANGUAGE ScopedTypeVariables #-}
12{-# LANGUAGE TypeApplications #-}
11{-# LANGUAGE TypeApplications #-}
13{-# LANGUAGE TemplateHaskell #-}
12{-# LANGUAGE TemplateHaskell #-}
14−{-# LANGUAGE OverloadedLabels #-}
15
13
16module Main where
14module Main where
17
15
@@ -25,16 +23,11 @@ import System.Exit
25import Data.Generics.Internal.VL.Lens
23import Data.Generics.Internal.VL.Lens
26import Data.Generics.Internal.VL.Prism
24import Data.Generics.Internal.VL.Prism
27import Data.Generics.Internal.VL.Traversal
25import Data.Generics.Internal.VL.Traversal
28−import Control.Lens (_1, (+~))
29−import Data.Function ((&))
30−import Data.Generics.Labels ()
31
26
32-- This is sufficient at we only want to test that they typecheck
27-- This is sufficient at we only want to test that they typecheck
33import Test24 ()
28import Test24 ()
34import Test25 ()
29import Test25 ()
35
30
36−import CustomChildren (customTypesTest)
37−
38main :: IO ()
31main :: IO ()
39main = do
32main = do
40 res <- runTestTT tests
33 res <- runTestTT tests
@@ -201,13 +194,13 @@ subtypeLensGeneric :: Lens' Record Record2
201subtypeLensGeneric = super
194subtypeLensGeneric = super
202
195
203typeChangingGeneric :: Lens (Record3 a) (Record3 b) a b
196typeChangingGeneric :: Lens (Record3 a) (Record3 b) a b
204−typeChangingGeneric = #fieldA
197+typeChangingGeneric = field @"fieldA"
205
198
206typeChangingGenericPos :: Lens (Record3 a) (Record3 b) a b
199typeChangingGenericPos :: Lens (Record3 a) (Record3 b) a b
207typeChangingGenericPos = position @1
200typeChangingGenericPos = position @1
208
201
209typeChangingGenericCompose :: Lens (Record3 (Record3 a)) (Record3 (Record3 b)) a b
202typeChangingGenericCompose :: Lens (Record3 (Record3 a)) (Record3 (Record3 b)) a b
210−typeChangingGenericCompose = #fieldA . #fieldA
203+typeChangingGenericCompose = field @"fieldA" . field @"fieldA"
211
204
212typeChangingGenericCompose_ :: Lens (Record3 (Record3 a)) (Record3 (Record3 b)) a b
205typeChangingGenericCompose_ :: Lens (Record3 (Record3 a)) (Record3 (Record3 b)) a b
213typeChangingGenericCompose_ = field_ @"fieldA" . field_ @"fieldA"
206typeChangingGenericCompose_ = field_ @"fieldA" . field_ @"fieldA"
@@ -230,12 +223,6 @@ sum2TypePrism = _Typed @Int
230sum2TypePrismChar :: Prism Sum2 Sum2 Char Char
223sum2TypePrismChar :: Prism Sum2 Sum2 Char Char
231sum2TypePrismChar = _Typed @Char
224sum2TypePrismChar = _Typed @Char
232
225
233−data SumOfProducts =
234− RecA { _foo :: Int, valA :: String }
235− | RecB { _foo :: Int, valB :: Bool }
236− | RecC { _foo :: Int }
237− deriving (Show, Eq, Generic)
238−
239tests :: Test
226tests :: Test
240tests = TestList $ map mkHUnitTest
227tests = TestList $ map mkHUnitTest
241 [ $(inspectTest $ 'fieldALensManual === 'fieldALensName)
228 [ $(inspectTest $ 'fieldALensManual === 'fieldALensName)
@@ -260,17 +247,6 @@ tests = TestList $ map mkHUnitTest
260 -- TODO [1.0.0.0]: these tests pass with the new implementation
247 -- TODO [1.0.0.0]: these tests pass with the new implementation
261-- , $(inspectTest $ 'sum3Param1Manual === 'sum3Param1Derived)
248-- , $(inspectTest $ 'sum3Param1Manual === 'sum3Param1Derived)
262-- , $(inspectTest $ 'sum3Param2Manual === 'sum3Param2Derived)
249-- , $(inspectTest $ 'sum3Param2Manual === 'sum3Param2Derived)
263− ] ++
264− -- Tests for overloaded labels
265− [ (valLabel ^. #_foo ) ~=? 3
266− , (valLabel & #_foo +~ 10 ) ~=? RecB 13 True
267−#if __GLASGOW_HASKELL__ >= 802
268− , (valLabel ^? #_RecB ) ~=? Just (3, True)
269− , (valLabel ^? #_RecB . _1 ) ~=? Just 3
270− , (valLabel ^? #_RecC ) ~=? Nothing
271−#endif
272− , customTypesTest
273 ]
250 ]
274− where valLabel = RecB 3 True
275
251
276-- TODO: add test for traversals over multiple types
252-- TODO: add test for traversals over multiple types
test/doctest.hs−1
@@ -4,5 +4,4 @@ main
4 [ "-isrc"
4 [ "-isrc"
5 , "src/Data/Generics/Product.hs"
5 , "src/Data/Generics/Product.hs"
6 , "src/Data/Generics/Sum.hs"
6 , "src/Data/Generics/Sum.hs"
7− , "src/Data/Generics/Labels.hs"
8 ]
7 ]