module Unison.Codebase.Branch.Names
  ( namesDiff,
    toNames,
    toPrettyPrintEnvDecl,
  )
where

import Unison.Codebase.Branch
import Unison.Codebase.Branch.Type qualified as Branch
import Unison.Names (Names (..))
import Unison.NamesWithHistory qualified as Names
import Unison.PrettyPrintEnv.Names qualified as PPE
import Unison.PrettyPrintEnvDecl qualified as PPED
import Unison.PrettyPrintEnvDecl.Names qualified as PPED
import Unison.Util.Relation qualified as R
import Prelude hiding (head, read, subtract)

-- | Get the pretty-printing environment for names in the provided branch.
toPrettyPrintEnvDecl :: Int -> Branch0 m -> PPED.PrettyPrintEnvDecl
toPrettyPrintEnvDecl :: forall (m :: * -> *). Int -> Branch0 m -> PrettyPrintEnvDecl
toPrettyPrintEnvDecl Int
hashLength Branch0 m
b =
  let names :: Names
names = Branch0 m -> Names
forall (m :: * -> *). Branch0 m -> Names
toNames Branch0 m
b
   in Namer -> Suffixifier -> PrettyPrintEnvDecl
PPED.makePPED (Int -> Names -> Namer
PPE.hqNamer Int
hashLength Names
names) (Names -> Suffixifier
PPE.suffixifyByHash Names
names)

-- | Get the names in the provided branch.
toNames :: Branch0 m -> Names
toNames :: forall (m :: * -> *). Branch0 m -> Names
toNames Branch0 m
b =
  Relation Name Referent -> Relation Name TypeReference -> Names
Names
    (Relation Referent Name -> Relation Name Referent
forall a b. Relation a b -> Relation b a
R.swap (Relation Referent Name -> Relation Name Referent)
-> (Branch0 m -> Relation Referent Name)
-> Branch0 m
-> Relation Name Referent
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Branch0 m -> Relation Referent Name
forall (m :: * -> *). Branch0 m -> Relation Referent Name
Branch.deepTerms (Branch0 m -> Relation Name Referent)
-> Branch0 m -> Relation Name Referent
forall a b. (a -> b) -> a -> b
$ Branch0 m
b)
    (Relation TypeReference Name -> Relation Name TypeReference
forall a b. Relation a b -> Relation b a
R.swap (Relation TypeReference Name -> Relation Name TypeReference)
-> (Branch0 m -> Relation TypeReference Name)
-> Branch0 m
-> Relation Name TypeReference
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Branch0 m -> Relation TypeReference Name
forall (m :: * -> *). Branch0 m -> Relation TypeReference Name
Branch.deepTypes (Branch0 m -> Relation Name TypeReference)
-> Branch0 m -> Relation Name TypeReference
forall a b. (a -> b) -> a -> b
$ Branch0 m
b)

namesDiff :: Branch m -> Branch m -> Names.Diff
namesDiff :: forall (m :: * -> *). Branch m -> Branch m -> Diff
namesDiff Branch m
b1 Branch m
b2 = Names -> Names -> Diff
Names.diff (Branch0 m -> Names
forall (m :: * -> *). Branch0 m -> Names
toNames (Branch m -> Branch0 m
forall (m :: * -> *). Branch m -> Branch0 m
head Branch m
b1)) (Branch0 m -> Names
forall (m :: * -> *). Branch0 m -> Names
toNames (Branch m -> Branch0 m
forall (m :: * -> *). Branch m -> Branch0 m
head Branch m
b2))