{-# LANGUAGE MonoLocalBinds #-}
{-# LANGUAGE UndecidableInstances #-}
module Data.Binary.Write where
import Data.Binary
import Data.Vector (Vector)
class WriteBinary a where
writeBinary :: a -> Put
instance {-# OVERLAPPABLE #-} (Binary a) => WriteBinary a where
writeBinary :: a -> Put
writeBinary = a -> Put
forall a. Binary a => a -> Put
put
writeList ::
(WriteBinary a, Integral i, Foldable t) =>
(i -> Put) ->
t a ->
Put
writeList :: forall a i (t :: * -> *).
(WriteBinary a, Integral i, Foldable t) =>
(i -> Put) -> t a -> Put
writeList i -> Put
putLength t a
xs = i -> Put
putLength (Int -> i
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> i) -> Int -> i
forall a b. (a -> b) -> a -> b
$ t a -> Int
forall a. t a -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length t a
xs) Put -> Put -> Put
forall a b. PutM a -> PutM b -> PutM b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> (a -> Put) -> t a -> Put
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ a -> Put
forall a. WriteBinary a => a -> Put
writeBinary t a
xs
{-# SPECIALIZE writeList :: (WriteBinary a) => (Word16 -> Put) -> Vector a -> Put #-}
{-# SPECIALIZE writeList :: (WriteBinary a) => (Word16 -> Put) -> [a] -> Put #-}