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.Names qualified as Names
import Unison.NamesWithHistory qualified as Names
import Unison.PrettyPrintEnv.Names qualified as PPE
import Unison.PrettyPrintEnvDecl qualified as PPED
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 =
  Defns (Relation Referent Name) (Relation TypeReference Name)
-> Names
Names.fromRelations (Defns (Relation Referent Name) (Relation TypeReference Name)
 -> Names)
-> (Branch0 m
    -> Defns (Relation Referent Name) (Relation TypeReference Name))
-> Branch0 m
-> Names
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Branch0 m
-> Defns (Relation Referent Name) (Relation TypeReference Name)
forall (m :: * -> *).
Branch0 m
-> Defns (Relation Referent Name) (Relation TypeReference Name)
Branch.deepDefns

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))