on b3a8b00 help sign in
.github/workflows/haskell.yml+1−1
since splitsnapshots
unifiedsplit
@@ -42,6 +42,6 @@ jobs:
42 - name: Build
42 - name: Build
43 run: cabal build --enable-tests --enable-benchmarks all
43 run: cabal build --enable-tests --enable-benchmarks all
44 - name: Run tests
44 - name: Run tests
45− run: cabal test --enable-tests all
45+ run: cabal test all
46 - name: Build Docs
46 - name: Build Docs
47 run: cabal haddock
47 run: cabal haddock
.travis.ymlnew file+171
@@ -0,0 +1,171 @@
1+# This Travis job script has been generated by a script via
2+#
3+# haskell-ci '--config=cabal.haskell-ci' 'cabal.project'
4+#
5+# For more information, see https://github.com/haskell-CI/haskell-ci
6+#
7+# version: 0.3.20190814
8+#
9+language: c
10+dist: xenial
11+sudo: required
12+git:
13+ # whether to recursively clone submodules
14+ submodules: false
15+cache:
16+ directories:
17+ - $HOME/.cabal/packages
18+ - $HOME/.cabal/store
19+before_cache:
20+ - rm -fv $CABALHOME/packages/hackage.haskell.org/build-reports.log
21+ # remove files that are regenerated by 'cabal update'
22+ - rm -fv $CABALHOME/packages/hackage.haskell.org/00-index.*
23+ - rm -fv $CABALHOME/packages/hackage.haskell.org/*.json
24+ - rm -fv $CABALHOME/packages/hackage.haskell.org/01-index.cache
25+ - rm -fv $CABALHOME/packages/hackage.haskell.org/01-index.tar
26+ - rm -fv $CABALHOME/packages/hackage.haskell.org/01-index.tar.idx
27+ - rm -rfv $CABALHOME/packages/head.hackage
28+matrix:
29+ include:
30+ - compiler: ghcjs-8.4
31+ addons: {"apt":{"sources":["hvr-ghc"],"packages":["cabal-install-3.0"]}}
32+ - compiler: ghc-8.8.1
33+ addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-8.8.1","cabal-install-3.0"]}}
34+ - compiler: ghc-8.6.5
35+ addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-8.6.5","cabal-install-2.4"]}}
36+ - compiler: ghc-8.4.4
37+ addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-8.4.4","cabal-install-2.4"]}}
38+ - compiler: ghc-8.2.2
39+ addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-8.2.2","cabal-install-2.4"]}}
40+ - compiler: ghc-8.0.2
41+ addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-8.0.2","cabal-install-2.4"]}}
42+before_install:
43+ - |
44+ if [ "$TRAVIS_OS_NAME" = "linux" ]; then
45+ sudo add-apt-repository -y ppa:hvr/ghcjs;
46+ curl -s https://deb.nodesource.com/gpgkey/nodesource.gpg.key | sudo apt-key add -
47+ sudo apt-add-repository 'https://deb.nodesource.com/node_8.x xenial main'
48+ sudo apt-get update;
49+ sudo apt-get install $CC cabal-install-3.0 nodejs;
50+ fi
51+ - HC=$(echo "/opt/$CC/bin/ghc" | sed 's/-/\//')
52+ - WITHCOMPILER="-w $HC"
53+ - |
54+ if echo $CC | grep -q ghcjs; then
55+ GHCJS=true
56+ HC=${HC}js
57+ WITHCOMPILER="--ghcjs ${WITHCOMPILER}js"
58+ else
59+ GHCJS=false;
60+ fi
61+ - if $GHCJS ; then sudo apt-get install -y ghc-8.4.4 ; fi
62+ - if $GHCJS ; then PATH="/opt/ghc/8.4.4/bin:$PATH" ; fi
63+ - HCPKG="$HC-pkg"
64+ - unset CC
65+ - CABAL=/opt/ghc/bin/cabal
66+ - CABALHOME=$HOME/.cabal
67+ - export PATH="$CABALHOME/bin:$PATH"
68+ - TOP=$(pwd)
69+ - "HCNUMVER=$(${HC} --numeric-version|perl -ne '/^(\\d+)\\.(\\d+)\\.(\\d+)(\\.(\\d+))?$/; print(10000 * $1 + 100 * $2 + ($3 == 0 ? $5 != 1 : $3))')"
70+ - echo $HCNUMVER
71+ - CABAL="$CABAL -vnormal+nowrap+markoutput"
72+ - set -o pipefail
73+ - |
74+ echo 'function blue(s) { printf "\033[0;34m" s "\033[0m " }' >> .colorful.awk
75+ echo 'BEGIN { state = "output"; }' >> .colorful.awk
76+ echo '/^-----BEGIN CABAL OUTPUT-----$/ { state = "cabal" }' >> .colorful.awk
77+ echo '/^-----END CABAL OUTPUT-----$/ { state = "output" }' >> .colorful.awk
78+ echo '!/^(-----BEGIN CABAL OUTPUT-----|-----END CABAL OUTPUT-----)/ {' >> .colorful.awk
79+ echo ' if (state == "cabal") {' >> .colorful.awk
80+ echo ' print blue($0)' >> .colorful.awk
81+ echo ' } else {' >> .colorful.awk
82+ echo ' print $0' >> .colorful.awk
83+ echo ' }' >> .colorful.awk
84+ echo '}' >> .colorful.awk
85+ - cat .colorful.awk
86+ - |
87+ color_cabal_output () {
88+ awk -f $TOP/.colorful.awk
89+ }
90+ - echo text | color_cabal_output
91+install:
92+ - ${CABAL} --version
93+ - echo "$(${HC} --version) [$(${HC} --print-project-git-commit-id 2> /dev/null || echo '?')]"
94+ - node --version
95+ - echo $GHCJS
96+ - TEST=--enable-tests
97+ - BENCH=--enable-benchmarks
98+ - BENCH=--disable-benchmarks
99+ - HEADHACKAGE=false
100+ - rm -f $CABALHOME/config
101+ - |
102+ echo "verbose: normal +nowrap +markoutput" >> $CABALHOME/config
103+ echo "remote-build-reporting: anonymous" >> $CABALHOME/config
104+ echo "write-ghc-environment-files: always" >> $CABALHOME/config
105+ echo "remote-repo-cache: $CABALHOME/packages" >> $CABALHOME/config
106+ echo "logs-dir: $CABALHOME/logs" >> $CABALHOME/config
107+ echo "world-file: $CABALHOME/world" >> $CABALHOME/config
108+ echo "extra-prog-path: $CABALHOME/bin" >> $CABALHOME/config
109+ echo "symlink-bindir: $CABALHOME/bin" >> $CABALHOME/config
110+ echo "installdir: $CABALHOME/bin" >> $CABALHOME/config
111+ echo "build-summary: $CABALHOME/logs/build.log" >> $CABALHOME/config
112+ echo "store-dir: $CABALHOME/store" >> $CABALHOME/config
113+ echo "install-dirs user" >> $CABALHOME/config
114+ echo " prefix: $CABALHOME" >> $CABALHOME/config
115+ echo "repository hackage.haskell.org" >> $CABALHOME/config
116+ echo " url: http://hackage.haskell.org/" >> $CABALHOME/config
117+ - cat $CABALHOME/config
118+ - rm -fv cabal.project cabal.project.local cabal.project.freeze
119+ - travis_retry ${CABAL} v2-update -v
120+ - if $GHCJS ; then (cd /tmp && ${CABAL} v2-install -w ghc-8.4.4 happy) ; fi
121+ # Generate cabal.project
122+ - rm -rf cabal.project cabal.project.local cabal.project.freeze
123+ - touch cabal.project
124+ - |
125+ echo "packages: ." >> cabal.project
126+ - |
127+ - cat cabal.project || true
128+ - cat cabal.project.local || true
129+ - if [ -f "./configure.ac" ]; then (cd "." && autoreconf -i); fi
130+ - ${CABAL} v2-freeze $WITHCOMPILER ${TEST} ${BENCH} | color_cabal_output
131+ - "cat cabal.project.freeze | sed -E 's/^(constraints: *| *)//' | sed 's/any.//'"
132+ - rm cabal.project.freeze
133+script:
134+ - DISTDIR=$(mktemp -d /tmp/dist-test.XXXX)
135+ # Packaging...
136+ - ${CABAL} v2-sdist all | color_cabal_output
137+ # Unpacking...
138+ - mv dist-newstyle/sdist/*.tar.gz ${DISTDIR}/
139+ - cd ${DISTDIR} || false
140+ - find . -maxdepth 1 -type f -name '*.tar.gz' -exec tar -xvf '{}' \;
141+ - find . -maxdepth 1 -type f -name '*.tar.gz' -exec rm '{}' \;
142+ - PKGDIR_patch="$(find . -maxdepth 1 -type d -regex '.*/patch-[0-9.]*')"
143+ # Generate cabal.project
144+ - rm -rf cabal.project cabal.project.local cabal.project.freeze
145+ - touch cabal.project
146+ - |
147+ echo "packages: ${PKGDIR_patch}" >> cabal.project
148+ - |
149+ - cat cabal.project || true
150+ - cat cabal.project.local || true
151+ # Building...
152+ # this builds all libraries and executables (without tests/benchmarks)
153+ - ${CABAL} v2-build $WITHCOMPILER --disable-tests --disable-benchmarks all | color_cabal_output
154+ # Building with tests and benchmarks...
155+ # build & run tests, build benchmarks
156+ - ${CABAL} v2-build $WITHCOMPILER ${TEST} ${BENCH} all | color_cabal_output
157+ # Testing...
158+ - if ! $GHCJS ; then ${CABAL} v2-test $WITHCOMPILER ${TEST} ${BENCH} all | color_cabal_output ; fi
159+ # cabal check...
160+ - (cd ${PKGDIR_patch} && ${CABAL} -vnormal check)
161+ # haddock...
162+ - if ! $GHCJS ; then ${CABAL} v2-haddock $WITHCOMPILER ${TEST} ${BENCH} all | color_cabal_output ; fi
163+ # Constraint sets
164+ - rm -rf cabal.project.local
165+ # Constraint set old-these
166+ - if $GHCJS || ! $GHCJS && [ $HCNUMVER -lt 80800 ] ; then ${CABAL} v2-build $WITHCOMPILER --disable-tests --disable-benchmarks --constraint='these <1' all | color_cabal_output ; fi
167+ # Constraint set old-witherable
168+ - ${CABAL} v2-build $WITHCOMPILER --disable-tests --disable-benchmarks --constraint='witherable <0.3.2' all | color_cabal_output
169+
170+# REGENDATA ["--config=cabal.haskell-ci","cabal.project"]
171+# EOF
ChangeLog.md+21−11
@@ -2,39 +2,49 @@
2
2
3## Unreleased
3## Unreleased
4
4
5−* New dep of `data-orphans` for old GHC to get instances honestly instead of
5+* Remove the `split-these` flag.
6− via `monoidal-containers`.
6+ We do not need it as we only use the `These` datatype which is provided in all versions.
7
7
8−## 0.0.5.0 - 2021-12-17
8+* Stop defining `Group`; `Group` from the `groups` package can be used instead.
9+
10+ Most of the instances are provided by `groups`, except the `Group
11+ MonoidalMap` instance, which is not lawful. `reflex` might provide it as an
12+ orphan for backwards compat, temporarily, but it should eventually be removed
13+ everywhere.
14+
15+* `Additive` is still defined, because the `Abelian` from `groups` has too
16+ stringent a constraint.
9
17
10* `Additive` now lives in `Data.Semigroup.Additive`, but is still reexported
18* `Additive` now lives in `Data.Semigroup.Additive`, but is still reexported
11 from `Data.Patch` for compatability.
19 from `Data.Patch` for compatability.
12
20
21+## Unreleased
22+
13* Rewrite `PatchMapWithMove` in terms of `PatchMapWithPatchingMove`.
23* Rewrite `PatchMapWithMove` in terms of `PatchMapWithPatchingMove`.
14 Care is taken to make this not a breaking change.
24 Care is taken to make this not a breaking change.
15 In particular, `PatchMapWithMove` is a newtype of `PatchMapWithPatchingMove`, as is the `NodeInfo` and `From` of `PatchMapWithPatchingMove`'s versions of those.
25 In particular, `PatchMapWithMove` is a newtype of `PatchMapWithPatchingMove`, as is the `NodeInfo` and `From` of `PatchMapWithPatchingMove`'s versions of those.
16 There are complete constructor and field patterns too, and everything is
26 There are complete constructor and field patterns too, and everything is
17 exported under the newtype as real constructors and fields would be.
27 exported under the newtype as real constructors and fields would be.
18
28
19−## 0.0.4.0 - 2021-04-20
29+## 0.0.4.0
20
30
21* Enable PolyKinds
31* Enable PolyKinds
22
32
23−## 0.0.3.2 - 2020-11-06
33+## 0.0.3.2
24
34
25* Update version bounds
35* Update version bounds
26
36
27−## 0.0.3.1 - 2020-02-05
37+## 0.0.3.1
28
38
29* Replace `fromJust` with something easier to debug.
39* Replace `fromJust` with something easier to debug.
30
40
31−## 0.0.3.0 - 2020-02-05
41+## 0.0.3.0
32
42
33* Create `PatchMapWithPatchingMove` variant which supports moves with a patch.
43* Create `PatchMapWithPatchingMove` variant which supports moves with a patch.
34
44
35* Create `DecidablyEmpty` subclass of `Monoid`.
45* Create `DecidablyEmpty` subclass of `Monoid`.
36
46
37−## 0.0.2.0 - 2020-01-17
47+## 0.0.2.0
38
48
39* Consistently provide:
49* Consistently provide:
40
50
@@ -46,16 +56,16 @@
46
56
47 for `PatchMap`, `PatchIntMap`, and `PatchMapWithMove`.
57 for `PatchMap`, `PatchIntMap`, and `PatchMapWithMove`.
48
58
49−## 0.0.1.0 - 2020-01-09
59+## 0.0.1.0
50
60
51* Support older GHCs with `split-these` flag.
61* Support older GHCs with `split-these` flag.
52
62
53* Additional instances for the `Group` class for basic types.
63* Additional instances for the `Group` class for basic types.
54
64
55−## 0.0.0.1 - 2020-01-08
65+## 0.0.0.1
56
66
57* Remove unneeded dependencies
67* Remove unneeded dependencies
58
68
59−## 0.0.0.0 - 2020-01-08
69+## 0.0.0.0
60
70
61* Extract patching functionality from Reflex.
71* Extract patching functionality from Reflex.
cabal.haskell-cinew file+14
@@ -0,0 +1,14 @@
1+distribution: xenial
2+benchmarks: False
3+unconstrained: False
4+installed: -all
5+
6+-- https://github.com/haskell/cabal/issues/6106
7+install-dependencies: False
8+
9+constraint-set old-these
10+ ghc: <8.8
11+ constraints: these <1
12+
13+constraint-set old-witherable
14+ constraints: witherable <0.3.2
dep/reflex-platform/default.nix+1−7
@@ -1,8 +1,2 @@
1# DO NOT HAND-EDIT THIS FILE
1# DO NOT HAND-EDIT THIS FILE
2−let fetch = { private ? false, fetchSubmodules ? false, owner, repo, rev, sha256, ... }:
2+import (import ./thunk.nix)
3− if !fetchSubmodules && !private then builtins.fetchTarball {
4− url = "https://github.com/${owner}/${repo}/archive/${rev}.tar.gz"; inherit sha256;
5− } else (import <nixpkgs> {}).fetchFromGitHub {
6− inherit owner repo rev sha256 fetchSubmodules private;
7− };
8−in import (fetch (builtins.fromJSON (builtins.readFile ./github.json)))
dep/reflex-platform/github.json+2−2
@@ -3,6 +3,6 @@
3 "repo": "reflex-platform",
3 "repo": "reflex-platform",
4 "branch": "master",
4 "branch": "master",
5 "private": false,
5 "private": false,
6− "rev": "c9d11db1b98855fe8ab24a3ff6a5dbe0ad902ad9",
6+ "rev": "efc6d923c633207d18bd4d8cae3e20110a377864",
7− "sha256": "0sfzkqdvyah5mwvmli0wq1nl0b8cvk2cmfgfy4rz57wv42x3099y"
7+ "sha256": "121rmnkx8nwiy96ipfyyv6vrgysv0zpr2br46y70zf4d0y1h1lz5"
8}
8}
dep/reflex-platform/thunk.nixnew file+9
@@ -0,0 +1,9 @@
1+# DO NOT HAND-EDIT THIS FILE
2+let fetch = { private ? false, fetchSubmodules ? false, owner, repo, rev, sha256, ... }:
3+ if !fetchSubmodules && !private then builtins.fetchTarball {
4+ url = "https://github.com/${owner}/${repo}/archive/${rev}.tar.gz"; inherit sha256;
5+ } else (import <nixpkgs> {}).fetchFromGitHub {
6+ inherit owner repo rev sha256 fetchSubmodules private;
7+ };
8+ json = builtins.fromJSON (builtins.readFile ./github.json);
9+in fetch json
patch.cabal+3−15
@@ -1,5 +1,5 @@
1Name: patch
1Name: patch
2−Version: 0.0.5.0
2+Version: 0.1.0.0
3Synopsis: Data structures for describing changes to other data structures.
3Synopsis: Data structures for describing changes to other data structures.
4Description:
4Description:
5 Data structures for describing changes to other data structures.
5 Data structures for describing changes to other data structures.
@@ -25,11 +25,6 @@ tested-with:
25 GHC ==8.0.2 || ==8.2.2 || ==8.4.4 || ==8.6.5 || ==8.8.1
25 GHC ==8.0.2 || ==8.2.2 || ==8.4.4 || ==8.6.5 || ==8.8.1
26 GHCJS ==8.4
26 GHCJS ==8.4
27
27
28−flag split-these
29− description: Use split these/semialign packages
30− manual: False
31− default: True
32−
33library
28library
34 hs-source-dirs: src
29 hs-source-dirs: src
35 default-language: Haskell2010
30 default-language: Haskell2010
@@ -40,8 +35,9 @@ library
40 , dependent-sum >= 0.6 && < 0.8
35 , dependent-sum >= 0.6 && < 0.8
41 , lens >= 4.7 && < 5
36 , lens >= 4.7 && < 5
42 , semigroupoids >= 4.0 && < 6
37 , semigroupoids >= 4.0 && < 6
38+ , these >= 0.4 && < 1.2
43 , transformers >= 0.5.6.0 && < 0.6
39 , transformers >= 0.5.6.0 && < 0.6
44− , witherable >= 0.3 && < 0.5
40+ , witherable >= 0.3 && < 0.4
45
41
46 if impl(ghc < 8.6) -- really, if base < 8.12
42 if impl(ghc < 8.6) -- really, if base < 8.12
47 build-depends: base-orphans >= 0.8 && < 0.9
43 build-depends: base-orphans >= 0.8 && < 0.9
@@ -61,14 +57,6 @@ library
61 ghc-options: -Wall -fwarn-redundant-constraints -fwarn-tabs
57 ghc-options: -Wall -fwarn-redundant-constraints -fwarn-tabs
62 default-extensions: PolyKinds
58 default-extensions: PolyKinds
63
59
64− if flag(split-these)
65− build-depends: these >= 1 && <1.2
66− , semialign >=1 && <1.2
67− , monoidal-containers >= 0.6 && < 0.7
68− else
69− build-depends: these >= 0.4 && <0.9
70− , monoidal-containers == 0.4.0.0
71−
72test-suite tests
60test-suite tests
73 default-language: Haskell2010
61 default-language: Haskell2010
74 type: exitcode-stdio-1.0
62 type: exitcode-stdio-1.0
src/Data/Patch.hs+1−56
@@ -1,8 +1,6 @@
1{-# LANGUAGE CPP #-}
1{-# LANGUAGE CPP #-}
2−{-# LANGUAGE GeneralizedNewtypeDeriving #-}
3−{-# LANGUAGE StandaloneDeriving #-}
4−{-# LANGUAGE TypeFamilies #-}
5{-# LANGUAGE TypeOperators #-}
2{-# LANGUAGE TypeOperators #-}
3+{-# LANGUAGE TypeFamilies #-}
6-- |
4-- |
7-- Module:
5-- Module:
8-- Data.Patch
6-- Data.Patch
@@ -13,15 +11,9 @@ module Data.Patch
13 , module X
11 , module X
14 ) where
12 ) where
15
13
16−import Control.Applicative
17−import Data.Functor.Const (Const (..))
18−import Data.Functor.Identity
19−import Data.Map.Monoidal (MonoidalMap)
20−import Data.Proxy
21#if !MIN_VERSION_base(4,11,0)
14#if !MIN_VERSION_base(4,11,0)
22import Data.Semigroup (Semigroup (..))
15import Data.Semigroup (Semigroup (..))
23#endif
16#endif
24−import GHC.Generics
25
17
26import Data.Semigroup.Additive as X
18import Data.Semigroup.Additive as X
27import Data.Patch.Class as X
19import Data.Patch.Class as X
@@ -40,56 +32,9 @@ import Data.Patch.MapWithMove as X
40 , unsafePatchMapWithMove
32 , unsafePatchMapWithMove
41 )
33 )
42
34
43−-- | A 'Group' is a 'Monoid' where every element has an inverse.
44−class (Semigroup q, Monoid q) => Group q where
45− negateG :: q -> q
46− (~~) :: q -> q -> q
47− r ~~ s = r <> negateG s
48−
49-- | The elements of an 'Additive' 'Semigroup' can be considered as patches of their own type.
35-- | The elements of an 'Additive' 'Semigroup' can be considered as patches of their own type.
50newtype AdditivePatch p = AdditivePatch { unAdditivePatch :: p }
36newtype AdditivePatch p = AdditivePatch { unAdditivePatch :: p }
51
37
52instance Additive p => Patch (AdditivePatch p) where
38instance Additive p => Patch (AdditivePatch p) where
53 type PatchTarget (AdditivePatch p) = p
39 type PatchTarget (AdditivePatch p) = p
54 apply (AdditivePatch p) q = Just $ p <> q
40 apply (AdditivePatch p) q = Just $ p <> q
55−
56−instance (Ord k, Group q) => Group (MonoidalMap k q) where
57− negateG = fmap negateG
58−
59−-- | Trivial group.
60−instance Group () where
61− negateG _ = ()
62− _ ~~ _ = ()
63−
64−-- | Product group. A Pair of groups gives rise to a group
65−instance (Group a, Group b) => Group (a, b) where
66− negateG (a, b) = (negateG a, negateG b)
67− (a, b) ~~ (c, d) = (a ~~ c, b ~~ d)
68−
69−-- See https://gitlab.haskell.org/ghc/ghc/issues/11135#note_111802 for the reason Compose is not also provided.
70−-- Base does not define Monoid (Compose f g a) so this is the best we can
71−-- really do for functor composition.
72−instance Group (f (g a)) => Group ((f :.: g) a) where
73− negateG (Comp1 xs) = Comp1 (negateG xs)
74− Comp1 xs ~~ Comp1 ys = Comp1 (xs ~~ ys)
75−
76−-- | Product of groups, Functor style.
77−instance (Group (f a), Group (g a)) => Group ((f :*: g) a) where
78− negateG (a :*: b) = negateG a :*: negateG b
79− (a :*: b) ~~ (c :*: d) = (a ~~ c) :*: (b ~~ d)
80−
81−-- | Trivial group, Functor style
82−instance Group (Proxy x) where
83− negateG _ = Proxy
84− _ ~~ _ = Proxy
85−
86−-- | Const lifts groups into a functor.
87−deriving instance Group a => Group (Const a x)
88−
89−-- | Identity lifts groups pointwise (at only one point)
90−deriving instance Group a => Group (Identity a)
91−
92−-- | Functions lift groups pointwise.
93−instance Group b => Group (a -> b) where
94− negateG f = negateG . f
95− (~~) = liftA2 (~~)
src/Data/Semigroup/Additive.hs+7−9
@@ -26,11 +26,10 @@ import GHC.Generics
26-- | An 'Additive' 'Semigroup' is one where (<>) is commutative
26-- | An 'Additive' 'Semigroup' is one where (<>) is commutative
27class Semigroup q => Additive q where
27class Semigroup q => Additive q where
28
28
29−-- | Trivial additive semigroup.
29+-- | Trivial group.
30instance Additive ()
30instance Additive ()
31
31
32−-- | Product additive semigroup.
32+-- | Product group. A Pair of groups gives rise to a group
33−-- A Pair of additive semigroups gives rise to a additive semigroup
34instance (Additive a, Additive b) => Additive (a, b)
33instance (Additive a, Additive b) => Additive (a, b)
35
34
36-- See https://gitlab.haskell.org/ghc/ghc/issues/11135#note_111802 for the reason Compose is not also provided.
35-- See https://gitlab.haskell.org/ghc/ghc/issues/11135#note_111802 for the reason Compose is not also provided.
@@ -38,17 +37,16 @@ instance (Additive a, Additive b) => Additive (a, b)
38-- really do for functor composition.
37-- really do for functor composition.
39instance Additive (f (g a)) => Additive ((f :.: g) a)
38instance Additive (f (g a)) => Additive ((f :.: g) a)
40
39
41−-- | Product of additive semigroups, Functor style.
40+-- | Product of groups, Functor style.
42instance (Additive (f a), Additive (g a)) => Additive ((f :*: g) a)
41instance (Additive (f a), Additive (g a)) => Additive ((f :*: g) a)
43
42
44−-- | Trivial additive semigroup, Functor style
43+-- | Trivial group, Functor style
45instance Additive (Proxy x)
44instance Additive (Proxy x)
46
45
47−-- | Const lifts additive semigroups into a functor.
46+-- | Const lifts groups into a functor.
48instance Additive a => Additive (Const a x)
47instance Additive a => Additive (Const a x)
49−
50−-- | Identity lifts additive semigroups pointwise (at only one point)
48+-- | Ideitnty lifts groups pointwise (at only one point)
51instance Additive a => Additive (Identity a)
49instance Additive a => Additive (Identity a)
52
50
53−-- | Functions lift additive semigroups pointwise.
51+-- | Functions lift groups pointwise.
54instance Additive b => Additive (a -> b)
52instance Additive b => Additive (a -> b)