module Unison.Hashing.V2.Branch
  ( Branch (..),
    MdValues (..),
  )
where

import Unison.Hash (Hash)
import Unison.Hashing.ContentAddressable (ContentAddressable (..))
import Unison.Hashing.V2.NameSegment (NameSegment)
import Unison.Hashing.V2.Reference (Reference)
import Unison.Hashing.V2.Referent (Referent)
import Unison.Hashing.V2.Tokenizable (Tokenizable)
import Unison.Hashing.V2.Tokenizable qualified as H
import Unison.Prelude

type MetadataValue = Reference

newtype MdValues = MdValues (Set MetadataValue)
  deriving (MdValues -> MdValues -> Bool
(MdValues -> MdValues -> Bool)
-> (MdValues -> MdValues -> Bool) -> Eq MdValues
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: MdValues -> MdValues -> Bool
== :: MdValues -> MdValues -> Bool
$c/= :: MdValues -> MdValues -> Bool
/= :: MdValues -> MdValues -> Bool
Eq, Eq MdValues
Eq MdValues =>
(MdValues -> MdValues -> Ordering)
-> (MdValues -> MdValues -> Bool)
-> (MdValues -> MdValues -> Bool)
-> (MdValues -> MdValues -> Bool)
-> (MdValues -> MdValues -> Bool)
-> (MdValues -> MdValues -> MdValues)
-> (MdValues -> MdValues -> MdValues)
-> Ord MdValues
MdValues -> MdValues -> Bool
MdValues -> MdValues -> Ordering
MdValues -> MdValues -> MdValues
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: MdValues -> MdValues -> Ordering
compare :: MdValues -> MdValues -> Ordering
$c< :: MdValues -> MdValues -> Bool
< :: MdValues -> MdValues -> Bool
$c<= :: MdValues -> MdValues -> Bool
<= :: MdValues -> MdValues -> Bool
$c> :: MdValues -> MdValues -> Bool
> :: MdValues -> MdValues -> Bool
$c>= :: MdValues -> MdValues -> Bool
>= :: MdValues -> MdValues -> Bool
$cmax :: MdValues -> MdValues -> MdValues
max :: MdValues -> MdValues -> MdValues
$cmin :: MdValues -> MdValues -> MdValues
min :: MdValues -> MdValues -> MdValues
Ord, Int -> MdValues -> ShowS
[MdValues] -> ShowS
MdValues -> String
(Int -> MdValues -> ShowS)
-> (MdValues -> String) -> ([MdValues] -> ShowS) -> Show MdValues
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> MdValues -> ShowS
showsPrec :: Int -> MdValues -> ShowS
$cshow :: MdValues -> String
show :: MdValues -> String
$cshowList :: [MdValues] -> ShowS
showList :: [MdValues] -> ShowS
Show)
  deriving (MdValues -> [Token]
(MdValues -> [Token]) -> Tokenizable MdValues
forall t. (t -> [Token]) -> Tokenizable t
$ctokens :: MdValues -> [Token]
tokens :: MdValues -> [Token]
Tokenizable) via Set MetadataValue

data Branch = Branch
  { Branch -> Map NameSegment (Map Referent MdValues)
terms :: Map NameSegment (Map Referent MdValues),
    Branch -> Map NameSegment (Map MetadataValue MdValues)
types :: Map NameSegment (Map Reference MdValues),
    Branch -> Map NameSegment Hash
patches :: Map NameSegment Hash,
    Branch -> Map NameSegment Hash
children :: Map NameSegment Hash -- the Causal Hash
  }
  deriving (Branch -> Branch -> Bool
(Branch -> Branch -> Bool)
-> (Branch -> Branch -> Bool) -> Eq Branch
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Branch -> Branch -> Bool
== :: Branch -> Branch -> Bool
$c/= :: Branch -> Branch -> Bool
/= :: Branch -> Branch -> Bool
Eq, Eq Branch
Eq Branch =>
(Branch -> Branch -> Ordering)
-> (Branch -> Branch -> Bool)
-> (Branch -> Branch -> Bool)
-> (Branch -> Branch -> Bool)
-> (Branch -> Branch -> Bool)
-> (Branch -> Branch -> Branch)
-> (Branch -> Branch -> Branch)
-> Ord Branch
Branch -> Branch -> Bool
Branch -> Branch -> Ordering
Branch -> Branch -> Branch
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Branch -> Branch -> Ordering
compare :: Branch -> Branch -> Ordering
$c< :: Branch -> Branch -> Bool
< :: Branch -> Branch -> Bool
$c<= :: Branch -> Branch -> Bool
<= :: Branch -> Branch -> Bool
$c> :: Branch -> Branch -> Bool
> :: Branch -> Branch -> Bool
$c>= :: Branch -> Branch -> Bool
>= :: Branch -> Branch -> Bool
$cmax :: Branch -> Branch -> Branch
max :: Branch -> Branch -> Branch
$cmin :: Branch -> Branch -> Branch
min :: Branch -> Branch -> Branch
Ord, Int -> Branch -> ShowS
[Branch] -> ShowS
Branch -> String
(Int -> Branch -> ShowS)
-> (Branch -> String) -> ([Branch] -> ShowS) -> Show Branch
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Branch -> ShowS
showsPrec :: Int -> Branch -> ShowS
$cshow :: Branch -> String
show :: Branch -> String
$cshowList :: [Branch] -> ShowS
showList :: [Branch] -> ShowS
Show)

instance ContentAddressable Branch where
  contentHash :: Branch -> Hash
contentHash = Branch -> Hash
forall t. Tokenizable t => t -> Hash
H.hashTokenizable

instance Tokenizable Branch where
  tokens :: Branch -> [Token]
tokens Branch
b =
    [ Map NameSegment (Map Referent MdValues) -> Token
forall t. Tokenizable t => t -> Token
H.accumulateToken (Branch -> Map NameSegment (Map Referent MdValues)
terms Branch
b),
      Map NameSegment (Map MetadataValue MdValues) -> Token
forall t. Tokenizable t => t -> Token
H.accumulateToken (Branch -> Map NameSegment (Map MetadataValue MdValues)
types Branch
b),
      Map NameSegment Hash -> Token
forall t. Tokenizable t => t -> Token
H.accumulateToken (Branch -> Map NameSegment Hash
children Branch
b),
      Map NameSegment Hash -> Token
forall t. Tokenizable t => t -> Token
H.accumulateToken (Branch -> Map NameSegment Hash
patches Branch
b)
    ]