module Unison.Merge.Mergeblob0
  ( Mergeblob0 (..),
    makeMergeblob0,
  )
where

import Unison.Merge.ThreeWay (ThreeWay)
import Unison.Name (Name)
import Unison.NameSegment (NameSegment)
import Unison.Prelude
import Unison.Reference (TypeReference)
import Unison.Referent (Referent)
import Unison.Util.BiMultimap (BiMultimap)
import Unison.Util.Defns (Defns, DefnsF)
import Unison.Util.Nametree (Nametree, flattenNametrees)

data Mergeblob0 libdep = Mergeblob0
  { forall libdep.
Mergeblob0 libdep
-> ThreeWay
     (Defns (BiMultimap Referent Name) (BiMultimap TypeReference Name))
defns :: ThreeWay (Defns (BiMultimap Referent Name) (BiMultimap TypeReference Name)),
    forall libdep.
Mergeblob0 libdep -> ThreeWay (Map NameSegment libdep)
libdeps :: ThreeWay (Map NameSegment libdep),
    forall libdep.
Mergeblob0 libdep
-> ThreeWay
     (Nametree (DefnsF (Map NameSegment) Referent TypeReference))
nametrees :: ThreeWay (Nametree (DefnsF (Map NameSegment) Referent TypeReference))
  }

makeMergeblob0 ::
  ThreeWay (Nametree (DefnsF (Map NameSegment) Referent TypeReference)) ->
  ThreeWay (Map NameSegment libdep) ->
  Mergeblob0 libdep
makeMergeblob0 :: forall libdep.
ThreeWay
  (Nametree (DefnsF (Map NameSegment) Referent TypeReference))
-> ThreeWay (Map NameSegment libdep) -> Mergeblob0 libdep
makeMergeblob0 ThreeWay
  (Nametree (DefnsF (Map NameSegment) Referent TypeReference))
nametrees ThreeWay (Map NameSegment libdep)
libdeps =
  Mergeblob0
    { $sel:defns:Mergeblob0 :: ThreeWay
  (Defns (BiMultimap Referent Name) (BiMultimap TypeReference Name))
defns = Nametree (DefnsF (Map NameSegment) Referent TypeReference)
-> Defns (BiMultimap Referent Name) (BiMultimap TypeReference Name)
forall term typ.
(Ord term, Ord typ) =>
Nametree (DefnsF (Map NameSegment) term typ)
-> Defns (BiMultimap term Name) (BiMultimap typ Name)
flattenNametrees (Nametree (DefnsF (Map NameSegment) Referent TypeReference)
 -> Defns
      (BiMultimap Referent Name) (BiMultimap TypeReference Name))
-> ThreeWay
     (Nametree (DefnsF (Map NameSegment) Referent TypeReference))
-> ThreeWay
     (Defns (BiMultimap Referent Name) (BiMultimap TypeReference Name))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ThreeWay
  (Nametree (DefnsF (Map NameSegment) Referent TypeReference))
nametrees,
      ThreeWay (Map NameSegment libdep)
$sel:libdeps:Mergeblob0 :: ThreeWay (Map NameSegment libdep)
libdeps :: ThreeWay (Map NameSegment libdep)
libdeps,
      ThreeWay
  (Nametree (DefnsF (Map NameSegment) Referent TypeReference))
$sel:nametrees:Mergeblob0 :: ThreeWay
  (Nametree (DefnsF (Map NameSegment) Referent TypeReference))
nametrees :: ThreeWay
  (Nametree (DefnsF (Map NameSegment) Referent TypeReference))
nametrees
    }