@@ -19,9 +19,7 @@
19module Data.Patch.MapWithMove
19module Data.Patch.MapWithMove
20 ( PatchMapWithMove
20 ( PatchMapWithMove
21 ( PatchMapWithMove
21 ( PatchMapWithMove
22− , -- | Extract the representation of the 'PatchMapWithMove' as a map of
24− unPatchMapWithMove
22+ , unPatchMapWithMove
27 , patchMapWithMove
25 , patchMapWithMove
@@ -68,7 +66,7 @@ import Data.Patch.Class
68import Data.Patch.MapWithPatchingMove (PatchMapWithPatchingMove(..), To)
66import Data.Patch.MapWithPatchingMove (PatchMapWithPatchingMove(..), To)
69import qualified Data.Patch.MapWithPatchingMove as PM -- already a transparent synonym
67import qualified Data.Patch.MapWithPatchingMove as PM -- already a transparent synonym
71−import Control.Lens hiding (from, to)
69+import Control.Lens
72import Data.List
70import Data.List
73import Data.Map (Map)
71import Data.Map (Map)
74import qualified Data.Map as Map
72import qualified Data.Map as Map
@@ -86,9 +84,13 @@ newtype PatchMapWithMove k (v :: Type) = PatchMapWithMove'
86 unPatchMapWithMove' :: PatchMapWithPatchingMove k (Proxy v)
84 unPatchMapWithMove' :: PatchMapWithPatchingMove k (Proxy v)
88 deriving ( Show, Read, Eq, Ord
86 deriving ( Show, Read, Eq, Ord
87+-- Haddock cannot handle documentation here before GHC 8.6
89+#if __GLASGOW_HASKELL__ >= 806
89− , -- | Compose patches having the same effect as applying the
90+ -- | Compose patches having the same effect as applying the
90 -- patches in turn: @'applyAlways' (p <> q) == 'applyAlways' p .
91 -- patches in turn: @'applyAlways' (p <> q) == 'applyAlways' p .
91 -- 'applyAlways' q@
92 -- 'applyAlways' q@
@@ -99,6 +101,8 @@ pattern Coerce x <- (coerce -> x)
100{-# COMPLETE PatchMapWithMove #-}
102{-# COMPLETE PatchMapWithMove #-}
101pattern PatchMapWithMove :: Map k (NodeInfo k v) -> PatchMapWithMove k v
103pattern PatchMapWithMove :: Map k (NodeInfo k v) -> PatchMapWithMove k v
104+-- | Extract the representation of the 'PatchMapWithMove' as a map of
102unPatchMapWithMove :: PatchMapWithMove k v -> Map k (NodeInfo k v)
106unPatchMapWithMove :: PatchMapWithMove k v -> Map k (NodeInfo k v)
103pattern PatchMapWithMove { unPatchMapWithMove } = PatchMapWithMove' (PatchMapWithPatchingMove (Coerce unPatchMapWithMove))
107pattern PatchMapWithMove { unPatchMapWithMove } = PatchMapWithMove' (PatchMapWithPatchingMove (Coerce unPatchMapWithMove))
@@ -133,7 +137,7 @@ instance TraversableWithIndex k (PatchMapWithMove k) where
134-- | Create a 'PatchMapWithMove', validating it
138-- | Create a 'PatchMapWithMove', validating it
135patchMapWithMove :: Ord k => Map k (NodeInfo k v) -> Maybe (PatchMapWithMove k v)
139patchMapWithMove :: Ord k => Map k (NodeInfo k v) -> Maybe (PatchMapWithMove k v)
136−patchMapWithMove = fmap coerce . PM.patchMapWithPatchingMove . coerce
140+patchMapWithMove = fmap PatchMapWithMove' . PM.patchMapWithPatchingMove . coerce
138-- | Create a 'PatchMapWithMove' that inserts everything in the given 'Map'
142-- | Create a 'PatchMapWithMove' that inserts everything in the given 'Map'
139patchMapWithMoveInsertAll :: Map k v -> PatchMapWithMove k v
143patchMapWithMoveInsertAll :: Map k v -> PatchMapWithMove k v
@@ -156,8 +160,8 @@ moveMapKey src dst = PatchMapWithMove' $ PM.moveMapKey src dst
157-- let aMay = Map.lookup a map
161-- let aMay = Map.lookup a map
158-- bMay = Map.lookup b map
162-- bMay = Map.lookup b map
159−-- in maybe id (Map.insert a) (bMay `mplus` aMay)
163+-- in maybe id (Map.insert a) (bMay <> aMay)
160−-- . maybe id (Map.insert b) (aMay `mplus` bMay)
164+-- . maybe id (Map.insert b) (aMay <> bMay)
161-- . Map.delete a . Map.delete b $ map
165-- . Map.delete a . Map.delete b $ map
163swapMapKey :: Ord k => k -> k -> PatchMapWithMove k v
167swapMapKey :: Ord k => k -> k -> PatchMapWithMove k v
@@ -171,7 +175,7 @@ deleteMapKey = PatchMapWithMove' . PM.deleteMapKey
172-- __Warning:__ when using this function, you must ensure that the invariants of 'PatchMapWithMove' are preserved; they will not be checked.
176-- __Warning:__ when using this function, you must ensure that the invariants of 'PatchMapWithMove' are preserved; they will not be checked.
173unsafePatchMapWithMove :: Map k (NodeInfo k v) -> PatchMapWithMove k v
177unsafePatchMapWithMove :: Map k (NodeInfo k v) -> PatchMapWithMove k v
174−unsafePatchMapWithMove = PatchMapWithMove' . PM.unsafePatchMapWithPatchingMove . coerce
178+unsafePatchMapWithMove = coerce PM.unsafePatchMapWithPatchingMove
176-- | Apply the insertions, deletions, and moves to a given 'Map'
180-- | Apply the insertions, deletions, and moves to a given 'Map'
177instance Ord k => Patch (PatchMapWithMove k v) where
181instance Ord k => Patch (PatchMapWithMove k v) where
@@ -195,7 +199,7 @@ patchThatSortsMapWith cmp = PatchMapWithMove' . PM.patchThatSortsMapWith cmp
195-- | Create a 'PatchMapWithMove' that, if applied to the first 'Map' provided,
199-- | Create a 'PatchMapWithMove' that, if applied to the first 'Map' provided,
196-- will produce a 'Map' with the same values as the second 'Map' but with the
200-- will produce a 'Map' with the same values as the second 'Map' but with the
197-- values sorted with the given ordering function.
201-- values sorted with the given ordering function.
198−patchThatChangesAndSortsMapWith :: forall k v. (Ord k, Ord v) => (v -> v -> Ordering) -> Map k v -> Map k v -> PatchMapWithMove k v
202+patchThatChangesAndSortsMapWith :: (Ord k, Ord v) => (v -> v -> Ordering) -> Map k v -> Map k v -> PatchMapWithMove k v
199patchThatChangesAndSortsMapWith cmp oldByIndex newByIndexUnsorted = patchThatChangesMap oldByIndex newByIndex
203patchThatChangesAndSortsMapWith cmp oldByIndex newByIndexUnsorted = patchThatChangesMap oldByIndex newByIndex
200 where newList = Map.toList newByIndexUnsorted
204 where newList = Map.toList newByIndexUnsorted
201 newByIndex = Map.fromList $ zip (fst <$> newList) $ sortBy cmp $ snd <$> newList
205 newByIndex = Map.fromList $ zip (fst <$> newList) $ sortBy cmp $ snd <$> newList
@@ -244,24 +248,20 @@ instance Foldable (NodeInfo k) where
244 foldMap = foldMapDefault
248 foldMap = foldMapDefault
246instance Traversable (NodeInfo k) where
250instance Traversable (NodeInfo k) where
247− traverse = _NodeInfo . traverseNodeInfo
250− :: Traversal (PM.NodeInfo k (Proxy a)) (PM.NodeInfo k (Proxy b)) a b
251− traverseNodeInfo = PM.bitraverseNodeInfo pure (\ ~Proxy -> pure Proxy)
251+ traverse = bitraverseNodeInfo pure
253bitraverseNodeInfo
253bitraverseNodeInfo
254 :: Applicative f
254 :: Applicative f
255 => (k0 -> f k1)
255 => (k0 -> f k1)
256 -> (v0 -> f v1)
256 -> (v0 -> f v1)
257 -> NodeInfo k0 v0 -> f (NodeInfo k1 v1)
257 -> NodeInfo k0 v0 -> f (NodeInfo k1 v1)
258−bitraverseNodeInfo fk fv = fmap coerce
258+bitraverseNodeInfo fk fv = fmap NodeInfo'
259 . PM.bitraverseNodeInfo fk (\ ~Proxy -> pure Proxy) fv
259 . PM.bitraverseNodeInfo fk (\ ~Proxy -> pure Proxy) fv
262-- | Change the 'From' value of a 'NodeInfo'
262-- | Change the 'From' value of a 'NodeInfo'
263nodeInfoMapFrom :: (From k v -> From k v) -> NodeInfo k v -> NodeInfo k v
263nodeInfoMapFrom :: (From k v -> From k v) -> NodeInfo k v -> NodeInfo k v
264−nodeInfoMapFrom f = coerce . PM.nodeInfoMapFrom (unFrom' . f . From') . coerce
264+nodeInfoMapFrom f = coerce $ PM.nodeInfoMapFrom (unFrom' . f . From')
266-- | Change the 'From' value of a 'NodeInfo', using a 'Functor' (or
266-- | Change the 'From' value of a 'NodeInfo', using a 'Functor' (or
267-- 'Applicative', 'Monad', etc.) action to get the new value
267-- 'Applicative', 'Monad', etc.) action to get the new value
@@ -269,7 +269,7 @@ nodeInfoMapMFrom
269 :: Functor f
269 :: Functor f
270 => (From k v -> f (From k v))
270 => (From k v -> f (From k v))
271 -> NodeInfo k v -> f (NodeInfo k v)
271 -> NodeInfo k v -> f (NodeInfo k v)
272−nodeInfoMapMFrom f = fmap coerce
272+nodeInfoMapMFrom f = fmap NodeInfo'
273 . PM.nodeInfoMapMFrom (fmap unFrom' . f . From')
273 . PM.nodeInfoMapMFrom (fmap unFrom' . f . From')
@@ -303,9 +303,10 @@ bitraverseFrom
303 => (k0 -> f k1)
303 => (k0 -> f k1)
304 -> (v0 -> f v1)
304 -> (v0 -> f v1)
305 -> From k0 v0 -> f (From k1 v1)
305 -> From k0 v0 -> f (From k1 v1)
306−bitraverseFrom fk fv = fmap coerce
306+bitraverseFrom fk fv = fmap From'
307 . PM.bitraverseFrom fk (\ ~Proxy -> pure Proxy) fv
307 . PM.bitraverseFrom fk (\ ~Proxy -> pure Proxy) fv
310makeWrapped ''PatchMapWithMove
310makeWrapped ''PatchMapWithMove
311makeWrapped ''NodeInfo
311makeWrapped ''NodeInfo