module Control.Interchangeable
(
Interchangeable (..)
)
where
import qualified Data.Set
import qualified Data.Map
class Interchangeable a b where
interchange :: a -> b
interchange' :: b -> a
applyI :: a -> b -> b
applyI a b = modifyI' b (const a)
applyI' :: b -> a -> a
applyI' b a = modifyI a (const b)
modifyI :: a -> (b -> b) -> a
modifyI a f = applyI' (f (interchange a)) a
modifyI' :: b -> (a -> a) -> b
modifyI' b f = applyI (f (interchange' b)) b
instance (Interchangeable a b) => Interchangeable b a where
interchange = interchange'
interchange' = interchange
applyI = applyI'
applyI' = applyI
instance (Ord a) => Interchangeable [a] (Data.Set.Set a) where
interchange = Data.Set.fromList
interchange' = Data.Set.toList
applyI a = Data.Set.union (Data.Set.fromList a)
applyI' b a = a ++ Data.Set.toList b
instance (Ord k) => Interchangeable [(k,a)] (Data.Map.Map k a) where
interchange = Data.Map.fromList
interchange' = Data.Map.toList
applyI a = Data.Map.union (Data.Map.fromList a)
applyI' b a = a ++ Data.Map.toList b