Hello community,

here is the log from the commit of package ghc-cereal for openSUSE:Factory 
checked in at 2016-06-02 09:40:05
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ghc-cereal (Old)
 and      /work/SRC/openSUSE:Factory/.ghc-cereal.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "ghc-cereal"

Changes:
--------
--- /work/SRC/openSUSE:Factory/ghc-cereal/ghc-cereal.changes    2016-01-28 
17:24:33.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.ghc-cereal.new/ghc-cereal.changes       
2016-06-02 09:40:06.000000000 +0200
@@ -1,0 +2,10 @@
+Wed Jun  1 19:07:52 UTC 2016 - mimi...@gmail.com
+
+- update to 0.5.2.0
+* Implement the AMP recommended refactoring for the Functor/Applicative/Monad
+     hierarchy for Get and PutM
+* Unconditionally support GHC generics
+* Split the GSerialize class in two, to deal with a GHC bug
+* No longer use Enum in the Serialize instance for Bool
+
+-------------------------------------------------------------------

Old:
----
  cereal-0.5.1.0.tar.gz

New:
----
  cereal-0.5.2.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ ghc-cereal.spec ++++++
--- /var/tmp/diff_new_pack.oiJ2Vd/_old  2016-06-02 09:40:07.000000000 +0200
+++ /var/tmp/diff_new_pack.oiJ2Vd/_new  2016-06-02 09:40:07.000000000 +0200
@@ -17,22 +17,22 @@
 
 
 %global pkg_name cereal
-# no useful debuginfo for Haskell packages without C sources
-%global debug_package %{nil}
 
 Name:           ghc-cereal
-Version:        0.5.1.0
+Version:        0.5.2.0
 Release:        0
 Summary:        A binary serialization library
 License:        BSD-3-Clause
 Group:          System/Libraries
 Url:            http://hackage.haskell.org/package/%{pkg_name}
-Source0:        
http://hackage.haskell.org/packages/archive/%{pkg_name}/%{version}/%{pkg_name}-%{version}.tar.gz
+Source0:        
http://hackage.haskell.org/package/%{pkg_name}-%{version}/%{pkg_name}-%{version}.tar.gz
 Source1:        %{name}-rpmlintrc
 BuildRequires:  ghc-Cabal-devel
 BuildRequires:  ghc-array-devel
 BuildRequires:  ghc-bytestring-devel
 BuildRequires:  ghc-containers-devel
+# fail is needed on ghc 7.x
+BuildRequires:  ghc-fail-devel
 BuildRequires:  ghc-rpm-macros
 BuildRoot:      %{_tmppath}/%{name}-%{version}-build
 BuildRequires:  ghc-rpm-macros

++++++ cereal-0.5.1.0.tar.gz -> cereal-0.5.2.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cereal-0.5.1.0/CHANGELOG.md 
new/cereal-0.5.2.0/CHANGELOG.md
--- old/cereal-0.5.1.0/CHANGELOG.md     2015-11-12 18:53:27.000000000 +0100
+++ new/cereal-0.5.2.0/CHANGELOG.md     2016-05-28 01:48:29.000000000 +0200
@@ -1,4 +1,18 @@
 
+0.5.2.0
+======
+
+* Implement the AMP recommended refactoring for the Functor/Applicative/Monad
+  hierarchy for Get and PutM (thanks to Herbert Valerio Riedel!)
+* Unconditionally support GHC generics (thanks to Eric Mertens!)
+* Split the GSerialize class in two, to deal with a GHC bug (thanks Austin 
Seipp!)
+* No longer use Enum in the Serialize instance for Bool (thanks Francesco 
Mazzoli!)
+
+0.5.1.0
+=======
+
+* Re-enable GHC.Generics support which was accidentally removed in 0.5.0.0
+
 0.5.0.0
 =======
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cereal-0.5.1.0/cereal.cabal 
new/cereal-0.5.2.0/cereal.cabal
--- old/cereal-0.5.1.0/cereal.cabal     2015-11-12 18:53:27.000000000 +0100
+++ new/cereal-0.5.2.0/cereal.cabal     2016-05-28 01:48:29.000000000 +0200
@@ -1,5 +1,5 @@
 name:                   cereal
-version:                0.5.1.0
+version:                0.5.2.0
 license:                BSD3
 license-file:           LICENSE
 author:                 Lennart Kolmodin <kolmo...@dtek.chalmers.se>,
@@ -13,6 +13,7 @@
 cabal-version:          >= 1.10
 synopsis:               A binary serialization library
 homepage:               https://github.com/GaloisInc/cereal
+tested-with:            GHC == 7.2.2, GHC == 7.4.2, GHC == 7.6.3, GHC == 
7.8.4, GHC == 7.10.2
 
 description:
   A binary serialization library, similar to binary, that introduces an isolate
@@ -27,10 +28,13 @@
 library
         default-language:       Haskell2010
 
-        build-depends:          bytestring >= 0.10.0.0,
+        build-depends:          bytestring >= 0.10.2.0,
                                 base >= 4.4 && < 5, containers, array,
                                 ghc-prim >= 0.2
 
+        if !impl(ghc >= 8.0)
+          build-depends:        fail == 4.9.*
+
         hs-source-dirs:         src
 
         exposed-modules:        Data.Serialize,
@@ -40,9 +44,6 @@
 
         ghc-options:            -Wall -O2 -funbox-strict-fields
 
-        if impl(ghc >= 7.2.1)
-                                cpp-options:    -DGENERICS
-                                build-depends:  ghc-prim >= 0.2
 
 
 test-suite test-cereal
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cereal-0.5.1.0/src/Data/Serialize/Get.hs 
new/cereal-0.5.2.0/src/Data/Serialize/Get.hs
--- old/cereal-0.5.1.0/src/Data/Serialize/Get.hs        2015-11-12 
18:53:27.000000000 +0100
+++ new/cereal-0.5.2.0/src/Data/Serialize/Get.hs        2016-05-28 
01:48:29.000000000 +0200
@@ -1,6 +1,7 @@
 {-# LANGUAGE CPP        #-}
 {-# LANGUAGE MagicHash  #-}
 {-# LANGUAGE Rank2Types #-}
+{-# LANGUAGE BangPatterns #-}
 
 -----------------------------------------------------------------------------
 -- |
@@ -98,12 +99,12 @@
     , getMaybeOf
     , getEitherOf
     , getNested
-
   ) where
 
 import qualified Control.Applicative as A
 import qualified Control.Monad as M
 import Control.Monad (unless)
+import qualified Control.Monad.Fail as Fail
 import Data.Array.IArray (IArray,listArray)
 import Data.Ix (Ix)
 import Data.List (intercalate)
@@ -171,7 +172,7 @@
 extendBuffer :: Buffer -> B.ByteString -> Buffer
 extendBuffer buf chunk =
   do bs <- buf
-     return (bs `B.append` chunk)
+     return $! bs `B.append` chunk
 {-# INLINE extendBuffer #-}
 
 append :: Buffer -> Buffer -> Buffer
@@ -201,7 +202,7 @@
       unGet m s0 b0 m0 kf $ \ s1 b1 m1 a     -> ks s1 b1 m1 (p a)
 
 instance A.Applicative Get where
-    pure  = return
+    pure a = Get $ \ s0 b0 m0 _ ks -> ks s0 b0 m0 a
     {-# INLINE pure #-}
 
     f <*> x =         Get $ \ s0 b0 m0 kf ks ->
@@ -209,6 +210,10 @@
       unGet x s1 b1 m1 kf $ \ s2 b2 m2 y     -> ks s2 b2 m2 (g y)
     {-# INLINE (<*>) #-}
 
+    m *> k =          Get $ \ s0 b0 m0 kf ks ->
+      unGet m s0 b0 m0 kf $ \ s1 b1 m1 _     -> unGet k s1 b1 m1 kf ks
+    {-# INLINE (*>) #-}
+
 instance A.Alternative Get where
     empty = failDesc "empty"
     {-# INLINE empty #-}
@@ -218,20 +223,22 @@
 
 -- Definition directly from Control.Monad.State.Strict
 instance Monad Get where
-    return a = Get $ \ s0 b0 m0 _ ks -> ks s0 b0 m0 a
+    return = A.pure
     {-# INLINE return #-}
 
     m >>= g  =        Get $ \ s0 b0 m0 kf ks ->
       unGet m s0 b0 m0 kf $ \ s1 b1 m1 a     -> unGet (g a) s1 b1 m1 kf ks
     {-# INLINE (>>=) #-}
 
-    m >> k =          Get $ \ s0 b0 m0 kf ks ->
-      unGet m s0 b0 m0 kf $ \ s1 b1 m1 _     -> unGet k s1 b1 m1 kf ks
+    (>>) = (A.*>)
     {-# INLINE (>>) #-}
 
-    fail     = failDesc
+    fail     = Fail.fail
     {-# INLINE fail #-}
 
+instance Fail.MonadFail Get where
+    fail     = failDesc
+    {-# INLINE fail #-}
 
 instance M.MonadPlus Get where
     mzero     = failDesc "mzero"
@@ -363,20 +370,44 @@
 
 -- | If at least @n@ bytes of input are available, return the current
 --   input, otherwise fail.
-ensure :: Int -> Get B.ByteString
-ensure n = n `seq` Get $ \ s0 b0 m0 kf ks ->
-    if B.length s0 >= n
-    then ks s0 b0 m0 s0
-    else unGet (demandInput >> ensureRec n) s0 b0 m0 kf ks
 {-# INLINE ensure #-}
-
--- | If at least @n@ bytes of input are available, return the current
---   input, otherwise fail.
-ensureRec :: Int -> Get B.ByteString
-ensureRec n = Get $ \s0 b0 m0 kf ks ->
-    if B.length s0 >= n
-    then ks s0 b0 m0 s0
-    else unGet (demandInput >> ensureRec n) s0 b0 m0 kf ks
+ensure :: Int -> Get B.ByteString
+ensure n0 = n0 `seq` Get $ \ s0 b0 m0 kf ks -> let
+    n' = n0 - B.length s0
+    in if n' <= 0
+        then ks s0 b0 m0 s0
+        else getMore n' s0 [] b0 m0 kf ks
+    where
+        -- The "accumulate and concat" pattern here is important not to incur
+        -- in quadratic behavior, see 
<https://github.com/GaloisInc/cereal/issues/48>
+
+        finalInput s0 ss = B.concat (reverse (s0 : ss))
+        finalBuffer b0 s0 ss = extendBuffer b0 (B.concat (reverse (init (s0 : 
ss))))
+
+        getMore !n s0 ss b0 m0 kf ks = let
+            tooFewBytes = let
+                !s = finalInput s0 ss
+                !b = finalBuffer b0 s0 ss
+                in kf s b m0 ["demandInput"] "too few bytes"
+            in case m0 of
+                Complete -> tooFewBytes
+                Incomplete mb -> Partial $ \s ->
+                    if B.null s
+                        then tooFewBytes
+                        else let
+                            !mb' = case mb of
+                                Just l -> Just $! l - B.length s
+                                Nothing -> Nothing
+                            in checkIfEnough n s (s0 : ss) b0 (Incomplete mb') 
kf ks
+
+        checkIfEnough !n s0 ss b0 m0 kf ks = let
+            n' = n - B.length s0
+            in if n' <= 0
+                then let
+                    !s = finalInput s0 ss
+                    !b = finalBuffer b0 s0 ss
+                    in ks s b m0 s
+                else getMore n' s0 ss b0 m0 kf ks
 
 -- | Isolate an action to operating within a fixed block of bytes.  The action
 --   is required to consume all the bytes that it is isolated to.
@@ -392,23 +423,6 @@
   put rest
   return a
 
--- | Immediately demand more input via a 'Partial' continuation
---   result.
-demandInput :: Get ()
-demandInput = Get $ \s0 b0 m0 kf ks ->
-  case m0 of
-    Complete      -> kf s0 b0 m0 ["demandInput"] "too few bytes"
-    Incomplete mb -> Partial $ \s ->
-      if B.null s
-      then kf s0 b0 m0 ["demandInput"] "too few bytes"
-      else let s1 = s0 `B.append` s
-               b1 = extendBuffer b0 s
-               mb' = case mb of
-                       Just l  -> Just $! l - B.length s
-                       Nothing -> Nothing
-            in b1  `seq`
-               mb' `seq` ks s1 b1 (Incomplete mb') ()
-
 failDesc :: String -> Get a
 failDesc err = do
     let msg = "Failed reading: " ++ err
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cereal-0.5.1.0/src/Data/Serialize/IEEE754.hs 
new/cereal-0.5.2.0/src/Data/Serialize/IEEE754.hs
--- old/cereal-0.5.1.0/src/Data/Serialize/IEEE754.hs    2015-11-12 
18:53:27.000000000 +0100
+++ new/cereal-0.5.2.0/src/Data/Serialize/IEEE754.hs    2016-05-28 
01:48:29.000000000 +0200
@@ -1,14 +1,11 @@
 {-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE CPP #-}
+{-# LANGUAGE ScopedTypeVariables #-}
 
 #ifndef MIN_VERSION_base
 #define MIN_VERSION_base(x,y,z) 1
 #endif
 
-#ifndef MIN_VERSION_array
-#define MIN_VERSION_array(x,y,z) 1
-#endif
-
 -- | IEEE-754 parsing, as described in this stack-overflow article:
 --
 -- 
<http://stackoverflow.com/questions/6976684/converting-ieee-754-floating-point-in-haskell-word32-64-to-and-from-haskell-float/7002812#7002812>
@@ -29,23 +26,19 @@
 
 ) where
 
-import Control.Monad.ST ( runST, ST )
-
-import Data.Array.ST ( newArray, readArray, MArray, STUArray )
 import Data.Word ( Word32, Word64 )
 import Data.Serialize.Get
 import Data.Serialize.Put
+import qualified Data.ByteString.Builder as Builder
+import System.IO.Unsafe (unsafeDupablePerformIO)
+import Foreign.Marshal.Alloc (alloca)
+import Foreign.Storable (peek, poke)
+import Foreign.Ptr (castPtr, Ptr)
 
 #if !(MIN_VERSION_base(4,8,0))
 import Control.Applicative ( (<$>) )
 #endif
 
-#if MIN_VERSION_array(0,4,0)
-import Data.Array.Unsafe (castSTUArray)
-#else
-import Data.Array.ST (castSTUArray)
-#endif
-
 -- | Read a Float in little endian IEEE-754 format
 getFloat32le :: Get Float
 getFloat32le = wordToFloat <$> getWord32le
@@ -64,38 +57,28 @@
 
 -- | Write a Float in little endian IEEE-754 format
 putFloat32le :: Float -> Put
-putFloat32le = putWord32le . floatToWord
+putFloat32le = putBuilder . Builder.floatLE
 
 -- | Write a Float in big endian IEEE-754 format
 putFloat32be :: Float -> Put
-putFloat32be = putWord32be . floatToWord
+putFloat32be = putBuilder . Builder.floatBE
 
 -- | Write a Double in little endian IEEE-754 format
 putFloat64le :: Double -> Put
-putFloat64le = putWord64le . doubleToWord
+putFloat64le = putBuilder . Builder.doubleLE
 
 -- | Write a Double in big endian IEEE-754 format
 putFloat64be :: Double -> Put
-putFloat64be = putWord64be . doubleToWord
+putFloat64be = putBuilder . Builder.doubleBE
 
 {-# INLINE wordToFloat #-}
 wordToFloat :: Word32 -> Float
-wordToFloat x = runST (cast x)
-
-{-# INLINE floatToWord #-}
-floatToWord :: Float -> Word32
-floatToWord x = runST (cast x)
+wordToFloat w = unsafeDupablePerformIO $ alloca $ \(ptr :: Ptr Word32) -> do
+    poke ptr w
+    peek (castPtr ptr)
 
 {-# INLINE wordToDouble #-}
 wordToDouble :: Word64 -> Double
-wordToDouble x = runST (cast x)
-
-{-# INLINE doubleToWord #-}
-doubleToWord :: Double -> Word64
-doubleToWord x = runST (cast x)
-
-{-# INLINE cast #-}
-cast :: (MArray (STUArray s) a (ST s),
-         MArray (STUArray s) b (ST s)) =>
-        a -> ST s b
-cast x = newArray (0 :: Int, 0) x >>= castSTUArray >>= flip readArray 0
+wordToDouble w = unsafeDupablePerformIO $ alloca $ \(ptr :: Ptr Word64) -> do
+    poke ptr w
+    peek (castPtr ptr)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cereal-0.5.1.0/src/Data/Serialize/Put.hs 
new/cereal-0.5.2.0/src/Data/Serialize/Put.hs
--- old/cereal-0.5.1.0/src/Data/Serialize/Put.hs        2015-11-12 
18:53:27.000000000 +0100
+++ new/cereal-0.5.2.0/src/Data/Serialize/Put.hs        2016-05-28 
01:48:29.000000000 +0200
@@ -138,7 +138,7 @@
 
 
 instance A.Applicative PutM where
-        pure    = return
+        pure a = Put (PairS a M.mempty)
         {-# INLINE pure #-}
 
         m <*> k = Put $
@@ -147,9 +147,15 @@
             in PairS (f x) (w `M.mappend` w')
         {-# INLINE (<*>) #-}
 
+        m *> k  = Put $
+            let PairS _ w  = unPut m
+                PairS b w' = unPut k
+            in PairS b (w `M.mappend` w')
+        {-# INLINE (*>) #-}
+
 
 instance Monad PutM where
-    return a = Put (PairS a M.mempty)
+    return = pure
     {-# INLINE return #-}
 
     m >>= k  = Put $
@@ -158,10 +164,7 @@
         in PairS b (w `M.mappend` w')
     {-# INLINE (>>=) #-}
 
-    m >> k  = Put $
-        let PairS _ w  = unPut m
-            PairS b w' = unPut k
-        in PairS b (w `M.mappend` w')
+    (>>) = (*>)
     {-# INLINE (>>) #-}
 
 tell :: Putter Builder
@@ -326,7 +329,7 @@
     go (T.Node x cs) = execPut (pa x) `M.mappend` encodeListOf go cs
 {-# INLINE putTreeOf #-}
 
-putMapOf :: Ord k => Putter k -> Putter a -> Putter (Map.Map k a)
+putMapOf :: Putter k -> Putter a -> Putter (Map.Map k a)
 putMapOf pk pa = putListOf (putTwoOf pk pa) . Map.toAscList
 {-# INLINE putMapOf #-}
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cereal-0.5.1.0/src/Data/Serialize.hs 
new/cereal-0.5.2.0/src/Data/Serialize.hs
--- old/cereal-0.5.1.0/src/Data/Serialize.hs    2015-11-12 18:53:27.000000000 
+0100
+++ new/cereal-0.5.2.0/src/Data/Serialize.hs    2016-05-28 01:48:29.000000000 
+0200
@@ -1,14 +1,11 @@
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE FlexibleContexts  #-}
 {-# LANGUAGE CPP #-}
-
-#ifdef GENERICS
 {-# LANGUAGE DefaultSignatures
            , TypeOperators
            , BangPatterns
            , KindSignatures
            , ScopedTypeVariables #-}
-#endif
 
 #ifndef MIN_VERSION_base
 #define MIN_VERSION_base(x,y,z) 1
@@ -41,6 +38,10 @@
     , module Data.Serialize.Get
     , module Data.Serialize.Put
     , module Data.Serialize.IEEE754
+
+    -- * Generic deriving
+    , GSerializePut(..)
+    , GSerializeGet(..)
     ) where
 
 import Data.Serialize.Put
@@ -67,9 +68,7 @@
 import qualified Data.Tree            as T
 import qualified Data.Sequence        as Seq
 
-#ifdef GENERICS
 import GHC.Generics
-#endif
 
 #if !(MIN_VERSION_base(4,8,0))
 import Control.Applicative ((*>),(<*>),(<$>),pure)
@@ -95,13 +94,11 @@
     -- | Decode a value in the Get monad
     get :: Get t
 
-#ifdef GENERICS
-    default put :: (Generic t, GSerialize (Rep t)) => Putter t
+    default put :: (Generic t, GSerializePut (Rep t)) => Putter t
     put = gPut . from
 
-    default get :: (Generic t, GSerialize (Rep t)) => Get t
+    default get :: (Generic t, GSerializeGet (Rep t)) => Get t
     get = to <$> gGet
-#endif
 
 ------------------------------------------------------------------------
 -- Wrappers to run the underlying monad
@@ -143,15 +140,39 @@
     put ()  = return ()
     get     = return ()
 
+{-# INLINE boolToWord8 #-}
+boolToWord8 :: Bool -> Word8
+boolToWord8 False = 0
+boolToWord8 True = 1
+
+{-# INLINE boolFromWord8 #-}
+boolFromWord8 :: Word8 -> Get Bool
+boolFromWord8 0 = return False
+boolFromWord8 1 = return True
+boolFromWord8 w = fail ("Invalid Bool encoding " ++ show w)
+
+{-# INLINE orderingToWord8 #-}
+orderingToWord8 :: Ordering -> Word8
+orderingToWord8 LT = 0
+orderingToWord8 EQ = 1
+orderingToWord8 GT = 2
+
+{-# INLINE orderingFromWord8 #-}
+orderingFromWord8 :: Word8 -> Get Ordering
+orderingFromWord8 0 = return LT
+orderingFromWord8 1 = return EQ
+orderingFromWord8 2 = return GT
+orderingFromWord8 w = fail ("Invalid Ordering encoding " ++ show w)
+
 -- Bools are encoded as a byte in the range 0 .. 1
 instance Serialize Bool where
-    put     = putWord8 . fromIntegral . fromEnum
-    get     = liftM (toEnum . fromIntegral) getWord8
+    put     = putWord8 . boolToWord8
+    get     = boolFromWord8 =<< getWord8
 
 -- Values of type 'Ordering' are encoded as a byte in the range 0 .. 2
 instance Serialize Ordering where
-    put     = putWord8 . fromIntegral . fromEnum
-    get     = liftM (toEnum . fromIntegral) getWord8
+    put     = putWord8 . orderingToWord8
+    get     = orderingFromWord8 =<< getWord8
 
 ------------------------------------------------------------------------
 -- Words and Ints
@@ -249,13 +270,13 @@
 --
 -- Fold and unfold an Integer to and from a list of its bytes
 --
-unroll :: (Integral a, Num a, Bits a) => a -> [Word8]
+unroll :: (Integral a, Bits a) => a -> [Word8]
 unroll = unfoldr step
   where
     step 0 = Nothing
     step i = Just (fromIntegral i, i `shiftR` 8)
 
-roll :: (Integral a, Num a, Bits a) => [Word8] -> a
+roll :: (Integral a, Bits a) => [Word8] -> a
 roll   = foldr unstep 0
   where
     unstep b a = a `shiftL` 8 .|. fromIntegral b
@@ -523,39 +544,48 @@
     put = putIArrayOf put put
     get = getIArrayOf get get
 
-#ifdef GENERICS
 ------------------------------------------------------------------------
 -- Generic Serialze
 
-class GSerialize f where
+class GSerializePut f where
     gPut :: Putter (f a)
+
+class GSerializeGet f where
     gGet :: Get (f a)
 
-instance GSerialize a => GSerialize (M1 i c a) where
+instance GSerializePut a => GSerializePut (M1 i c a) where
     gPut = gPut . unM1
-    gGet = M1 <$> gGet
     {-# INLINE gPut #-}
+
+instance GSerializeGet a => GSerializeGet (M1 i c a) where
+    gGet = M1 <$> gGet
     {-# INLINE gGet #-}
 
-instance Serialize a => GSerialize (K1 i a) where
+instance Serialize a => GSerializePut (K1 i a) where
     gPut = put . unK1
-    gGet = K1 <$> get
     {-# INLINE gPut #-}
+
+instance Serialize a => GSerializeGet (K1 i a) where
+    gGet = K1 <$> get
     {-# INLINE gGet #-}
 
-instance GSerialize U1 where
+instance GSerializePut U1 where
     gPut _ = pure ()
-    gGet   = pure U1
     {-# INLINE gPut #-}
+
+instance GSerializeGet U1 where
+    gGet   = pure U1
     {-# INLINE gGet #-}
 
-instance (GSerialize a, GSerialize b) => GSerialize (a :*: b) where
+instance (GSerializePut a, GSerializePut b) => GSerializePut (a :*: b) where
     gPut (a :*: b) = gPut a *> gPut b
-    gGet = (:*:) <$> gGet  <*> gGet
     {-# INLINE gPut #-}
+
+instance (GSerializeGet a, GSerializeGet b) => GSerializeGet (a :*: b) where
+    gGet = (:*:) <$> gGet  <*> gGet
     {-# INLINE gGet #-}
 
--- The following GSerialize instance for sums has support for serializing types
+-- The following GSerialize* instance for sums has support for serializing 
types
 -- with up to 2^64-1 constructors. It will use the minimal number of bytes
 -- needed to encode the constructor. For example when a type has 2^8
 -- constructors or less it will use a single byte to encode the constructor. If
@@ -565,20 +595,20 @@
 #define PUTSUM(WORD) GUARD(WORD) = putSum (0 :: WORD) (fromIntegral size)
 #define GETSUM(WORD) GUARD(WORD) = (get :: Get WORD) >>= checkGetSum 
(fromIntegral size)
 
-instance ( PutSum     a, PutSum     b
-         , GetSum     a, GetSum     b
-         , GSerialize a, GSerialize b
-         , SumSize    a, SumSize    b) => GSerialize (a :+: b) where
+instance ( PutSum        a, PutSum        b
+         , SumSize       a, SumSize       b) => GSerializePut (a :+: b) where
     gPut | PUTSUM(Word8) | PUTSUM(Word16) | PUTSUM(Word32) | PUTSUM(Word64)
          | otherwise = sizeError "encode" size
       where
         size = unTagged (sumSize :: Tagged (a :+: b) Word64)
+    {-# INLINE gPut #-}
 
+instance ( GetSum        a, GetSum        b
+         , SumSize       a, SumSize       b) => GSerializeGet (a :+: b) where
     gGet | GETSUM(Word8) | GETSUM(Word16) | GETSUM(Word32) | GETSUM(Word64)
          | otherwise = sizeError "decode" size
       where
         size = unTagged (sumSize :: Tagged (a :+: b) Word64)
-    {-# INLINE gPut #-}
     {-# INLINE gGet #-}
 
 sizeError :: Show size => String -> size -> error
@@ -589,7 +619,7 @@
 class PutSum f where
     putSum :: (Num word, Bits word, Serialize word) => word -> word -> Putter 
(f a)
 
-instance (PutSum a, PutSum b, GSerialize a, GSerialize b) => PutSum (a :+: b) 
where
+instance (PutSum a, PutSum b) => PutSum (a :+: b) where
     putSum !code !size s = case s of
                              L1 x -> putSum code           sizeL x
                              R1 x -> putSum (code + sizeL) sizeR x
@@ -602,7 +632,7 @@
           sizeR = size - sizeL
     {-# INLINE putSum #-}
 
-instance GSerialize a => PutSum (C1 c a) where
+instance GSerializePut a => PutSum (C1 c a) where
     putSum !code _ x = put code *> gPut x
     {-# INLINE putSum #-}
 
@@ -617,7 +647,7 @@
 class GetSum f where
     getSum :: (Ord word, Num word, Bits word) => word -> word -> Get (f a)
 
-instance (GetSum a, GetSum b, GSerialize a, GSerialize b) => GetSum (a :+: b) 
where
+instance (GetSum a, GetSum b) => GetSum (a :+: b) where
     getSum !code !size | code < sizeL = L1 <$> getSum code           sizeL
                        | otherwise    = R1 <$> getSum (code - sizeL) sizeR
         where
@@ -629,7 +659,7 @@
           sizeR = size - sizeL
     {-# INLINE getSum #-}
 
-instance GSerialize a => GetSum (C1 c a) where
+instance GSerializeGet a => GetSum (C1 c a) where
     getSum _ _ = gGet
     {-# INLINE getSum #-}
 
@@ -646,4 +676,3 @@
 
 instance SumSize (C1 c a) where
     sumSize = Tagged 1
-#endif


Reply via email to