on develop help sign in
ChangeLog.md+9−24
since splitsnapshots
unifiedsplit
@@ -2,25 +2,10 @@
2
2
3## Unreleased
3## Unreleased
4
4
5−* Remove the `split-these` flag.
6− We do not need it as we only use the `These` datatype which is provided in all versions.
7−
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.
17−
18−## Unreleased
19−
20* New dep of `data-orphans` for old GHC to get instances honestly instead of
5* New dep of `data-orphans` for old GHC to get instances honestly instead of
21 via `monoidal-containers`.
6 via `monoidal-containers`.
22
7
23−## Unreleased
8+## 0.0.5.0 - 2021-12-17
24
9
25* `Additive` now lives in `Data.Semigroup.Additive`, but is still reexported
10* `Additive` now lives in `Data.Semigroup.Additive`, but is still reexported
26 from `Data.Patch` for compatability.
11 from `Data.Patch` for compatability.
@@ -31,25 +16,25 @@
31 There are complete constructor and field patterns too, and everything is
16 There are complete constructor and field patterns too, and everything is
32 exported under the newtype as real constructors and fields would be.
17 exported under the newtype as real constructors and fields would be.
33
18
34−## 0.0.4.0
19+## 0.0.4.0 - 2021-04-20
35
20
36* Enable PolyKinds
21* Enable PolyKinds
37
22
38−## 0.0.3.2
23+## 0.0.3.2 - 2020-11-06
39
24
40* Update version bounds
25* Update version bounds
41
26
42−## 0.0.3.1
27+## 0.0.3.1 - 2020-02-05
43
28
44* Replace `fromJust` with something easier to debug.
29* Replace `fromJust` with something easier to debug.
45
30
46−## 0.0.3.0
31+## 0.0.3.0 - 2020-02-05
47
32
48* Create `PatchMapWithPatchingMove` variant which supports moves with a patch.
33* Create `PatchMapWithPatchingMove` variant which supports moves with a patch.
49
34
50* Create `DecidablyEmpty` subclass of `Monoid`.
35* Create `DecidablyEmpty` subclass of `Monoid`.
51
36
52−## 0.0.2.0
37+## 0.0.2.0 - 2020-01-17
53
38
54* Consistently provide:
39* Consistently provide:
55
40
@@ -61,16 +46,16 @@
61
46
62 for `PatchMap`, `PatchIntMap`, and `PatchMapWithMove`.
47 for `PatchMap`, `PatchIntMap`, and `PatchMapWithMove`.
63
48
64−## 0.0.1.0
49+## 0.0.1.0 - 2020-01-09
65
50
66* Support older GHCs with `split-these` flag.
51* Support older GHCs with `split-these` flag.
67
52
68* Additional instances for the `Group` class for basic types.
53* Additional instances for the `Group` class for basic types.
69
54
70−## 0.0.0.1
55+## 0.0.0.1 - 2020-01-08
71
56
72* Remove unneeded dependencies
57* Remove unneeded dependencies
73
58
74−## 0.0.0.0
59+## 0.0.0.0 - 2020-01-08
75
60
76* Extract patching functionality from Reflex.
61* Extract patching functionality from Reflex.
dep/reflex-platform/default.nix+7−1
@@ -1,2 +1,8 @@
1# DO NOT HAND-EDIT THIS FILE
1# DO NOT HAND-EDIT THIS FILE
2−import (import ./thunk.nix)
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+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": "efc6d923c633207d18bd4d8cae3e20110a377864",
6+ "rev": "c9d11db1b98855fe8ab24a3ff6a5dbe0ad902ad9",
7− "sha256": "121rmnkx8nwiy96ipfyyv6vrgysv0zpr2br46y70zf4d0y1h1lz5"
7+ "sha256": "0sfzkqdvyah5mwvmli0wq1nl0b8cvk2cmfgfy4rz57wv42x3099y"
8}
8}
dep/reflex-platform/thunk.nixdeleted−9
@@ -1,9 +0,0 @@
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+14−2
@@ -1,5 +1,5 @@
1Name: patch
1Name: patch
2−Version: 0.1.0.0
2+Version: 0.0.5.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,6 +25,11 @@ 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+
28library
33library
29 hs-source-dirs: src
34 hs-source-dirs: src
30 default-language: Haskell2010
35 default-language: Haskell2010
@@ -35,7 +40,6 @@ library
35 , dependent-sum >= 0.6 && < 0.8
40 , dependent-sum >= 0.6 && < 0.8
36 , lens >= 4.7 && < 5
41 , lens >= 4.7 && < 5
37 , semigroupoids >= 4.0 && < 6
42 , semigroupoids >= 4.0 && < 6
38− , these >= 0.4 && < 1.2
39 , transformers >= 0.5.6.0 && < 0.6
43 , transformers >= 0.5.6.0 && < 0.6
40 , witherable >= 0.3 && < 0.5
44 , witherable >= 0.3 && < 0.5
41
45
@@ -57,6 +61,14 @@ library
57 ghc-options: -Wall -fwarn-redundant-constraints -fwarn-tabs
61 ghc-options: -Wall -fwarn-redundant-constraints -fwarn-tabs
58 default-extensions: PolyKinds
62 default-extensions: PolyKinds
59
63
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+
60test-suite tests
72test-suite tests
61 default-language: Haskell2010
73 default-language: Haskell2010
62 type: exitcode-stdio-1.0
74 type: exitcode-stdio-1.0
src/Data/Patch.hs+56−1
@@ -1,6 +1,8 @@
1{-# LANGUAGE CPP #-}
1{-# LANGUAGE CPP #-}
2−{-# LANGUAGE TypeOperators #-}
2+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
3+{-# LANGUAGE StandaloneDeriving #-}
3{-# LANGUAGE TypeFamilies #-}
4{-# LANGUAGE TypeFamilies #-}
5+{-# LANGUAGE TypeOperators #-}
4-- |
6-- |
5-- Module:
7-- Module:
6-- Data.Patch
8-- Data.Patch
@@ -11,9 +13,15 @@ module Data.Patch
11 , module X
13 , module X
12 ) where
14 ) where
13
15
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
14#if !MIN_VERSION_base(4,11,0)
21#if !MIN_VERSION_base(4,11,0)
15import Data.Semigroup (Semigroup (..))
22import Data.Semigroup (Semigroup (..))
16#endif
23#endif
24+import GHC.Generics
17
25
18import Data.Semigroup.Additive as X
26import Data.Semigroup.Additive as X
19import Data.Patch.Class as X
27import Data.Patch.Class as X
@@ -32,9 +40,56 @@ import Data.Patch.MapWithMove as X
32 , unsafePatchMapWithMove
40 , unsafePatchMapWithMove
33 )
41 )
34
42
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+
35-- | The elements of an 'Additive' 'Semigroup' can be considered as patches of their own type.
49-- | The elements of an 'Additive' 'Semigroup' can be considered as patches of their own type.
36newtype AdditivePatch p = AdditivePatch { unAdditivePatch :: p }
50newtype AdditivePatch p = AdditivePatch { unAdditivePatch :: p }
37
51
38instance Additive p => Patch (AdditivePatch p) where
52instance Additive p => Patch (AdditivePatch p) where
39 type PatchTarget (AdditivePatch p) = p
53 type PatchTarget (AdditivePatch p) = p
40 apply (AdditivePatch p) q = Just $ p <> q
54 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 (~~)