module Data.HSet.Modify
( HModify(..)
, HModifiable
, HMonoModifiable
, hMonoModify
) where
import Data.HSet.Type
import Data.HSet.TypeLevel
#if !(MIN_VERSION_base(4, 8, 0))
import Control.Applicative
#endif
class (i ~ (Index e1 els1), i ~ (Index e2 els2))
=> HModify els1 els2 e1 e2 i
| els1 i -> e1 , els2 i -> e2
, els1 e1 e2 -> els2, els2 e1 e2 -> els1 where
hmodify :: (e1 -> e2) -> HSet els1 -> HSet els2
instance ('False ~ Elem e2 els)
=> HModify (e1 ': els) (e2 ': els) e1 e2 'Z where
hmodify f (HSCons e els) = HSCons (f e) els
instance ( ('S i) ~ (Index e1 (ex ': els1))
, ('S i) ~ (Index e2 (ex ': els2))
, HModify els1 els2 e1 e2 i
, 'False ~ (Elem ex els2) )
=> HModify (ex ': els1) (ex ': els2) e1 e2 ('S i) where
hmodify f (HSCons e els) = HSCons e $ hmodify f els
type HModifiable els1 els2 e1 e2 = HModify els1 els2 e1 e2 (Index e1 els1)
type HMonoModifiable els e = HModifiable els els e e
hMonoModify :: HMonoModifiable els e
=> (e -> e)
-> HSet els
-> HSet els
hMonoModify f h = hmodify f h