module U.Codebase.Branch.Hashing
  ( hashBranch,
    hashBranchV3,
  )
where

import U.Codebase.Branch (Branch)
import U.Codebase.BranchV3 (BranchV3)
import U.Codebase.HashTags
import Unison.Hashing.V2 qualified as Hashing
import Unison.Hashing.V2.Convert2 (convertBranchV3, v2ToH2Branch)

hashBranch :: forall m. (Monad m) => Branch m -> m BranchHash
hashBranch :: forall (m :: * -> *). Monad m => Branch m -> m BranchHash
hashBranch Branch m
branch =
  Hash -> BranchHash
BranchHash (Hash -> BranchHash) -> (Branch -> Hash) -> Branch -> BranchHash
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Branch -> Hash
forall a. ContentAddressable a => a -> Hash
Hashing.contentHash (Branch -> BranchHash) -> m Branch -> m BranchHash
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Branch m -> m Branch
forall (m :: * -> *). Monad m => Branch m -> m Branch
v2ToH2Branch Branch m
branch

-- | Hash a V3 branch.
hashBranchV3 :: BranchV3 m -> BranchHash
hashBranchV3 :: forall (m :: * -> *). BranchV3 m -> BranchHash
hashBranchV3 =
  Hash -> BranchHash
BranchHash (Hash -> BranchHash)
-> (BranchV3 m -> Hash) -> BranchV3 m -> BranchHash
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Branch -> Hash
forall a. ContentAddressable a => a -> Hash
Hashing.contentHash (Branch -> Hash) -> (BranchV3 m -> Branch) -> BranchV3 m -> Hash
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BranchV3 m -> Branch
forall (m :: * -> *). BranchV3 m -> Branch
convertBranchV3