cereal-plus 0.1.0 → 0.2.0
raw patch · 2 files changed
+87/−87 lines, 2 files
Files
- cereal-plus.cabal +1/−1
- src/CerealPlus/Serializable.hs +86/−86
cereal-plus.cabal view
@@ -1,7 +1,7 @@ name: cereal-plus version:- 0.1.0+ 0.2.0 synopsis: Extended serialization library on top of "cereal". description:
src/CerealPlus/Serializable.hs view
@@ -36,7 +36,7 @@ -- meaning that this can be used to provide serialization support for mutable data. -- -- To use it in a pure context, refer to 'Identity' monad.-class Serializable a m where+class Serializable m a where serialize :: (Monad m, Applicative m) => a -> Serialize m () deserialize :: (Monad m, Applicative m) => Deserialize m a @@ -65,7 +65,7 @@ serializeRep = serializeRep . Generics.unM1 deserializeRep = Generics.M1 <$> deserializeRep -instance (Serializable a m) => SerializableRep (Generics.K1 i a) m where+instance (Serializable m a) => SerializableRep (Generics.K1 i a) m where serializeRep = serialize . Generics.unK1 deserializeRep = Generics.K1 <$> deserialize @@ -84,64 +84,64 @@ -- Manual instances: -instance (HasResolution a, Fractional (Fixed a)) => Serializable (Fixed a) m where+instance (HasResolution a, Fractional (Fixed a)) => Serializable m (Fixed a) where serialize = serialize . toRational deserialize = fromRational <$> deserialize -- 'text' instances: -instance Serializable Text m where+instance Serializable m Text where serialize = serialize . Text.encodeUtf8 deserialize = Text.decodeUtf8 <$> deserialize -instance Serializable LazyText m where+instance Serializable m LazyText where serialize = serialize . LazyText.encodeUtf8 deserialize = LazyText.decodeUtf8 <$> deserialize -- 'time' instances: -instance Serializable Day m where+instance Serializable m Day where serialize = serialize . Time.toModifiedJulianDay deserialize = Time.ModifiedJulianDay <$> deserialize -instance Serializable DiffTime m where+instance Serializable m DiffTime where serialize = serialize . toRational deserialize = fromRational <$> deserialize -instance Serializable UniversalTime m where+instance Serializable m UniversalTime where serialize = serialize . Time.getModJulianDate deserialize = Time.ModJulianDate <$> deserialize -instance Serializable UTCTime m where+instance Serializable m UTCTime where serialize a = serialize (Time.utctDay a) *> serialize (Time.utctDayTime a) deserialize = Time.UTCTime <$> deserialize <*> deserialize -instance Serializable NominalDiffTime m where+instance Serializable m NominalDiffTime where serialize = serialize . toRational deserialize = fromRational <$> deserialize -instance Serializable TimeOfDay m where+instance Serializable m TimeOfDay where serialize a = serialize (Time.todHour a) *> serialize (Time.todMin a) *> serialize (Time.todSec a) deserialize = Time.TimeOfDay <$> deserialize <*> deserialize <*> deserialize -instance Serializable TimeZone m where+instance Serializable m TimeZone where serialize a = serialize (Time.timeZoneMinutes a) *> serialize (Time.timeZoneSummerOnly a) *> serialize (Time.timeZoneName a) deserialize = Time.TimeZone <$> deserialize <*> deserialize <*> deserialize -instance Serializable LocalTime m where+instance Serializable m LocalTime where serialize a = serialize (Time.localDay a) *> serialize (Time.localTimeOfDay a) deserialize = Time.LocalTime <$> deserialize <*> deserialize -instance Serializable ZonedTime m where+instance Serializable m ZonedTime where serialize a = serialize (Time.zonedTimeToLocalTime a) *> serialize (Time.zonedTimeZone a) deserialize = Time.ZonedTime <$> deserialize <*> deserialize -instance Serializable AbsoluteTime m where+instance Serializable m AbsoluteTime where serialize a = serialize $ Time.diffAbsoluteTime a Time.taiEpoch deserialize = toAbsoluteTime <$> deserialize where@@ -150,26 +150,26 @@ -- 'cereal' primitive instances wrappers: -instance Serializable Bool m where serialize = put; deserialize = get-instance Serializable Char m where serialize = put; deserialize = get-instance Serializable Double m where serialize = put; deserialize = get-instance Serializable Float m where serialize = put; deserialize = get-instance Serializable Int m where serialize = put; deserialize = get-instance Serializable Int8 m where serialize = put; deserialize = get-instance Serializable Int16 m where serialize = put; deserialize = get-instance Serializable Int32 m where serialize = put; deserialize = get-instance Serializable Int64 m where serialize = put; deserialize = get-instance Serializable Integer m where serialize = put; deserialize = get-instance Serializable Ordering m where serialize = put; deserialize = get-instance Serializable Word m where serialize = put; deserialize = get-instance Serializable Word8 m where serialize = put; deserialize = get-instance Serializable Word16 m where serialize = put; deserialize = get-instance Serializable Word32 m where serialize = put; deserialize = get-instance Serializable Word64 m where serialize = put; deserialize = get-instance Serializable () m where serialize = put; deserialize = get-instance Serializable ByteString m where serialize = put; deserialize = get-instance Serializable LazyByteString m where serialize = put; deserialize = get-instance Serializable IntSet m where serialize = put; deserialize = get+instance Serializable m Bool where serialize = put; deserialize = get+instance Serializable m Char where serialize = put; deserialize = get+instance Serializable m Double where serialize = put; deserialize = get+instance Serializable m Float where serialize = put; deserialize = get+instance Serializable m Int where serialize = put; deserialize = get+instance Serializable m Int8 where serialize = put; deserialize = get+instance Serializable m Int16 where serialize = put; deserialize = get+instance Serializable m Int32 where serialize = put; deserialize = get+instance Serializable m Int64 where serialize = put; deserialize = get+instance Serializable m Integer where serialize = put; deserialize = get+instance Serializable m Ordering where serialize = put; deserialize = get+instance Serializable m Word where serialize = put; deserialize = get+instance Serializable m Word8 where serialize = put; deserialize = get+instance Serializable m Word16 where serialize = put; deserialize = get+instance Serializable m Word32 where serialize = put; deserialize = get+instance Serializable m Word64 where serialize = put; deserialize = get+instance Serializable m () where serialize = put; deserialize = get+instance Serializable m ByteString where serialize = put; deserialize = get+instance Serializable m LazyByteString where serialize = put; deserialize = get+instance Serializable m IntSet where serialize = put; deserialize = get put :: (Monad m, Applicative m, Cereal.Serialize a) => a -> Serialize m () put = Serialize.liftPut . Cereal.put@@ -180,46 +180,46 @@ -- Monoid wrappers instances: -instance (Serializable a m) => Serializable (Dual a) m where+instance (Serializable m a) => Serializable m (Dual a) where serialize = serialize . \case Dual a -> a deserialize = Dual <$> deserialize -instance Serializable All m where+instance Serializable m All where serialize = serialize . \case All a -> a deserialize = All <$> deserialize -instance Serializable Any m where+instance Serializable m Any where serialize = serialize . \case Any a -> a deserialize = Any <$> deserialize -instance (Serializable a m) => Serializable (Sum a) m where+instance (Serializable m a) => Serializable m (Sum a) where serialize = serialize . \case Sum a -> a deserialize = Sum <$> deserialize -instance (Serializable a m) => Serializable (Product a) m where+instance (Serializable m a) => Serializable m (Product a) where serialize = serialize . \case Product a -> a deserialize = Product <$> deserialize -instance (Serializable a m) => Serializable (First a) m where+instance (Serializable m a) => Serializable m (First a) where serialize = serialize . \case First a -> a deserialize = First <$> deserialize -instance (Serializable a m) => Serializable (Last a) m where+instance (Serializable m a) => Serializable m (Last a) where serialize = serialize . \case Last a -> a deserialize = Last <$> deserialize -- Composite instances: -instance (Serializable a m, Integral a) => Serializable (Ratio a) m where+instance (Serializable m a, Integral a) => Serializable m (Ratio a) where serialize a = serialize (numerator a) *> serialize (denominator a) deserialize = (%) <$> deserialize <*> deserialize -instance (Serializable a m) => Serializable (Tree a) m where+instance (Serializable m a) => Serializable m (Tree a) where serialize (Data.Tree.Node root sub) = serialize root *> serialize sub deserialize = Data.Tree.Node <$> deserialize <*> deserialize -instance (Serializable a m, Serializable b m) => Serializable (Either a b) m where+instance (Serializable m a, Serializable m b) => Serializable m (Either a b) where serialize = \case Right a -> serialize True *> serialize a Left a -> serialize False *> serialize a@@ -228,7 +228,7 @@ True -> Right <$> deserialize False -> Left <$> deserialize -instance (Serializable a m) => Serializable (Maybe a) m where+instance (Serializable m a) => Serializable m (Maybe a) where serialize = \case Just a -> serialize True >> serialize a Nothing -> serialize False@@ -238,7 +238,7 @@ then deserialize >>= return . Just else return Nothing -instance (Serializable a m) => Serializable [a] m where+instance (Serializable m a) => Serializable m [a] where serialize l = do serialize (length l) mapM_ serialize l@@ -246,103 +246,103 @@ n <- deserialize replicateM n deserialize -instance (Serializable a m) => Serializable (Seq a) m where+instance (Serializable m a) => Serializable m (Seq a) where serialize = serialize . toList deserialize = Data.Sequence.fromList <$> deserialize -- Tuple instances: -instance (Serializable a m) => Serializable (Identity a) m where+instance (Serializable m a) => Serializable m (Identity a) where serialize = serialize . \case Identity a -> a deserialize = Identity <$> deserialize -instance (Serializable a m, Serializable b m) => Serializable (a, b) m where+instance (Serializable m a, Serializable m b) => Serializable m (a, b) where serialize (a, b) = serialize a *> serialize b deserialize = (,) <$> deserialize <*> deserialize -instance (Serializable a m, Serializable b m, Serializable c m) => Serializable (a, b, c) m where+instance (Serializable m a, Serializable m b, Serializable m c) => Serializable m (a, b, c) where serialize (a, b, c) = serialize a *> serialize b *> serialize c deserialize = (,,) <$> deserialize <*> deserialize <*> deserialize -instance (Serializable a m, Serializable b m, Serializable c m, Serializable d m) => Serializable (a, b, c, d) m where+instance (Serializable m a, Serializable m b, Serializable m c, Serializable m d) => Serializable m (a, b, c, d) where serialize (a, b, c, d) = serialize a *> serialize b *> serialize c *> serialize d deserialize = (,,,) <$> deserialize <*> deserialize <*> deserialize <*> deserialize -instance (Serializable a m, Serializable b m, Serializable c m, Serializable d m, Serializable e m) => Serializable (a, b, c, d, e) m where+instance (Serializable m a, Serializable m b, Serializable m c, Serializable m d, Serializable m e) => Serializable m (a, b, c, d, e) where serialize (a, b, c, d, e) = serialize a *> serialize b *> serialize c *> serialize d *> serialize e deserialize = (,,,,) <$> deserialize <*> deserialize <*> deserialize <*> deserialize <*> deserialize -- 'containers' instances: -instance (Serializable a m, Ord a) => Serializable (Set a) m where+instance (Serializable m a, Ord a) => Serializable m (Set a) where serialize = serialize . Data.Set.toAscList deserialize = Data.Set.fromDistinctAscList <$> deserialize -instance (Serializable a m) => Serializable (IntMap a) m where+instance (Serializable m a) => Serializable m (IntMap a) where serialize = serialize . Data.IntMap.toAscList deserialize = Data.IntMap.fromDistinctAscList <$> deserialize -instance (Serializable a m, Serializable b m, Ord a) => Serializable (Map a b) m where+instance (Serializable m a, Serializable m b, Ord a) => Serializable m (Map a b) where serialize = serialize . Data.Map.toAscList deserialize = Data.Map.fromDistinctAscList <$> deserialize -- 'unordered-containers' instances: -instance (Serializable a m, Serializable b m, Hashable a, Eq a) => Serializable (HashMap a b) m where+instance (Serializable m a, Serializable m b, Hashable a, Eq a) => Serializable m (HashMap a b) where serialize = serialize . Data.HashMap.Lazy.toList deserialize = Data.HashMap.Lazy.fromList <$> deserialize -instance (Serializable a m, Hashable a, Eq a) => Serializable (HashSet a) m where+instance (Serializable m a, Hashable a, Eq a) => Serializable m (HashSet a) where serialize = serialize . Data.HashSet.toList deserialize = Data.HashSet.fromList <$> deserialize -- 'array' instances: -instance (Serializable e m, Serializable i m, Ix i) => Serializable (Array i e) m where+instance (Serializable m e, Serializable m i, Ix i) => Serializable m (Array i e) where serialize = serializeArray deserialize = deserializeArray -instance (Serializable e m, Serializable i m, IArray UArray e, Ix i) => Serializable (UArray i e) m where+instance (Serializable m e, Serializable m i, IArray UArray e, Ix i) => Serializable m (UArray i e) where serialize = serializeArray deserialize = deserializeArray -serializeArray :: (Monad m, Applicative m, Ix i, Serializable e m, Serializable i m, IArray a e) => a i e -> Serialize m ()+serializeArray :: (Monad m, Applicative m, Ix i, Serializable m e, Serializable m i, IArray a e) => a i e -> Serialize m () serializeArray a = do serialize $ Data.Array.IArray.bounds a serialize $ Data.Array.IArray.elems a -deserializeArray :: (Monad m, Applicative m, Ix i, Serializable e m, Serializable i m, IArray a e) => Deserialize m (a i e)+deserializeArray :: (Monad m, Applicative m, Ix i, Serializable m e, Serializable m i, IArray a e) => Deserialize m (a i e) deserializeArray = Data.Array.IArray.listArray <$> deserialize <*> deserialize -- 'vector' instances: -instance (Serializable a m) => Serializable (Vector a) m where+instance (Serializable m a) => Serializable m (Vector a) where serialize = serializeVector deserialize = deserializeVector -instance (Serializable a m, Data.Vector.Primitive.Prim a) => Serializable (PVector a) m where+instance (Serializable m a, Data.Vector.Primitive.Prim a) => Serializable m (PVector a) where serialize = serializeVector deserialize = deserializeVector -instance (Serializable a m, Data.Vector.Storable.Storable a) => Serializable (SVector a) m where+instance (Serializable m a, Data.Vector.Storable.Storable a) => Serializable m (SVector a) where serialize = serializeVector deserialize = deserializeVector -instance (Serializable a m, Data.Vector.Unboxed.Unbox a) => Serializable (UVector a) m where+instance (Serializable m a, Data.Vector.Unboxed.Unbox a) => Serializable m (UVector a) where serialize = serializeVector deserialize = deserializeVector -serializeVector :: (Monad m, Applicative m, Data.Vector.Generic.Vector v a, Serializable a m) => v a -> Serialize m ()+serializeVector :: (Monad m, Applicative m, Data.Vector.Generic.Vector v a, Serializable m a) => v a -> Serialize m () serializeVector a = do serialize (Data.Vector.Generic.length a) Data.Vector.Generic.mapM_ serialize a -deserializeVector :: (Monad m, Applicative m, Data.Vector.Generic.Vector v a, Serializable a m) => Deserialize m (v a)+deserializeVector :: (Monad m, Applicative m, Data.Vector.Generic.Vector v a, Serializable m a) => Deserialize m (v a) deserializeVector = do length <- deserialize Data.Vector.Generic.replicateM length deserialize@@ -350,23 +350,23 @@ -- 'hashtables' instances: -instance ( Serializable a (ST s), Serializable b (ST s), Hashable a, Eq a ) => - Serializable (Hashtables_Basic.HashTable s a b) (ST s) where+instance ( Serializable (ST s) a, Serializable (ST s) b, Hashable a, Eq a ) => + Serializable (ST s) (Hashtables_Basic.HashTable s a b) where serialize = serializeHashTableST deserialize = deserializeHashTableST -instance ( Serializable a (ST s), Serializable b (ST s), Hashable a, Eq a ) => - Serializable (Hashtables_Cuckoo.HashTable s a b) (ST s) where+instance ( Serializable (ST s) a, Serializable (ST s) b, Hashable a, Eq a ) => + Serializable (ST s) (Hashtables_Cuckoo.HashTable s a b) where serialize = serializeHashTableST deserialize = deserializeHashTableST -instance ( Serializable a (ST s), Serializable b (ST s), Hashable a, Eq a ) => - Serializable (Hashtables_Linear.HashTable s a b) (ST s) where+instance ( Serializable (ST s) a, Serializable (ST s) b, Hashable a, Eq a ) => + Serializable (ST s) (Hashtables_Linear.HashTable s a b) where serialize = serializeHashTableST deserialize = deserializeHashTableST serializeHashTableST :: - (Hashtables_Class.HashTable t, Serializable a (ST s), Serializable b (ST s)) => + (Hashtables_Class.HashTable t, Serializable (ST s) a, Serializable (ST s) b) => t s a b -> Serialize (ST s) () serializeHashTableST t = do join $ lift $ Hashtables_Class.foldM (\a b -> return $ a >> processRow b) (return ()) t@@ -380,7 +380,7 @@ signalEnd = serialize False deserializeHashTableST :: - (Hashtables_Class.HashTable t, Serializable a (ST s), Serializable b (ST s), Hashable a, Eq a) => + (Hashtables_Class.HashTable t, Serializable (ST s) a, Serializable (ST s) b, Hashable a, Eq a) => Deserialize (ST s) (t s a b) deserializeHashTableST = do t <- lift $ Hashtables_Class.new@@ -395,40 +395,40 @@ True -> action >> loop action deserializeRow = (,) <$> deserialize <*> deserialize -instance ( Serializable a (ST RealWorld), Serializable b (ST RealWorld), Hashable a, Eq a ) => - Serializable (Hashtables_Basic.HashTable RealWorld a b) IO where+instance ( Serializable (ST RealWorld) a, Serializable (ST RealWorld) b, Hashable a, Eq a ) => + Serializable IO (Hashtables_Basic.HashTable RealWorld a b) where serialize = Serialize.mapBase stToIO . serializeHashTableST deserialize = Deserialize.mapBase stToIO deserializeHashTableST -instance ( Serializable a (ST RealWorld), Serializable b (ST RealWorld), Hashable a, Eq a ) => - Serializable (Hashtables_Cuckoo.HashTable RealWorld a b) IO where+instance ( Serializable (ST RealWorld) a, Serializable (ST RealWorld) b, Hashable a, Eq a ) => + Serializable IO (Hashtables_Cuckoo.HashTable RealWorld a b) where serialize = Serialize.mapBase stToIO . serializeHashTableST deserialize = Deserialize.mapBase stToIO deserializeHashTableST -instance ( Serializable a (ST RealWorld), Serializable b (ST RealWorld), Hashable a, Eq a ) => - Serializable (Hashtables_Linear.HashTable RealWorld a b) IO where+instance ( Serializable (ST RealWorld) a, Serializable (ST RealWorld) b, Hashable a, Eq a ) => + Serializable IO (Hashtables_Linear.HashTable RealWorld a b) where serialize = Serialize.mapBase stToIO . serializeHashTableST deserialize = Deserialize.mapBase stToIO deserializeHashTableST -- Instances for mutable types from 'base': -instance (Serializable a IO) => Serializable (IORef a) IO where+instance (Serializable IO a) => Serializable IO (IORef a) where serialize = serialize <=< lift . readIORef deserialize = lift . newIORef =<< deserialize -instance (Serializable a IO) => Serializable (MVar a) IO where+instance (Serializable IO a) => Serializable IO (MVar a) where serialize = lift . readMVar >=> serialize deserialize = deserialize >>= lift . newMVar -- Instances for 'stm': -instance (Serializable a STM) => Serializable (TVar a) STM where+instance (Serializable STM a) => Serializable STM (TVar a) where serialize = serialize <=< lift . readTVar deserialize = lift . newTVar =<< deserialize -instance (Serializable a IO) => Serializable (TVar a) IO where+instance (Serializable IO a) => Serializable IO (TVar a) where serialize = lift . atomically . readTVar >=> serialize deserialize = deserialize >>= lift . atomically . newTVar