module Unison.Merge.Synhashed
  ( Synhashed (..),
  )
where

import Unison.Hash (Hash)
import Unison.Prelude

-- | A small utility type that represents a syntactic-hashed thing.
--
-- The `Eq` and `Ord` instances only compares syntactic hashes.
data Synhashed a = Synhashed
  { forall a. Synhashed a -> Hash
hash :: !Hash,
    forall a. Synhashed a -> a
value :: !a
  }
  deriving stock ((forall a b. (a -> b) -> Synhashed a -> Synhashed b)
-> (forall a b. a -> Synhashed b -> Synhashed a)
-> Functor Synhashed
forall a b. a -> Synhashed b -> Synhashed a
forall a b. (a -> b) -> Synhashed a -> Synhashed b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall a b. (a -> b) -> Synhashed a -> Synhashed b
fmap :: forall a b. (a -> b) -> Synhashed a -> Synhashed b
$c<$ :: forall a b. a -> Synhashed b -> Synhashed a
<$ :: forall a b. a -> Synhashed b -> Synhashed a
Functor, (forall x. Synhashed a -> Rep (Synhashed a) x)
-> (forall x. Rep (Synhashed a) x -> Synhashed a)
-> Generic (Synhashed a)
forall x. Rep (Synhashed a) x -> Synhashed a
forall x. Synhashed a -> Rep (Synhashed a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (Synhashed a) x -> Synhashed a
forall a x. Synhashed a -> Rep (Synhashed a) x
$cfrom :: forall a x. Synhashed a -> Rep (Synhashed a) x
from :: forall x. Synhashed a -> Rep (Synhashed a) x
$cto :: forall a x. Rep (Synhashed a) x -> Synhashed a
to :: forall x. Rep (Synhashed a) x -> Synhashed a
Generic, Int -> Synhashed a -> ShowS
[Synhashed a] -> ShowS
Synhashed a -> String
(Int -> Synhashed a -> ShowS)
-> (Synhashed a -> String)
-> ([Synhashed a] -> ShowS)
-> Show (Synhashed a)
forall a. Show a => Int -> Synhashed a -> ShowS
forall a. Show a => [Synhashed a] -> ShowS
forall a. Show a => Synhashed a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Show a => Int -> Synhashed a -> ShowS
showsPrec :: Int -> Synhashed a -> ShowS
$cshow :: forall a. Show a => Synhashed a -> String
show :: Synhashed a -> String
$cshowList :: forall a. Show a => [Synhashed a] -> ShowS
showList :: [Synhashed a] -> ShowS
Show)

instance Eq (Synhashed a) where
  Synhashed Hash
x a
_ == :: Synhashed a -> Synhashed a -> Bool
== Synhashed Hash
y a
_ =
    Hash
x Hash -> Hash -> Bool
forall a. Eq a => a -> a -> Bool
== Hash
y

instance Ord (Synhashed a) where
  compare :: Synhashed a -> Synhashed a -> Ordering
compare (Synhashed Hash
x a
_) (Synhashed Hash
y a
_) =
    Hash -> Hash -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Hash
x Hash
y