module Util.GMap where
import Data.Monoid
import Util.HasSize
import Util.SetLike
import qualified Data.IntMap as IM
import qualified Data.IntSet as IS
import qualified Data.Set as Set
data family GMap k :: * -> *
data family GSet k :: *
newtype instance GMap Int v = GMapInt (IM.IntMap v)
deriving(Monoid,IsEmpty,HasSize,Collection,Unionize,SetLike,MapLike)
newtype instance GSet Int = GSetInt IS.IntSet
deriving(Monoid,IsEmpty,HasSize,Collection,Unionize,SetLike)
instance Functor (GMap Int) where
fmap f (GMapInt v) = GMapInt $ fmap f v
type instance Elem (GMap k v) = (k,v)
type instance Key (GMap k v) = k
type instance Value (GMap k v) = v
type instance Elem (GSet k) = k
type instance Key (GSet k) = k
newtype instance GSet Char = GSetChar (EnumSet Char)
deriving(Monoid,IsEmpty,HasSize,Collection,Unionize,SetLike)
newtype instance GMap Char v = GMapChar (EnumMap Char v)
deriving(Monoid,IsEmpty,HasSize,Collection,Unionize,SetLike,MapLike)
gsetToSet :: (Collection (GSet a), Ord a) => GSet a -> Set.Set a
gsetToSet gs = Set.fromDistinctAscList (toList gs)
class GMapSet k where
toSet :: GMap k v -> GSet k
toMap :: (k -> v) -> GSet k -> GMap k v
instance GMapSet Int where
toSet (GMapInt im) = GSetInt (IM.keysSet im)
toMap f (GSetInt is) = GMapInt $ IM.fromDistinctAscList [ (x,f x) | x <- IS.toAscList is]