Feature Request: TypeLits function `cmpSymbol`
Motivation
The GHC.TypeLits
module has a sameSymbol
function, which is great for checking equality of symbols at runtime. It also has a CmpSymbol
type family for comparing symbols at the type level. I feel like there should also be a cmpSymbol
function for comparing symbols at runtime.
Proposal
I propose we add cmpSymbol
to GHC.TypeLits
. The definition I had in mind is:
cmpSymbol :: (KnownSymbol a, KnownSymbol b)
=> Proxy a -> Proxy b -> Either (a :~: b) (Either (CmpSymbol a b :~: 'LT) (CmpSymbol a b :~: 'GT))
cmpSymbol x y = case compare (symbolVal x) (symbolVal y) of
EQ -> Left (UNSAFE.unsafeCoerce Refl)
LT -> Right (Left (UNSAFE.unsafeCoerce Refl))
GT -> Right (Right (UNSAFE.unsafeCoerce Refl))
The implementation here is very similar to the implementation of sameSymbol
, but if the symbols are not the same, the caller is provided with evidence of the fact.