{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE NoImplicitPrelude #-}
module Data.Morpheus.Ext.KeyOf
( KeyOf (..),
toPair,
)
where
import Data.Mergeable
( Indexed (..),
)
import Data.Morpheus.Types.Internal.AST.Base
( Ref (..),
)
import Relude
class (Eq k, Hashable k) => KeyOf k a | a -> k where
keyOf :: a -> k
instance (Eq k, Hashable k) => KeyOf k (k, a) where
keyOf = fst
instance (Eq name, Hashable name) => KeyOf name (Ref name) where
keyOf = refName
instance (Eq k, Hashable k) => KeyOf k (Indexed k a) where
keyOf = indexedKey
toPair :: KeyOf k a => a -> (k, a)
toPair x = (keyOf x, x)