on develop help sign in
6 files changed+88−39
since splitsnapshots
unifiedsplit
ChangeLog.md+9−24 dep/reflex-platform/default.nix+7−1 dep/reflex-platform/github.json+2−2 dep/reflex-platform/thunk.nix−9 patch.cabal+14−2 src/Data/Patch.hs+56−1
ChangeLog.md+9−24
@@ -2,25 +2,10 @@
22
33## Unreleased
44
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−
205* New dep of `data-orphans` for old GHC to get instances honestly instead of
216 via `monoidal-containers`.
227
23−## Unreleased
8+## 0.0.5.0 - 2021-12-17
249
2510* `Additive` now lives in `Data.Semigroup.Additive`, but is still reexported
2611 from `Data.Patch` for compatability.
@@ -31,25 +16,25 @@
3116 There are complete constructor and field patterns too, and everything is
3217 exported under the newtype as real constructors and fields would be.
3318
34−## 0.0.4.0
19+## 0.0.4.0 - 2021-04-20
3520
3621* Enable PolyKinds
3722
38−## 0.0.3.2
23+## 0.0.3.2 - 2020-11-06
3924
4025* Update version bounds
4126
42−## 0.0.3.1
27+## 0.0.3.1 - 2020-02-05
4328
4429* Replace `fromJust` with something easier to debug.
4530
46−## 0.0.3.0
31+## 0.0.3.0 - 2020-02-05
4732
4833* Create `PatchMapWithPatchingMove` variant which supports moves with a patch.
4934
5035* Create `DecidablyEmpty` subclass of `Monoid`.
5136
52−## 0.0.2.0
37+## 0.0.2.0 - 2020-01-17
5338
5439* Consistently provide:
5540
@@ -61,16 +46,16 @@
6146
6247 for `PatchMap`, `PatchIntMap`, and `PatchMapWithMove`.
6348
64−## 0.0.1.0
49+## 0.0.1.0 - 2020-01-09
6550
6651* Support older GHCs with `split-these` flag.
6752
6853* Additional instances for the `Group` class for basic types.
6954
70−## 0.0.0.1
55+## 0.0.0.1 - 2020-01-08
7156
7257* Remove unneeded dependencies
7358
74−## 0.0.0.0
59+## 0.0.0.0 - 2020-01-08
7560
7661* Extract patching functionality from Reflex.
dep/reflex-platform/default.nix+7−1
@@ -1,2 +1,8 @@
11# 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 @@
33 "repo": "reflex-platform",
44 "branch": "master",
55 "private": false,
6− "rev": "efc6d923c633207d18bd4d8cae3e20110a377864",
7− "sha256": "121rmnkx8nwiy96ipfyyv6vrgysv0zpr2br46y70zf4d0y1h1lz5"
6+ "rev": "c9d11db1b98855fe8ab24a3ff6a5dbe0ad902ad9",
7+ "sha256": "0sfzkqdvyah5mwvmli0wq1nl0b8cvk2cmfgfy4rz57wv42x3099y"
88}
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 @@
11Name: patch
2−Version: 0.1.0.0
2+Version: 0.0.5.0
33Synopsis: Data structures for describing changes to other data structures.
44Description:
55 Data structures for describing changes to other data structures.
@@ -25,6 +25,11 @@ tested-with:
2525 GHC ==8.0.2 || ==8.2.2 || ==8.4.4 || ==8.6.5 || ==8.8.1
2626 GHCJS ==8.4
2727
28+flag split-these
29+ description: Use split these/semialign packages
30+ manual: False
31+ default: True
32+
2833library
2934 hs-source-dirs: src
3035 default-language: Haskell2010
@@ -35,7 +40,6 @@ library
3540 , dependent-sum >= 0.6 && < 0.8
3641 , lens >= 4.7 && < 5
3742 , semigroupoids >= 4.0 && < 6
38− , these >= 0.4 && < 1.2
3943 , transformers >= 0.5.6.0 && < 0.6
4044 , witherable >= 0.3 && < 0.5
4145
@@ -57,6 +61,14 @@ library
5761 ghc-options: -Wall -fwarn-redundant-constraints -fwarn-tabs
5862 default-extensions: PolyKinds
5963
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+
6072test-suite tests
6173 default-language: Haskell2010
6274 type: exitcode-stdio-1.0
src/Data/Patch.hs+56−1
@@ -1,6 +1,8 @@
11{-# LANGUAGE CPP #-}
2−{-# LANGUAGE TypeOperators #-}
2+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
3+{-# LANGUAGE StandaloneDeriving #-}
34{-# LANGUAGE TypeFamilies #-}
5+{-# LANGUAGE TypeOperators #-}
46-- |
57-- Module:
68-- Data.Patch
@@ -11,9 +13,15 @@ module Data.Patch
1113 , module X
1214 ) where
1315
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
1421#if !MIN_VERSION_base(4,11,0)
1522import Data.Semigroup (Semigroup (..))
1623#endif
24+import GHC.Generics
1725
1826import Data.Semigroup.Additive as X
1927import Data.Patch.Class as X
@@ -32,9 +40,56 @@ import Data.Patch.MapWithMove as X
3240 , unsafePatchMapWithMove
3341 )
3442
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+
3549-- | The elements of an 'Additive' 'Semigroup' can be considered as patches of their own type.
3650newtype AdditivePatch p = AdditivePatch { unAdditivePatch :: p }
3751
3852instance Additive p => Patch (AdditivePatch p) where
3953 type PatchTarget (AdditivePatch p) = p
4054 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 (~~)