@@ -19,9 +19,7 @@
1919module Data.Patch.MapWithMove
2020 ( PatchMapWithMove
2121 ( PatchMapWithMove
22− , -- | Extract the representation of the 'PatchMapWithMove' as a map of
23− -- 'NodeInfo'.
24− unPatchMapWithMove
22+ , unPatchMapWithMove
2523 , ..
2624 )
2725 , patchMapWithMove
@@ -65,13 +63,10 @@ module Data.Patch.MapWithMove
6563import Data.Coerce
6664import Data.Kind (Type)
6765import Data.Patch.Class
68−import Data.Patch.MapWithPatchingMove
69− ( PatchMapWithPatchingMove (..)
70− )
71−import qualified Data.Patch.MapWithPatchingMove as PM
72−import Data.Patch.MapWithPatchingMove (To) -- already a transparent synonym
66+import Data.Patch.MapWithPatchingMove (PatchMapWithPatchingMove(..), To)
67+import qualified Data.Patch.MapWithPatchingMove as PM -- already a transparent synonym
7368
74−import Control.Lens hiding (from, to)
69+import Control.Lens
7570import Data.List
7671import Data.Map (Map)
7772import qualified Data.Map as Map
@@ -89,9 +84,13 @@ newtype PatchMapWithMove k (v :: Type) = PatchMapWithMove'
8984 unPatchMapWithMove' :: PatchMapWithPatchingMove k (Proxy v)
9085 }
9186 deriving ( Show, Read, Eq, Ord
92− , -- | Compose patches having the same effect as applying the
87+-- Haddock cannot handle documentation here before GHC 8.6
88+ ,
89+#if __GLASGOW_HASKELL__ >= 806
90+ -- | Compose patches having the same effect as applying the
9391 -- patches in turn: @'applyAlways' (p <> q) == 'applyAlways' p .
9492 -- 'applyAlways' q@
93+#endif
9594 Semigroup
9695 , Monoid
9796 )
@@ -102,6 +101,8 @@ pattern Coerce x <- (coerce -> x)
102101
103102{-# COMPLETE PatchMapWithMove #-}
104103pattern PatchMapWithMove :: Map k (NodeInfo k v) -> PatchMapWithMove k v
104+-- | Extract the representation of the 'PatchMapWithMove' as a map of
105+-- 'NodeInfo'.
105106unPatchMapWithMove :: PatchMapWithMove k v -> Map k (NodeInfo k v)
106107pattern PatchMapWithMove { unPatchMapWithMove } = PatchMapWithMove' (PatchMapWithPatchingMove (Coerce unPatchMapWithMove))
107108
@@ -136,7 +137,7 @@ instance TraversableWithIndex k (PatchMapWithMove k) where
136137
137138-- | Create a 'PatchMapWithMove', validating it
138139patchMapWithMove :: Ord k => Map k (NodeInfo k v) -> Maybe (PatchMapWithMove k v)
139−patchMapWithMove = fmap coerce . PM.patchMapWithPatchingMove . coerce
140+patchMapWithMove = fmap PatchMapWithMove' . PM.patchMapWithPatchingMove . coerce
140141
141142-- | Create a 'PatchMapWithMove' that inserts everything in the given 'Map'
142143patchMapWithMoveInsertAll :: Map k v -> PatchMapWithMove k v
@@ -159,8 +160,8 @@ moveMapKey src dst = PatchMapWithMove' $ PM.moveMapKey src dst
159160-- @
160161-- let aMay = Map.lookup a map
161162-- bMay = Map.lookup b map
162−-- in maybe id (Map.insert a) (bMay `mplus` aMay)
163−-- . maybe id (Map.insert b) (aMay `mplus` bMay)
163+-- in maybe id (Map.insert a) (bMay <> aMay)
164+-- . maybe id (Map.insert b) (aMay <> bMay)
164165-- . Map.delete a . Map.delete b $ map
165166-- @
166167swapMapKey :: Ord k => k -> k -> PatchMapWithMove k v
@@ -174,7 +175,7 @@ deleteMapKey = PatchMapWithMove' . PM.deleteMapKey
174175--
175176-- __Warning:__ when using this function, you must ensure that the invariants of 'PatchMapWithMove' are preserved; they will not be checked.
176177unsafePatchMapWithMove :: Map k (NodeInfo k v) -> PatchMapWithMove k v
177−unsafePatchMapWithMove = PatchMapWithMove' . PM.unsafePatchMapWithPatchingMove . coerce
178+unsafePatchMapWithMove = coerce PM.unsafePatchMapWithPatchingMove
178179
179180-- | Apply the insertions, deletions, and moves to a given 'Map'
180181instance Ord k => Patch (PatchMapWithMove k v) where
@@ -198,7 +199,7 @@ patchThatSortsMapWith cmp = PatchMapWithMove' . PM.patchThatSortsMapWith cmp
198199-- | Create a 'PatchMapWithMove' that, if applied to the first 'Map' provided,
199200-- will produce a 'Map' with the same values as the second 'Map' but with the
200201-- values sorted with the given ordering function.
201−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
202203patchThatChangesAndSortsMapWith cmp oldByIndex newByIndexUnsorted = patchThatChangesMap oldByIndex newByIndex
203204 where newList = Map.toList newByIndexUnsorted
204205 newByIndex = Map.fromList $ zip (fst <$> newList) $ sortBy cmp $ snd <$> newList
@@ -226,11 +227,11 @@ deriving instance (Ord k, Ord p) => Ord (NodeInfo k p)
226227pattern NodeInfo :: To k -> From k v -> NodeInfo k v
227228_nodeInfo_to :: NodeInfo k v -> To k
228229_nodeInfo_from :: NodeInfo k v -> From k v
229−pattern NodeInfo { _nodeInfo_to, _nodeInfo_from } =
230− NodeInfo' (PM.NodeInfo
230+pattern NodeInfo { _nodeInfo_to, _nodeInfo_from } = NodeInfo'
231+ PM.NodeInfo
231232 { PM._nodeInfo_to = _nodeInfo_to
232233 , PM._nodeInfo_from = Coerce _nodeInfo_from
233− })
234+ }
234235
235236_NodeInfo
236237 :: Iso
@@ -247,24 +248,20 @@ instance Foldable (NodeInfo k) where
247248 foldMap = foldMapDefault
248249
249250instance Traversable (NodeInfo k) where
250− traverse = _NodeInfo . traverseNodeInfo
251− where
252− traverseNodeInfo
253− :: Traversal (PM.NodeInfo k (Proxy a)) (PM.NodeInfo k (Proxy b)) a b
254− traverseNodeInfo = PM.bitraverseNodeInfo pure (\ ~Proxy -> pure Proxy)
251+ traverse = bitraverseNodeInfo pure
255252
256253bitraverseNodeInfo
257254 :: Applicative f
258255 => (k0 -> f k1)
259256 -> (v0 -> f v1)
260257 -> NodeInfo k0 v0 -> f (NodeInfo k1 v1)
261−bitraverseNodeInfo fk fv = fmap coerce
258+bitraverseNodeInfo fk fv = fmap NodeInfo'
262259 . PM.bitraverseNodeInfo fk (\ ~Proxy -> pure Proxy) fv
263260 . coerce
264261
265262-- | Change the 'From' value of a 'NodeInfo'
266263nodeInfoMapFrom :: (From k v -> From k v) -> NodeInfo k v -> NodeInfo k v
267−nodeInfoMapFrom f = coerce . PM.nodeInfoMapFrom (unFrom' . f . From') . coerce
264+nodeInfoMapFrom f = coerce $ PM.nodeInfoMapFrom (unFrom' . f . From')
268265
269266-- | Change the 'From' value of a 'NodeInfo', using a 'Functor' (or
270267-- 'Applicative', 'Monad', etc.) action to get the new value
@@ -272,7 +269,7 @@ nodeInfoMapMFrom
272269 :: Functor f
273270 => (From k v -> f (From k v))
274271 -> NodeInfo k v -> f (NodeInfo k v)
275−nodeInfoMapMFrom f = fmap coerce
272+nodeInfoMapMFrom f = fmap NodeInfo'
276273 . PM.nodeInfoMapMFrom (fmap unFrom' . f . From')
277274 . coerce
278275
@@ -295,7 +292,7 @@ pattern From_Insert v = From' (PM.From_Insert v)
295292
296293-- | Delete the existing value, if any, from here
297294pattern From_Delete :: From k v
298−pattern From_Delete = From' (PM.From_Delete)
295+pattern From_Delete = From' PM.From_Delete
299296
300297-- | Move the value here from the given key
301298pattern From_Move :: k -> From k v
@@ -306,9 +303,10 @@ bitraverseFrom
306303 => (k0 -> f k1)
307304 -> (v0 -> f v1)
308305 -> From k0 v0 -> f (From k1 v1)
309−bitraverseFrom fk fv = fmap coerce
306+bitraverseFrom fk fv = fmap From'
310307 . PM.bitraverseFrom fk (\ ~Proxy -> pure Proxy) fv
311308 . coerce
312309
313310makeWrapped ''PatchMapWithMove
314311makeWrapped ''NodeInfo
312+makeWrapped ''From