{-#OPTIONS -fglasgow-exts -fallow-undecidable-instances #-} module SuperGenMap where import Prelude hiding (lookup) import GenMap data GMap k a = forall m. Map k m => GM !(m a) class MapKey k where gempty :: GMap k a gsingleton :: k -> a -> GMap k a instance (Map k m) => MapKey k where gempty = GM (empty (__::k)) gsingleton k x = GM (singleton k x) gempty' :: (Map k m) => (k) -> GMap k a gempty' (_::k) = GM (empty (__::k)) gsingleton' :: (Map k m) => k -> a -> GMap k a gsingleton' k x = GM (singleton k x) gsize :: GMap k a -> Int gsize (GM m :: GMap k a) = size (__::k) m ginsertWith :: (a -> a -> a) -> k -> a -> GMap k a -> GMap k a ginsertWith f k x (GM m) = GM (insertWith f k x m) ginsert = ginsertWith const gtoList :: GMap k a -> [(k,a)] gtoList (GM m) = toList m