{- We can't use the standard instances for serializing maps containing Atoms or Ids. Atoms are compared using their unique id which depends on the order in which they were created. This completely invalidates the standard map instances which rely on 'fromAscDistinctList . toAscDistinctList = id' to be true. Once we've gotten rid of StringTable.Atoms, we can get rid of this module as well. -} module Support.MapBinaryInstance where import Data.Binary import Data.Word import Data.Map as Map import Data.Set as Set import Control.Monad putMap :: (Binary k,Ord k,Binary v) => Map.Map k v -> Put putMap x = do put (fromIntegral $ Map.size x :: Word32) mapM_ put (Map.toList x) getMap :: (Binary k,Ord k,Binary v) => Get (Map.Map k v) getMap = do sz <- get :: Get Word32 ls <- replicateM (fromIntegral sz) get return (Map.fromList ls) putSet :: (Binary a,Ord a) => Set.Set a -> Put putSet x = do put (fromIntegral $ Set.size x :: Word32) mapM_ put (Set.toList x) getSet :: (Binary a,Ord a) => Get (Set.Set a) getSet = do sz <- get :: Get Word32 ls <- replicateM (fromIntegral sz) get return (Set.fromList ls)