module U.Codebase.Sqlite.Patch.Full where

import Control.Lens
import Data.Bitraversable (Bitraversable, bitraverse)
import Data.Map (Map)
import Data.Set (Set)
import Data.Set qualified as Set
import Data.Text (Text)
import U.Codebase.HashTags
import U.Codebase.Reference (Reference')
import U.Codebase.Reference qualified as Reference
import U.Codebase.Referent (Referent')
import U.Codebase.Referent qualified as Referent
import U.Codebase.Sqlite.DbId qualified as Db
import U.Codebase.Sqlite.LocalIds (LocalDefnId, LocalHashId, LocalTextId)
import U.Codebase.Sqlite.Patch.TermEdit (TermEdit')
import U.Codebase.Sqlite.Patch.TermEdit qualified as TermEdit
import U.Codebase.Sqlite.Patch.TypeEdit (TypeEdit')
import U.Codebase.Sqlite.Patch.TypeEdit qualified as TypeEdit
import Unison.Util.Map qualified as Map
import Unison.Util.Set qualified as Set

-- |
-- @
-- LocalPatch
--   { termEdits :: Map ReferentH (Set TermEdit),
--     typeEdits :: Map ReferenceH (Set TypeEdit)
--   }
-- @
type Patch = Patch' Db.TextId Db.HashId Db.ObjectId

-- | A version of Patch' which can be used for hashing.
type HashPatch = Patch' Text ComponentHash ComponentHash

-- |
-- @
-- LocalPatch
--   { termEdits :: Map LocalReferentH (Set LocalTermEdit),
--     typeEdits :: Map LocalReferenceH (Set LocalTypeEdit)
--   }
-- @
type LocalPatch = Patch' LocalTextId LocalHashId LocalDefnId

type Referent'' t h = Referent' (Reference' t h) (Reference' t h)

data Patch' t h o = Patch
  { forall t h o.
Patch' t h o -> Map (Referent'' t h) (Set (TermEdit' t o))
termEdits :: Map (Referent'' t h) (Set (TermEdit' t o)),
    forall t h o.
Patch' t h o -> Map (Reference' t h) (Set (TypeEdit' t o))
typeEdits :: Map (Reference' t h) (Set (TypeEdit' t o))
  }

patchT_ :: (Ord t', Ord h, Ord o) => Traversal (Patch' t h o) (Patch' t' h o) t t'
patchT_ :: forall t' h o t.
(Ord t', Ord h, Ord o) =>
Traversal (Patch' t h o) (Patch' t' h o) t t'
patchT_ t -> f t'
f Patch {Map (Referent'' t h) (Set (TermEdit' t o))
$sel:termEdits:Patch :: forall t h o.
Patch' t h o -> Map (Referent'' t h) (Set (TermEdit' t o))
termEdits :: Map (Referent'' t h) (Set (TermEdit' t o))
termEdits, Map (Reference' t h) (Set (TypeEdit' t o))
$sel:typeEdits:Patch :: forall t h o.
Patch' t h o -> Map (Reference' t h) (Set (TypeEdit' t o))
typeEdits :: Map (Reference' t h) (Set (TypeEdit' t o))
typeEdits} = do
  Map (Referent'' t' h) (Set (TermEdit' t' o))
newTermEdits <-
    LensLike
  f
  (Map (Referent'' t h) (Set (TermEdit' t o)))
  (Map (Referent'' t' h) (Set (TermEdit' t' o)))
  t
  t'
-> LensLike
     f
     (Map (Referent'' t h) (Set (TermEdit' t o)))
     (Map (Referent'' t' h) (Set (TermEdit' t' o)))
     t
     t'
forall (f :: * -> *) s t a b.
LensLike f s t a b -> LensLike f s t a b
traverseOf (Traversal (Referent'' t h) (Referent'' t' h) t t'
-> Traversal (Set (TermEdit' t o)) (Set (TermEdit' t' o)) t t'
-> Traversal
     (Map (Referent'' t h) (Set (TermEdit' t o)))
     (Map (Referent'' t' h) (Set (TermEdit' t' o)))
     t
     t'
forall a' k' k a v v'.
(Ord a', Ord k') =>
Traversal k k' a a'
-> Traversal v v' a a' -> Traversal (Map k v) (Map k' v') a a'
Map.bitraversed ((Reference' t h -> f (Reference' t' h))
-> Referent'' t h -> f (Referent'' t' h)
forall ref ref' (f :: * -> *).
Applicative f =>
(ref -> f ref') -> Referent' ref ref -> f (Referent' ref' ref')
Referent.refs_ ((Reference' t h -> f (Reference' t' h))
 -> Referent'' t h -> f (Referent'' t' h))
-> ((t -> f t') -> Reference' t h -> f (Reference' t' h))
-> (t -> f t')
-> Referent'' t h
-> f (Referent'' t' h)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (t -> f t') -> Reference' t h -> f (Reference' t' h)
forall t h t' (p :: * -> * -> *) (f :: * -> *).
(Choice p, Applicative f) =>
p t (f t') -> p (Reference' t h) (f (Reference' t' h))
Reference.t_) ((TermEdit' t o -> f (TermEdit' t' o))
-> Set (TermEdit' t o) -> f (Set (TermEdit' t' o))
forall (f :: * -> *) b a.
(Applicative f, Ord b) =>
(a -> f b) -> Set a -> f (Set b)
Set.traverse ((TermEdit' t o -> f (TermEdit' t' o))
 -> Set (TermEdit' t o) -> f (Set (TermEdit' t' o)))
-> ((t -> f t') -> TermEdit' t o -> f (TermEdit' t' o))
-> (t -> f t')
-> Set (TermEdit' t o)
-> f (Set (TermEdit' t' o))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (t -> f t') -> TermEdit' t o -> f (TermEdit' t' o)
Traversal (TermEdit' t o) (TermEdit' t' o) t t'
forall (b :: * -> * -> *) a c a'.
Bitraversable b =>
Traversal (b a c) (b a' c) a a'
traverseFirst)) t -> f t'
f Map (Referent'' t h) (Set (TermEdit' t o))
termEdits
  Map (Reference' t' h) (Set (TypeEdit' t' o))
newTypeEdits <- LensLike
  f
  (Map (Reference' t h) (Set (TypeEdit' t o)))
  (Map (Reference' t' h) (Set (TypeEdit' t' o)))
  t
  t'
-> LensLike
     f
     (Map (Reference' t h) (Set (TypeEdit' t o)))
     (Map (Reference' t' h) (Set (TypeEdit' t' o)))
     t
     t'
forall (f :: * -> *) s t a b.
LensLike f s t a b -> LensLike f s t a b
traverseOf (Traversal (Reference' t h) (Reference' t' h) t t'
-> Traversal (Set (TypeEdit' t o)) (Set (TypeEdit' t' o)) t t'
-> Traversal
     (Map (Reference' t h) (Set (TypeEdit' t o)))
     (Map (Reference' t' h) (Set (TypeEdit' t' o)))
     t
     t'
forall a' k' k a v v'.
(Ord a', Ord k') =>
Traversal k k' a a'
-> Traversal v v' a a' -> Traversal (Map k v) (Map k' v') a a'
Map.bitraversed ((t -> f t') -> Reference' t h -> f (Reference' t' h)
forall t h t' (p :: * -> * -> *) (f :: * -> *).
(Choice p, Applicative f) =>
p t (f t') -> p (Reference' t h) (f (Reference' t' h))
Reference.t_) ((TypeEdit' t o -> f (TypeEdit' t' o))
-> Set (TypeEdit' t o) -> f (Set (TypeEdit' t' o))
forall (f :: * -> *) b a.
(Applicative f, Ord b) =>
(a -> f b) -> Set a -> f (Set b)
Set.traverse ((TypeEdit' t o -> f (TypeEdit' t' o))
 -> Set (TypeEdit' t o) -> f (Set (TypeEdit' t' o)))
-> ((t -> f t') -> TypeEdit' t o -> f (TypeEdit' t' o))
-> (t -> f t')
-> Set (TypeEdit' t o)
-> f (Set (TypeEdit' t' o))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (t -> f t') -> TypeEdit' t o -> f (TypeEdit' t' o)
Traversal (TypeEdit' t o) (TypeEdit' t' o) t t'
forall (b :: * -> * -> *) a c a'.
Bitraversable b =>
Traversal (b a c) (b a' c) a a'
traverseFirst)) t -> f t'
f Map (Reference' t h) (Set (TypeEdit' t o))
typeEdits
  pure Patch {$sel:termEdits:Patch :: Map (Referent'' t' h) (Set (TermEdit' t' o))
termEdits = Map (Referent'' t' h) (Set (TermEdit' t' o))
newTermEdits, $sel:typeEdits:Patch :: Map (Reference' t' h) (Set (TypeEdit' t' o))
typeEdits = Map (Reference' t' h) (Set (TypeEdit' t' o))
newTypeEdits}
  where
    traverseFirst :: (Bitraversable b) => Traversal (b a c) (b a' c) a a'
    traverseFirst :: forall (b :: * -> * -> *) a c a'.
Bitraversable b =>
Traversal (b a c) (b a' c) a a'
traverseFirst a -> f a'
f = (a -> f a') -> (c -> f c) -> b a c -> f (b a' c)
forall (f :: * -> *) a c b d.
Applicative f =>
(a -> f c) -> (b -> f d) -> b a b -> f (b c d)
forall (t :: * -> * -> *) (f :: * -> *) a c b d.
(Bitraversable t, Applicative f) =>
(a -> f c) -> (b -> f d) -> t a b -> f (t c d)
bitraverse a -> f a'
f c -> f c
forall a. a -> f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure

patchH_ :: (Ord t, Ord h') => Traversal (Patch' t h o) (Patch' t h' o) h h'
patchH_ :: forall t h' h o.
(Ord t, Ord h') =>
Traversal (Patch' t h o) (Patch' t h' o) h h'
patchH_ h -> f h'
f Patch {Map (Referent'' t h) (Set (TermEdit' t o))
$sel:termEdits:Patch :: forall t h o.
Patch' t h o -> Map (Referent'' t h) (Set (TermEdit' t o))
termEdits :: Map (Referent'' t h) (Set (TermEdit' t o))
termEdits, Map (Reference' t h) (Set (TypeEdit' t o))
$sel:typeEdits:Patch :: forall t h o.
Patch' t h o -> Map (Reference' t h) (Set (TypeEdit' t o))
typeEdits :: Map (Reference' t h) (Set (TypeEdit' t o))
typeEdits} = do
  Map
  (Referent' (Reference' t h') (Reference' t h'))
  (Set (TermEdit' t o))
newTermEdits <- Map (Referent'' t h) (Set (TermEdit' t o))
termEdits Map (Referent'' t h) (Set (TermEdit' t o))
-> (Map (Referent'' t h) (Set (TermEdit' t o))
    -> f (Map
            (Referent' (Reference' t h') (Reference' t h'))
            (Set (TermEdit' t o))))
-> f (Map
        (Referent' (Reference' t h') (Reference' t h'))
        (Set (TermEdit' t o)))
forall a b. a -> (a -> b) -> b
& (Referent'' t h
 -> f (Referent' (Reference' t h') (Reference' t h')))
-> Map (Referent'' t h) (Set (TermEdit' t o))
-> f (Map
        (Referent' (Reference' t h') (Reference' t h'))
        (Set (TermEdit' t o)))
forall (f :: * -> *) k' k v.
(Applicative f, Ord k') =>
(k -> f k') -> Map k v -> f (Map k' v)
Map.traverseKeys ((Referent'' t h
  -> f (Referent' (Reference' t h') (Reference' t h')))
 -> Map (Referent'' t h) (Set (TermEdit' t o))
 -> f (Map
         (Referent' (Reference' t h') (Reference' t h'))
         (Set (TermEdit' t o))))
-> ((h -> f h')
    -> Referent'' t h
    -> f (Referent' (Reference' t h') (Reference' t h')))
-> (h -> f h')
-> Map (Referent'' t h) (Set (TermEdit' t o))
-> f (Map
        (Referent' (Reference' t h') (Reference' t h'))
        (Set (TermEdit' t o)))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Reference' t h -> f (Reference' t h'))
-> Referent'' t h
-> f (Referent' (Reference' t h') (Reference' t h'))
forall ref ref' (f :: * -> *).
Applicative f =>
(ref -> f ref') -> Referent' ref ref -> f (Referent' ref' ref')
Referent.refs_ ((Reference' t h -> f (Reference' t h'))
 -> Referent'' t h
 -> f (Referent' (Reference' t h') (Reference' t h')))
-> ((h -> f h') -> Reference' t h -> f (Reference' t h'))
-> (h -> f h')
-> Referent'' t h
-> f (Referent' (Reference' t h') (Reference' t h'))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (h -> f h') -> Reference' t h -> f (Reference' t h')
forall t h h' (f :: * -> *).
Applicative f =>
(h -> f h') -> Reference' t h -> f (Reference' t h')
Reference.h_ ((h -> f h')
 -> Map (Referent'' t h) (Set (TermEdit' t o))
 -> f (Map
         (Referent' (Reference' t h') (Reference' t h'))
         (Set (TermEdit' t o))))
-> (h -> f h')
-> Map (Referent'' t h) (Set (TermEdit' t o))
-> f (Map
        (Referent' (Reference' t h') (Reference' t h'))
        (Set (TermEdit' t o)))
forall {k} (f :: k -> *) s (t :: k) a (b :: k).
LensLike f s t a b -> LensLike f s t a b
%%~ h -> f h'
f
  Map (Reference' t h') (Set (TypeEdit' t o))
newTypeEdits <- Map (Reference' t h) (Set (TypeEdit' t o))
typeEdits Map (Reference' t h) (Set (TypeEdit' t o))
-> (Map (Reference' t h) (Set (TypeEdit' t o))
    -> f (Map (Reference' t h') (Set (TypeEdit' t o))))
-> f (Map (Reference' t h') (Set (TypeEdit' t o)))
forall a b. a -> (a -> b) -> b
& (Reference' t h -> f (Reference' t h'))
-> Map (Reference' t h) (Set (TypeEdit' t o))
-> f (Map (Reference' t h') (Set (TypeEdit' t o)))
forall (f :: * -> *) k' k v.
(Applicative f, Ord k') =>
(k -> f k') -> Map k v -> f (Map k' v)
Map.traverseKeys ((Reference' t h -> f (Reference' t h'))
 -> Map (Reference' t h) (Set (TypeEdit' t o))
 -> f (Map (Reference' t h') (Set (TypeEdit' t o))))
-> ((h -> f h') -> Reference' t h -> f (Reference' t h'))
-> (h -> f h')
-> Map (Reference' t h) (Set (TypeEdit' t o))
-> f (Map (Reference' t h') (Set (TypeEdit' t o)))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (h -> f h') -> Reference' t h -> f (Reference' t h')
forall t h h' (f :: * -> *).
Applicative f =>
(h -> f h') -> Reference' t h -> f (Reference' t h')
Reference.h_ ((h -> f h')
 -> Map (Reference' t h) (Set (TypeEdit' t o))
 -> f (Map (Reference' t h') (Set (TypeEdit' t o))))
-> (h -> f h')
-> Map (Reference' t h) (Set (TypeEdit' t o))
-> f (Map (Reference' t h') (Set (TypeEdit' t o)))
forall {k} (f :: k -> *) s (t :: k) a (b :: k).
LensLike f s t a b -> LensLike f s t a b
%%~ h -> f h'
f
  pure Patch {$sel:termEdits:Patch :: Map
  (Referent' (Reference' t h') (Reference' t h'))
  (Set (TermEdit' t o))
termEdits = Map
  (Referent' (Reference' t h') (Reference' t h'))
  (Set (TermEdit' t o))
newTermEdits, $sel:typeEdits:Patch :: Map (Reference' t h') (Set (TypeEdit' t o))
typeEdits = Map (Reference' t h') (Set (TypeEdit' t o))
newTypeEdits}

patchO_ :: (Ord t, Ord o') => Traversal (Patch' t h o) (Patch' t h o') o o'
patchO_ :: forall t o' h o.
(Ord t, Ord o') =>
Traversal (Patch' t h o) (Patch' t h o') o o'
patchO_ o -> f o'
f Patch {Map (Referent'' t h) (Set (TermEdit' t o))
$sel:termEdits:Patch :: forall t h o.
Patch' t h o -> Map (Referent'' t h) (Set (TermEdit' t o))
termEdits :: Map (Referent'' t h) (Set (TermEdit' t o))
termEdits, Map (Reference' t h) (Set (TypeEdit' t o))
$sel:typeEdits:Patch :: forall t h o.
Patch' t h o -> Map (Reference' t h) (Set (TypeEdit' t o))
typeEdits :: Map (Reference' t h) (Set (TypeEdit' t o))
typeEdits} = do
  Map (Referent'' t h) (Set (TermEdit' t o'))
newTermEdits <- Map (Referent'' t h) (Set (TermEdit' t o))
termEdits Map (Referent'' t h) (Set (TermEdit' t o))
-> (Map (Referent'' t h) (Set (TermEdit' t o))
    -> f (Map (Referent'' t h) (Set (TermEdit' t o'))))
-> f (Map (Referent'' t h) (Set (TermEdit' t o')))
forall a b. a -> (a -> b) -> b
& (Set (TermEdit' t o) -> f (Set (TermEdit' t o')))
-> Map (Referent'' t h) (Set (TermEdit' t o))
-> f (Map (Referent'' t h) (Set (TermEdit' t o')))
forall (f :: * -> *) a b.
Traversable f =>
IndexedTraversal Int (f a) (f b) a b
IndexedTraversal
  Int
  (Map (Referent'' t h) (Set (TermEdit' t o)))
  (Map (Referent'' t h) (Set (TermEdit' t o')))
  (Set (TermEdit' t o))
  (Set (TermEdit' t o'))
traversed ((Set (TermEdit' t o) -> f (Set (TermEdit' t o')))
 -> Map (Referent'' t h) (Set (TermEdit' t o))
 -> f (Map (Referent'' t h) (Set (TermEdit' t o'))))
-> ((o -> f o') -> Set (TermEdit' t o) -> f (Set (TermEdit' t o')))
-> (o -> f o')
-> Map (Referent'' t h) (Set (TermEdit' t o))
-> f (Map (Referent'' t h) (Set (TermEdit' t o')))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (TermEdit' t o -> f (TermEdit' t o'))
-> Set (TermEdit' t o) -> f (Set (TermEdit' t o'))
forall (f :: * -> *) b a.
(Applicative f, Ord b) =>
(a -> f b) -> Set a -> f (Set b)
Set.traverse ((TermEdit' t o -> f (TermEdit' t o'))
 -> Set (TermEdit' t o) -> f (Set (TermEdit' t o')))
-> ((o -> f o') -> TermEdit' t o -> f (TermEdit' t o'))
-> (o -> f o')
-> Set (TermEdit' t o)
-> f (Set (TermEdit' t o'))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (o -> f o') -> TermEdit' t o -> f (TermEdit' t o')
forall t h h' (f :: * -> *).
Applicative f =>
(h -> f h') -> TermEdit' t h -> f (TermEdit' t h')
TermEdit.h_ ((o -> f o')
 -> Map (Referent'' t h) (Set (TermEdit' t o))
 -> f (Map (Referent'' t h) (Set (TermEdit' t o'))))
-> (o -> f o')
-> Map (Referent'' t h) (Set (TermEdit' t o))
-> f (Map (Referent'' t h) (Set (TermEdit' t o')))
forall {k} (f :: k -> *) s (t :: k) a (b :: k).
LensLike f s t a b -> LensLike f s t a b
%%~ o -> f o'
f
  Map (Reference' t h) (Set (TypeEdit' t o'))
newTypeEdits <- Map (Reference' t h) (Set (TypeEdit' t o))
typeEdits Map (Reference' t h) (Set (TypeEdit' t o))
-> (Map (Reference' t h) (Set (TypeEdit' t o))
    -> f (Map (Reference' t h) (Set (TypeEdit' t o'))))
-> f (Map (Reference' t h) (Set (TypeEdit' t o')))
forall a b. a -> (a -> b) -> b
& (Set (TypeEdit' t o) -> f (Set (TypeEdit' t o')))
-> Map (Reference' t h) (Set (TypeEdit' t o))
-> f (Map (Reference' t h) (Set (TypeEdit' t o')))
forall (f :: * -> *) a b.
Traversable f =>
IndexedTraversal Int (f a) (f b) a b
IndexedTraversal
  Int
  (Map (Reference' t h) (Set (TypeEdit' t o)))
  (Map (Reference' t h) (Set (TypeEdit' t o')))
  (Set (TypeEdit' t o))
  (Set (TypeEdit' t o'))
traversed ((Set (TypeEdit' t o) -> f (Set (TypeEdit' t o')))
 -> Map (Reference' t h) (Set (TypeEdit' t o))
 -> f (Map (Reference' t h) (Set (TypeEdit' t o'))))
-> ((o -> f o') -> Set (TypeEdit' t o) -> f (Set (TypeEdit' t o')))
-> (o -> f o')
-> Map (Reference' t h) (Set (TypeEdit' t o))
-> f (Map (Reference' t h) (Set (TypeEdit' t o')))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (TypeEdit' t o -> f (TypeEdit' t o'))
-> Set (TypeEdit' t o) -> f (Set (TypeEdit' t o'))
forall (f :: * -> *) b a.
(Applicative f, Ord b) =>
(a -> f b) -> Set a -> f (Set b)
Set.traverse ((TypeEdit' t o -> f (TypeEdit' t o'))
 -> Set (TypeEdit' t o) -> f (Set (TypeEdit' t o')))
-> ((o -> f o') -> TypeEdit' t o -> f (TypeEdit' t o'))
-> (o -> f o')
-> Set (TypeEdit' t o)
-> f (Set (TypeEdit' t o'))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (o -> f o') -> TypeEdit' t o -> f (TypeEdit' t o')
forall t h h' (f :: * -> *).
Applicative f =>
(h -> f h') -> TypeEdit' t h -> f (TypeEdit' t h')
TypeEdit.h_ ((o -> f o')
 -> Map (Reference' t h) (Set (TypeEdit' t o))
 -> f (Map (Reference' t h) (Set (TypeEdit' t o'))))
-> (o -> f o')
-> Map (Reference' t h) (Set (TypeEdit' t o))
-> f (Map (Reference' t h) (Set (TypeEdit' t o')))
forall {k} (f :: k -> *) s (t :: k) a (b :: k).
LensLike f s t a b -> LensLike f s t a b
%%~ o -> f o'
f
  pure Patch {$sel:termEdits:Patch :: Map (Referent'' t h) (Set (TermEdit' t o'))
termEdits = Map (Referent'' t h) (Set (TermEdit' t o'))
newTermEdits, $sel:typeEdits:Patch :: Map (Reference' t h) (Set (TypeEdit' t o'))
typeEdits = Map (Reference' t h) (Set (TypeEdit' t o'))
newTypeEdits}

trimap ::
  (Ord t', Ord h', Ord o') =>
  (t -> t') ->
  (h -> h') ->
  (o -> o') ->
  Patch' t h o ->
  Patch' t' h' o'
trimap :: forall t' h' o' t h o.
(Ord t', Ord h', Ord o') =>
(t -> t')
-> (h -> h') -> (o -> o') -> Patch' t h o -> Patch' t' h' o'
trimap t -> t'
ft h -> h'
fh o -> o'
fo (Patch Map (Referent'' t h) (Set (TermEdit' t o))
tms Map (Reference' t h) (Set (TypeEdit' t o))
tps) =
  Map (Referent'' t' h') (Set (TermEdit' t' o'))
-> Map (Reference' t' h') (Set (TypeEdit' t' o'))
-> Patch' t' h' o'
forall t h o.
Map (Referent'' t h) (Set (TermEdit' t o))
-> Map (Reference' t h) (Set (TypeEdit' t o)) -> Patch' t h o
Patch
    ((Referent'' t h -> Referent'' t' h')
-> (Set (TermEdit' t o) -> Set (TermEdit' t' o'))
-> Map (Referent'' t h) (Set (TermEdit' t o))
-> Map (Referent'' t' h') (Set (TermEdit' t' o'))
forall a' a b b'.
Ord a' =>
(a -> a') -> (b -> b') -> Map a b -> Map a' b'
Map.bimap ((Reference' t h -> Reference' t' h')
-> (Reference' t h -> Reference' t' h')
-> Referent'' t h
-> Referent'' t' h'
forall a b c d.
(a -> b) -> (c -> d) -> Referent' a c -> Referent' b d
forall (p :: * -> * -> *) a b c d.
Bifunctor p =>
(a -> b) -> (c -> d) -> p a c -> p b d
bimap ((t -> t') -> (h -> h') -> Reference' t h -> Reference' t' h'
forall a b c d.
(a -> b) -> (c -> d) -> Reference' a c -> Reference' b d
forall (p :: * -> * -> *) a b c d.
Bifunctor p =>
(a -> b) -> (c -> d) -> p a c -> p b d
bimap t -> t'
ft h -> h'
fh) ((t -> t') -> (h -> h') -> Reference' t h -> Reference' t' h'
forall a b c d.
(a -> b) -> (c -> d) -> Reference' a c -> Reference' b d
forall (p :: * -> * -> *) a b c d.
Bifunctor p =>
(a -> b) -> (c -> d) -> p a c -> p b d
bimap t -> t'
ft h -> h'
fh)) ((TermEdit' t o -> TermEdit' t' o')
-> Set (TermEdit' t o) -> Set (TermEdit' t' o')
forall b a. Ord b => (a -> b) -> Set a -> Set b
Set.map ((t -> t') -> (o -> o') -> TermEdit' t o -> TermEdit' t' o'
forall a b c d.
(a -> b) -> (c -> d) -> TermEdit' a c -> TermEdit' b d
forall (p :: * -> * -> *) a b c d.
Bifunctor p =>
(a -> b) -> (c -> d) -> p a c -> p b d
bimap t -> t'
ft o -> o'
fo)) Map (Referent'' t h) (Set (TermEdit' t o))
tms)
    ((Reference' t h -> Reference' t' h')
-> (Set (TypeEdit' t o) -> Set (TypeEdit' t' o'))
-> Map (Reference' t h) (Set (TypeEdit' t o))
-> Map (Reference' t' h') (Set (TypeEdit' t' o'))
forall a' a b b'.
Ord a' =>
(a -> a') -> (b -> b') -> Map a b -> Map a' b'
Map.bimap ((t -> t') -> (h -> h') -> Reference' t h -> Reference' t' h'
forall a b c d.
(a -> b) -> (c -> d) -> Reference' a c -> Reference' b d
forall (p :: * -> * -> *) a b c d.
Bifunctor p =>
(a -> b) -> (c -> d) -> p a c -> p b d
bimap t -> t'
ft h -> h'
fh) ((TypeEdit' t o -> TypeEdit' t' o')
-> Set (TypeEdit' t o) -> Set (TypeEdit' t' o')
forall b a. Ord b => (a -> b) -> Set a -> Set b
Set.map ((t -> t') -> (o -> o') -> TypeEdit' t o -> TypeEdit' t' o'
forall a b c d.
(a -> b) -> (c -> d) -> TypeEdit' a c -> TypeEdit' b d
forall (p :: * -> * -> *) a b c d.
Bifunctor p =>
(a -> b) -> (c -> d) -> p a c -> p b d
bimap t -> t'
ft o -> o'
fo)) Map (Reference' t h) (Set (TypeEdit' t o))
tps)