{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE UndecidableInstances #-}
--------------------------------------------------------------------
-- |
-- Module : Data.Vector.Cereal
-- Copyright : (c) Don Stewart 2010
-- License : BSD3
--
-- Maintainer: Don Stewart <dons@galois.com>
-- Stability : provisional
-- Portability: GHC only
--
-- Instances for Serialize for the types defined in the vector package,
-- making it easy to serialize vectors to and from disk. We use the
-- generic interface to vectors, so all vector types are supported.
--
--------------------------------------------------------------------
module Data.Vector.Cereal () where
import Data.Serialize
import qualified Data.Vector.Generic as G
import Control.Monad
instance (G.Vector v a, Serialize a) => Serialize (v a) where
put v = do
put (G.length v)
mapM_ put (G.toList v)
get = do
n <- get
xs <- getMany n
return (G.fromList xs)
-- | 'getMany n' get 'n' elements in order, without blowing the stack.
getMany :: Serialize a => Int -> Get [a]
getMany n = go [] n
where
go xs 0 = return $! reverse xs
go xs i = do x <- get
-- we must seq x to avoid stack overflows due to laziness in
-- (>>=)
x `seq` go (x:xs) (i-1)
{-# INLINE getMany #-}