module Data.HSet.Reverse
( HReverse(..)
, HReversible
, hreverse
) where
import Data.HSet.Type
import Data.HSet.TypeLevel
class HReverse acc els1 els2
| acc els1 -> els2 where
hreverse' :: HSet acc -> HSet els1 -> HSet els2
instance HReverse acc '[] acc where
hreverse' acc _ = acc
instance ( 'False ~ (Elem e (ah ': at))
, HReverse (e ': ah ': at) els1 els2 )
=> HReverse (ah ': at) (e ': els1) els2 where
hreverse' acc (HSCons e els1) = hreverse' (HSCons e acc) els1
instance ( (e ': els1) ~ Reverse els2
, HReverse '[e] els1 els2 )
=> HReverse '[] (e ': els1) els2 where
hreverse' acc (HSCons e els1) = hreverse' (HSCons e acc) els1
type HReversible els1 els2 =
( HReverse '[] els1 els2
)
hreverse :: (HReversible a r) => HSet a -> HSet r
hreverse a = hreverse' HSNil a