{-# LANGUAGE CPP #-}
{-# LANGUAGE DeriveDataTypeable, FlexibleContexts, UndecidableInstances, TypeFamilies #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Data.SafeCopy.Instances where

import Data.SafeCopy.SafeCopy

#if !MIN_VERSION_base(4,8,0)
import           Control.Applicative
#endif
import           Control.Monad
import qualified Data.Array as Array
import qualified Data.Array.Unboxed as UArray
import qualified Data.Array.IArray as IArray
import qualified Data.ByteString.Lazy.Char8 as L
import qualified Data.ByteString.Char8 as B
import qualified Data.Foldable as Foldable
import           Data.Fixed (HasResolution, Fixed)
import           Data.Int
import qualified Data.IntMap as IntMap
import qualified Data.IntSet as IntSet
import           Data.Ix
import qualified Data.List.NonEmpty as NonEmpty
import qualified Data.Map as Map
import           Data.Ratio (Ratio, (%), numerator, denominator)
import qualified Data.Sequence as Sequence
import           Data.Serialize
import qualified Data.Set as Set
import qualified Data.Text as T
import qualified Data.Text.Encoding as T
import qualified Data.Text.Lazy as TL
import qualified Data.Text.Lazy.Encoding as TL
import           Data.Time.Calendar (Day(..))
import           Data.Time.Clock (DiffTime, NominalDiffTime, UniversalTime(..), UTCTime(..))
import           Data.Time.Clock.TAI (AbsoluteTime, taiEpoch, addAbsoluteTime, diffAbsoluteTime)
import           Data.Time.LocalTime (LocalTime(..), TimeOfDay(..), TimeZone(..), ZonedTime(..))
import qualified Data.Tree as Tree
import           Data.Typeable hiding (Proxy)
import           Data.Word
import           Numeric.Natural (Natural)
import           System.Time (ClockTime(..), TimeDiff(..), CalendarTime(..), Month(..))
import qualified System.Time as OT
import qualified Data.Vector as V
import qualified Data.Vector.Generic as VG
import qualified Data.Vector.Primitive as VP
import qualified Data.Vector.Storable as VS
import qualified Data.Vector.Unboxed as VU

instance SafeCopy a => SafeCopy (Prim a) where
  kind :: Kind (Prim a)
kind = Kind (Prim a)
forall a. Kind a
primitive
  getCopy :: Contained (Get (Prim a))
getCopy = Get (Prim a) -> Contained (Get (Prim a))
forall a. a -> Contained a
contain (Get (Prim a) -> Contained (Get (Prim a)))
-> Get (Prim a) -> Contained (Get (Prim a))
forall a b. (a -> b) -> a -> b
$
            do a
e <- Contained (Get a) -> Get a
forall a. Contained a -> a
unsafeUnPack Contained (Get a)
forall a. SafeCopy a => Contained (Get a)
getCopy
               Prim a -> Get (Prim a)
forall (m :: * -> *) a. Monad m => a -> m a
return (Prim a -> Get (Prim a)) -> Prim a -> Get (Prim a)
forall a b. (a -> b) -> a -> b
$ a -> Prim a
forall a. a -> Prim a
Prim a
e
  putCopy :: Prim a -> Contained Put
putCopy (Prim a
e)
    = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put) -> Put -> Contained Put
forall a b. (a -> b) -> a -> b
$ Contained Put -> Put
forall a. Contained a -> a
unsafeUnPack (a -> Contained Put
forall a. SafeCopy a => a -> Contained Put
putCopy a
e)

instance SafeCopy a => SafeCopy [a] where
  getCopy :: Contained (Get [a])
getCopy = Get [a] -> Contained (Get [a])
forall a. a -> Contained a
contain (Get [a] -> Contained (Get [a])) -> Get [a] -> Contained (Get [a])
forall a b. (a -> b) -> a -> b
$ do
    Int
n <- Get Int
forall t. Serialize t => Get t
get
    Get a
g <- Get (Get a)
forall a. SafeCopy a => Get (Get a)
getSafeGet
    Get a -> [a] -> Int -> Get [a]
forall a. Get a -> [a] -> Int -> Get [a]
go Get a
g [] Int
n
      where
        go :: Get a -> [a] -> Int -> Get [a]
        go :: Get a -> [a] -> Int -> Get [a]
go Get a
_ [a]
as Int
0 = [a] -> Get [a]
forall (m :: * -> *) a. Monad m => a -> m a
return ([a] -> [a]
forall a. [a] -> [a]
reverse [a]
as)
        go Get a
g [a]
as Int
i = do a
x <- Get a
g
                       a
x a -> Get [a] -> Get [a]
`seq` Get a -> [a] -> Int -> Get [a]
forall a. Get a -> [a] -> Int -> Get [a]
go Get a
g (a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
as) (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)
  putCopy :: [a] -> Contained Put
putCopy [a]
lst = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put) -> Put -> Contained Put
forall a b. (a -> b) -> a -> b
$ do Putter Int
forall t. Serialize t => Putter t
put ([a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
lst)
                             PutM (a -> Put)
forall a. SafeCopy a => PutM (a -> Put)
getSafePut PutM (a -> Put) -> ((a -> Put) -> Put) -> Put
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= [a] -> (a -> Put) -> Put
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [a]
lst
  errorTypeName :: Proxy [a] -> String
errorTypeName = Proxy [a] -> String
forall (c :: * -> *) a. Typeable c => Proxy (c a) -> String
typeName1

instance SafeCopy a => SafeCopy (NonEmpty.NonEmpty a) where
    getCopy :: Contained (Get (NonEmpty a))
getCopy = Get (NonEmpty a) -> Contained (Get (NonEmpty a))
forall a. a -> Contained a
contain (Get (NonEmpty a) -> Contained (Get (NonEmpty a)))
-> Get (NonEmpty a) -> Contained (Get (NonEmpty a))
forall a b. (a -> b) -> a -> b
$ ([a] -> NonEmpty a) -> Get [a] -> Get (NonEmpty a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [a] -> NonEmpty a
forall a. [a] -> NonEmpty a
NonEmpty.fromList Get [a]
forall a. SafeCopy a => Get a
safeGet
    putCopy :: NonEmpty a -> Contained Put
putCopy = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put)
-> (NonEmpty a -> Put) -> NonEmpty a -> Contained Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> Put
forall a. SafeCopy a => a -> Put
safePut ([a] -> Put) -> (NonEmpty a -> [a]) -> NonEmpty a -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NonEmpty a -> [a]
forall a. NonEmpty a -> [a]
NonEmpty.toList
    errorTypeName :: Proxy (NonEmpty a) -> String
errorTypeName = Proxy (NonEmpty a) -> String
forall (c :: * -> *) a. Typeable c => Proxy (c a) -> String
typeName1

instance SafeCopy a => SafeCopy (Maybe a) where
    getCopy :: Contained (Get (Maybe a))
getCopy = Get (Maybe a) -> Contained (Get (Maybe a))
forall a. a -> Contained a
contain (Get (Maybe a) -> Contained (Get (Maybe a)))
-> Get (Maybe a) -> Contained (Get (Maybe a))
forall a b. (a -> b) -> a -> b
$ do Bool
n <- Get Bool
forall t. Serialize t => Get t
get
                           if Bool
n then (a -> Maybe a) -> Get a -> Get (Maybe a)
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM a -> Maybe a
forall a. a -> Maybe a
Just Get a
forall a. SafeCopy a => Get a
safeGet
                                else Maybe a -> Get (Maybe a)
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe a
forall a. Maybe a
Nothing
    putCopy :: Maybe a -> Contained Put
putCopy (Just a
a) = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put) -> Put -> Contained Put
forall a b. (a -> b) -> a -> b
$ Putter Bool
forall t. Serialize t => Putter t
put Bool
True Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> a -> Put
forall a. SafeCopy a => a -> Put
safePut a
a
    putCopy Maybe a
Nothing = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put) -> Put -> Contained Put
forall a b. (a -> b) -> a -> b
$ Putter Bool
forall t. Serialize t => Putter t
put Bool
False
    errorTypeName :: Proxy (Maybe a) -> String
errorTypeName = Proxy (Maybe a) -> String
forall (c :: * -> *) a. Typeable c => Proxy (c a) -> String
typeName1

instance (SafeCopy a, Ord a) => SafeCopy (Set.Set a) where
    getCopy :: Contained (Get (Set a))
getCopy = Get (Set a) -> Contained (Get (Set a))
forall a. a -> Contained a
contain (Get (Set a) -> Contained (Get (Set a)))
-> Get (Set a) -> Contained (Get (Set a))
forall a b. (a -> b) -> a -> b
$ ([a] -> Set a) -> Get [a] -> Get (Set a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [a] -> Set a
forall a. [a] -> Set a
Set.fromDistinctAscList Get [a]
forall a. SafeCopy a => Get a
safeGet
    putCopy :: Set a -> Contained Put
putCopy = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put) -> (Set a -> Put) -> Set a -> Contained Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> Put
forall a. SafeCopy a => a -> Put
safePut ([a] -> Put) -> (Set a -> [a]) -> Set a -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Set a -> [a]
forall a. Set a -> [a]
Set.toAscList
    errorTypeName :: Proxy (Set a) -> String
errorTypeName = Proxy (Set a) -> String
forall (c :: * -> *) a. Typeable c => Proxy (c a) -> String
typeName1

instance (SafeCopy a, SafeCopy b, Ord a) => SafeCopy (Map.Map a b) where
    getCopy :: Contained (Get (Map a b))
getCopy = Get (Map a b) -> Contained (Get (Map a b))
forall a. a -> Contained a
contain (Get (Map a b) -> Contained (Get (Map a b)))
-> Get (Map a b) -> Contained (Get (Map a b))
forall a b. (a -> b) -> a -> b
$ ([(a, b)] -> Map a b) -> Get [(a, b)] -> Get (Map a b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [(a, b)] -> Map a b
forall k a. [(k, a)] -> Map k a
Map.fromDistinctAscList Get [(a, b)]
forall a. SafeCopy a => Get a
safeGet
    putCopy :: Map a b -> Contained Put
putCopy = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put)
-> (Map a b -> Put) -> Map a b -> Contained Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(a, b)] -> Put
forall a. SafeCopy a => a -> Put
safePut ([(a, b)] -> Put) -> (Map a b -> [(a, b)]) -> Map a b -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Map a b -> [(a, b)]
forall k a. Map k a -> [(k, a)]
Map.toAscList
    errorTypeName :: Proxy (Map a b) -> String
errorTypeName = Proxy (Map a b) -> String
forall (c :: * -> * -> *) a b.
Typeable c =>
Proxy (c a b) -> String
typeName2

instance (SafeCopy a) => SafeCopy (IntMap.IntMap a) where
    getCopy :: Contained (Get (IntMap a))
getCopy = Get (IntMap a) -> Contained (Get (IntMap a))
forall a. a -> Contained a
contain (Get (IntMap a) -> Contained (Get (IntMap a)))
-> Get (IntMap a) -> Contained (Get (IntMap a))
forall a b. (a -> b) -> a -> b
$ ([(Int, a)] -> IntMap a) -> Get [(Int, a)] -> Get (IntMap a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [(Int, a)] -> IntMap a
forall a. [(Int, a)] -> IntMap a
IntMap.fromDistinctAscList Get [(Int, a)]
forall a. SafeCopy a => Get a
safeGet
    putCopy :: IntMap a -> Contained Put
putCopy = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put)
-> (IntMap a -> Put) -> IntMap a -> Contained Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(Int, a)] -> Put
forall a. SafeCopy a => a -> Put
safePut ([(Int, a)] -> Put) -> (IntMap a -> [(Int, a)]) -> IntMap a -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IntMap a -> [(Int, a)]
forall a. IntMap a -> [(Int, a)]
IntMap.toAscList
    errorTypeName :: Proxy (IntMap a) -> String
errorTypeName = Proxy (IntMap a) -> String
forall (c :: * -> *) a. Typeable c => Proxy (c a) -> String
typeName1

instance SafeCopy IntSet.IntSet where
    getCopy :: Contained (Get IntSet)
getCopy = Get IntSet -> Contained (Get IntSet)
forall a. a -> Contained a
contain (Get IntSet -> Contained (Get IntSet))
-> Get IntSet -> Contained (Get IntSet)
forall a b. (a -> b) -> a -> b
$ ([Int] -> IntSet) -> Get [Int] -> Get IntSet
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [Int] -> IntSet
IntSet.fromDistinctAscList Get [Int]
forall a. SafeCopy a => Get a
safeGet
    putCopy :: IntSet -> Contained Put
putCopy = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put)
-> (IntSet -> Put) -> IntSet -> Contained Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Int] -> Put
forall a. SafeCopy a => a -> Put
safePut ([Int] -> Put) -> (IntSet -> [Int]) -> IntSet -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IntSet -> [Int]
IntSet.toAscList
    errorTypeName :: Proxy IntSet -> String
errorTypeName = Proxy IntSet -> String
forall a. Typeable a => Proxy a -> String
typeName

instance (SafeCopy a) => SafeCopy (Sequence.Seq a) where
    getCopy :: Contained (Get (Seq a))
getCopy = Get (Seq a) -> Contained (Get (Seq a))
forall a. a -> Contained a
contain (Get (Seq a) -> Contained (Get (Seq a)))
-> Get (Seq a) -> Contained (Get (Seq a))
forall a b. (a -> b) -> a -> b
$ ([a] -> Seq a) -> Get [a] -> Get (Seq a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [a] -> Seq a
forall a. [a] -> Seq a
Sequence.fromList Get [a]
forall a. SafeCopy a => Get a
safeGet
    putCopy :: Seq a -> Contained Put
putCopy = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put) -> (Seq a -> Put) -> Seq a -> Contained Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> Put
forall a. SafeCopy a => a -> Put
safePut ([a] -> Put) -> (Seq a -> [a]) -> Seq a -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Seq a -> [a]
forall (t :: * -> *) a. Foldable t => t a -> [a]
Foldable.toList
    errorTypeName :: Proxy (Seq a) -> String
errorTypeName = Proxy (Seq a) -> String
forall (c :: * -> *) a. Typeable c => Proxy (c a) -> String
typeName1

instance (SafeCopy a) => SafeCopy (Tree.Tree a) where
    getCopy :: Contained (Get (Tree a))
getCopy = Get (Tree a) -> Contained (Get (Tree a))
forall a. a -> Contained a
contain (Get (Tree a) -> Contained (Get (Tree a)))
-> Get (Tree a) -> Contained (Get (Tree a))
forall a b. (a -> b) -> a -> b
$ (a -> Forest a -> Tree a)
-> Get a -> Get (Forest a) -> Get (Tree a)
forall (m :: * -> *) a1 a2 r.
Monad m =>
(a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2 a -> Forest a -> Tree a
forall a. a -> Forest a -> Tree a
Tree.Node Get a
forall a. SafeCopy a => Get a
safeGet Get (Forest a)
forall a. SafeCopy a => Get a
safeGet
    putCopy :: Tree a -> Contained Put
putCopy (Tree.Node a
root Forest a
sub) = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put) -> Put -> Contained Put
forall a b. (a -> b) -> a -> b
$ a -> Put
forall a. SafeCopy a => a -> Put
safePut a
root Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Forest a -> Put
forall a. SafeCopy a => a -> Put
safePut Forest a
sub
    errorTypeName :: Proxy (Tree a) -> String
errorTypeName = Proxy (Tree a) -> String
forall (c :: * -> *) a. Typeable c => Proxy (c a) -> String
typeName1

iarray_getCopy :: (Ix i, SafeCopy e, SafeCopy i, IArray.IArray a e) => Contained (Get (a i e))
iarray_getCopy :: Contained (Get (a i e))
iarray_getCopy = Get (a i e) -> Contained (Get (a i e))
forall a. a -> Contained a
contain (Get (a i e) -> Contained (Get (a i e)))
-> Get (a i e) -> Contained (Get (a i e))
forall a b. (a -> b) -> a -> b
$ do Get i
getIx <- Get (Get i)
forall a. SafeCopy a => Get (Get a)
getSafeGet
                              (i -> i -> [e] -> a i e)
-> Get i -> Get i -> Get [e] -> Get (a i e)
forall (m :: * -> *) a1 a2 a3 r.
Monad m =>
(a1 -> a2 -> a3 -> r) -> m a1 -> m a2 -> m a3 -> m r
liftM3 i -> i -> [e] -> a i e
forall (a :: * -> * -> *) e i.
(IArray a e, Ix i) =>
i -> i -> [e] -> a i e
mkArray Get i
getIx Get i
getIx Get [e]
forall a. SafeCopy a => Get a
safeGet
    where
      mkArray :: i -> i -> [e] -> a i e
mkArray i
l i
h [e]
xs = (i, i) -> [e] -> a i e
forall (a :: * -> * -> *) e i.
(IArray a e, Ix i) =>
(i, i) -> [e] -> a i e
IArray.listArray (i
l, i
h) [e]
xs
{-# INLINE iarray_getCopy #-}

iarray_putCopy :: (Ix i, SafeCopy e, SafeCopy i, IArray.IArray a e) => a i e -> Contained Put
iarray_putCopy :: a i e -> Contained Put
iarray_putCopy a i e
arr = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put) -> Put -> Contained Put
forall a b. (a -> b) -> a -> b
$ do i -> Put
putIx <- PutM (i -> Put)
forall a. SafeCopy a => PutM (a -> Put)
getSafePut
                                  let (i
l,i
h) = a i e -> (i, i)
forall (a :: * -> * -> *) e i.
(IArray a e, Ix i) =>
a i e -> (i, i)
IArray.bounds a i e
arr
                                  i -> Put
putIx i
l Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> i -> Put
putIx i
h
                                  [e] -> Put
forall a. SafeCopy a => a -> Put
safePut (a i e -> [e]
forall (a :: * -> * -> *) e i. (IArray a e, Ix i) => a i e -> [e]
IArray.elems a i e
arr)
{-# INLINE iarray_putCopy #-}

instance (Ix i, SafeCopy e, SafeCopy i) => SafeCopy (Array.Array i e) where
    getCopy :: Contained (Get (Array i e))
getCopy = Contained (Get (Array i e))
forall i e (a :: * -> * -> *).
(Ix i, SafeCopy e, SafeCopy i, IArray a e) =>
Contained (Get (a i e))
iarray_getCopy
    putCopy :: Array i e -> Contained Put
putCopy = Array i e -> Contained Put
forall i e (a :: * -> * -> *).
(Ix i, SafeCopy e, SafeCopy i, IArray a e) =>
a i e -> Contained Put
iarray_putCopy
    errorTypeName :: Proxy (Array i e) -> String
errorTypeName = Proxy (Array i e) -> String
forall (c :: * -> * -> *) a b.
Typeable c =>
Proxy (c a b) -> String
typeName2

instance (IArray.IArray UArray.UArray e, Ix i, SafeCopy e, SafeCopy i) => SafeCopy (UArray.UArray i e) where
    getCopy :: Contained (Get (UArray i e))
getCopy = Contained (Get (UArray i e))
forall i e (a :: * -> * -> *).
(Ix i, SafeCopy e, SafeCopy i, IArray a e) =>
Contained (Get (a i e))
iarray_getCopy
    putCopy :: UArray i e -> Contained Put
putCopy = UArray i e -> Contained Put
forall i e (a :: * -> * -> *).
(Ix i, SafeCopy e, SafeCopy i, IArray a e) =>
a i e -> Contained Put
iarray_putCopy
    errorTypeName :: Proxy (UArray i e) -> String
errorTypeName = Proxy (UArray i e) -> String
forall (c :: * -> * -> *) a b.
Typeable c =>
Proxy (c a b) -> String
typeName2

instance (SafeCopy a, SafeCopy b) => SafeCopy (a,b) where
    getCopy :: Contained (Get (a, b))
getCopy = Get (a, b) -> Contained (Get (a, b))
forall a. a -> Contained a
contain (Get (a, b) -> Contained (Get (a, b)))
-> Get (a, b) -> Contained (Get (a, b))
forall a b. (a -> b) -> a -> b
$ (a -> b -> (a, b)) -> Get a -> Get b -> Get (a, b)
forall (m :: * -> *) a1 a2 r.
Monad m =>
(a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2 (,) Get a
forall a. SafeCopy a => Get a
safeGet Get b
forall a. SafeCopy a => Get a
safeGet
    putCopy :: (a, b) -> Contained Put
putCopy (a
a,b
b) = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put) -> Put -> Contained Put
forall a b. (a -> b) -> a -> b
$ a -> Put
forall a. SafeCopy a => a -> Put
safePut a
a Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> b -> Put
forall a. SafeCopy a => a -> Put
safePut b
b
    errorTypeName :: Proxy (a, b) -> String
errorTypeName = Proxy (a, b) -> String
forall (c :: * -> * -> *) a b.
Typeable c =>
Proxy (c a b) -> String
typeName2
instance (SafeCopy a, SafeCopy b, SafeCopy c) => SafeCopy (a,b,c) where
    getCopy :: Contained (Get (a, b, c))
getCopy = Get (a, b, c) -> Contained (Get (a, b, c))
forall a. a -> Contained a
contain (Get (a, b, c) -> Contained (Get (a, b, c)))
-> Get (a, b, c) -> Contained (Get (a, b, c))
forall a b. (a -> b) -> a -> b
$ (a -> b -> c -> (a, b, c))
-> Get a -> Get b -> Get c -> Get (a, b, c)
forall (m :: * -> *) a1 a2 a3 r.
Monad m =>
(a1 -> a2 -> a3 -> r) -> m a1 -> m a2 -> m a3 -> m r
liftM3 (,,) Get a
forall a. SafeCopy a => Get a
safeGet Get b
forall a. SafeCopy a => Get a
safeGet Get c
forall a. SafeCopy a => Get a
safeGet
    putCopy :: (a, b, c) -> Contained Put
putCopy (a
a,b
b,c
c) = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put) -> Put -> Contained Put
forall a b. (a -> b) -> a -> b
$ a -> Put
forall a. SafeCopy a => a -> Put
safePut a
a Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> b -> Put
forall a. SafeCopy a => a -> Put
safePut b
b Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> c -> Put
forall a. SafeCopy a => a -> Put
safePut c
c
instance (SafeCopy a, SafeCopy b, SafeCopy c, SafeCopy d) => SafeCopy (a,b,c,d) where
    getCopy :: Contained (Get (a, b, c, d))
getCopy = Get (a, b, c, d) -> Contained (Get (a, b, c, d))
forall a. a -> Contained a
contain (Get (a, b, c, d) -> Contained (Get (a, b, c, d)))
-> Get (a, b, c, d) -> Contained (Get (a, b, c, d))
forall a b. (a -> b) -> a -> b
$ (a -> b -> c -> d -> (a, b, c, d))
-> Get a -> Get b -> Get c -> Get d -> Get (a, b, c, d)
forall (m :: * -> *) a1 a2 a3 a4 r.
Monad m =>
(a1 -> a2 -> a3 -> a4 -> r) -> m a1 -> m a2 -> m a3 -> m a4 -> m r
liftM4 (,,,) Get a
forall a. SafeCopy a => Get a
safeGet Get b
forall a. SafeCopy a => Get a
safeGet Get c
forall a. SafeCopy a => Get a
safeGet Get d
forall a. SafeCopy a => Get a
safeGet
    putCopy :: (a, b, c, d) -> Contained Put
putCopy (a
a,b
b,c
c,d
d) = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put) -> Put -> Contained Put
forall a b. (a -> b) -> a -> b
$ a -> Put
forall a. SafeCopy a => a -> Put
safePut a
a Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> b -> Put
forall a. SafeCopy a => a -> Put
safePut b
b Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> c -> Put
forall a. SafeCopy a => a -> Put
safePut c
c Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> d -> Put
forall a. SafeCopy a => a -> Put
safePut d
d
instance (SafeCopy a, SafeCopy b, SafeCopy c, SafeCopy d, SafeCopy e) =>
         SafeCopy (a,b,c,d,e) where
    getCopy :: Contained (Get (a, b, c, d, e))
getCopy = Get (a, b, c, d, e) -> Contained (Get (a, b, c, d, e))
forall a. a -> Contained a
contain (Get (a, b, c, d, e) -> Contained (Get (a, b, c, d, e)))
-> Get (a, b, c, d, e) -> Contained (Get (a, b, c, d, e))
forall a b. (a -> b) -> a -> b
$ (a -> b -> c -> d -> e -> (a, b, c, d, e))
-> Get a -> Get b -> Get c -> Get d -> Get e -> Get (a, b, c, d, e)
forall (m :: * -> *) a1 a2 a3 a4 a5 r.
Monad m =>
(a1 -> a2 -> a3 -> a4 -> a5 -> r)
-> m a1 -> m a2 -> m a3 -> m a4 -> m a5 -> m r
liftM5 (,,,,) Get a
forall a. SafeCopy a => Get a
safeGet Get b
forall a. SafeCopy a => Get a
safeGet Get c
forall a. SafeCopy a => Get a
safeGet Get d
forall a. SafeCopy a => Get a
safeGet Get e
forall a. SafeCopy a => Get a
safeGet
    putCopy :: (a, b, c, d, e) -> Contained Put
putCopy (a
a,b
b,c
c,d
d,e
e) = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put) -> Put -> Contained Put
forall a b. (a -> b) -> a -> b
$ a -> Put
forall a. SafeCopy a => a -> Put
safePut a
a Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> b -> Put
forall a. SafeCopy a => a -> Put
safePut b
b Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> c -> Put
forall a. SafeCopy a => a -> Put
safePut c
c Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> d -> Put
forall a. SafeCopy a => a -> Put
safePut d
d Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> e -> Put
forall a. SafeCopy a => a -> Put
safePut e
e
instance (SafeCopy a, SafeCopy b, SafeCopy c, SafeCopy d, SafeCopy e, SafeCopy f) =>
         SafeCopy (a,b,c,d,e,f) where
    getCopy :: Contained (Get (a, b, c, d, e, f))
getCopy = Get (a, b, c, d, e, f) -> Contained (Get (a, b, c, d, e, f))
forall a. a -> Contained a
contain (Get (a, b, c, d, e, f) -> Contained (Get (a, b, c, d, e, f)))
-> Get (a, b, c, d, e, f) -> Contained (Get (a, b, c, d, e, f))
forall a b. (a -> b) -> a -> b
$ (,,,,,) (a -> b -> c -> d -> e -> f -> (a, b, c, d, e, f))
-> Get a -> Get (b -> c -> d -> e -> f -> (a, b, c, d, e, f))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get a
forall a. SafeCopy a => Get a
safeGet Get (b -> c -> d -> e -> f -> (a, b, c, d, e, f))
-> Get b -> Get (c -> d -> e -> f -> (a, b, c, d, e, f))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Get b
forall a. SafeCopy a => Get a
safeGet Get (c -> d -> e -> f -> (a, b, c, d, e, f))
-> Get c -> Get (d -> e -> f -> (a, b, c, d, e, f))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Get c
forall a. SafeCopy a => Get a
safeGet Get (d -> e -> f -> (a, b, c, d, e, f))
-> Get d -> Get (e -> f -> (a, b, c, d, e, f))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Get d
forall a. SafeCopy a => Get a
safeGet Get (e -> f -> (a, b, c, d, e, f))
-> Get e -> Get (f -> (a, b, c, d, e, f))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Get e
forall a. SafeCopy a => Get a
safeGet Get (f -> (a, b, c, d, e, f)) -> Get f -> Get (a, b, c, d, e, f)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Get f
forall a. SafeCopy a => Get a
safeGet
    putCopy :: (a, b, c, d, e, f) -> Contained Put
putCopy (a
a,b
b,c
c,d
d,e
e,f
f) = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put) -> Put -> Contained Put
forall a b. (a -> b) -> a -> b
$ a -> Put
forall a. SafeCopy a => a -> Put
safePut a
a Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> b -> Put
forall a. SafeCopy a => a -> Put
safePut b
b Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> c -> Put
forall a. SafeCopy a => a -> Put
safePut c
c Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> d -> Put
forall a. SafeCopy a => a -> Put
safePut d
d Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>>
                                      e -> Put
forall a. SafeCopy a => a -> Put
safePut e
e Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> f -> Put
forall a. SafeCopy a => a -> Put
safePut f
f
instance (SafeCopy a, SafeCopy b, SafeCopy c, SafeCopy d, SafeCopy e, SafeCopy f, SafeCopy g) =>
         SafeCopy (a,b,c,d,e,f,g) where
    getCopy :: Contained (Get (a, b, c, d, e, f, g))
getCopy = Get (a, b, c, d, e, f, g) -> Contained (Get (a, b, c, d, e, f, g))
forall a. a -> Contained a
contain (Get (a, b, c, d, e, f, g)
 -> Contained (Get (a, b, c, d, e, f, g)))
-> Get (a, b, c, d, e, f, g)
-> Contained (Get (a, b, c, d, e, f, g))
forall a b. (a -> b) -> a -> b
$ (,,,,,,) (a -> b -> c -> d -> e -> f -> g -> (a, b, c, d, e, f, g))
-> Get a
-> Get (b -> c -> d -> e -> f -> g -> (a, b, c, d, e, f, g))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get a
forall a. SafeCopy a => Get a
safeGet Get (b -> c -> d -> e -> f -> g -> (a, b, c, d, e, f, g))
-> Get b -> Get (c -> d -> e -> f -> g -> (a, b, c, d, e, f, g))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Get b
forall a. SafeCopy a => Get a
safeGet Get (c -> d -> e -> f -> g -> (a, b, c, d, e, f, g))
-> Get c -> Get (d -> e -> f -> g -> (a, b, c, d, e, f, g))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Get c
forall a. SafeCopy a => Get a
safeGet Get (d -> e -> f -> g -> (a, b, c, d, e, f, g))
-> Get d -> Get (e -> f -> g -> (a, b, c, d, e, f, g))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Get d
forall a. SafeCopy a => Get a
safeGet Get (e -> f -> g -> (a, b, c, d, e, f, g))
-> Get e -> Get (f -> g -> (a, b, c, d, e, f, g))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                     Get e
forall a. SafeCopy a => Get a
safeGet Get (f -> g -> (a, b, c, d, e, f, g))
-> Get f -> Get (g -> (a, b, c, d, e, f, g))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Get f
forall a. SafeCopy a => Get a
safeGet Get (g -> (a, b, c, d, e, f, g))
-> Get g -> Get (a, b, c, d, e, f, g)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Get g
forall a. SafeCopy a => Get a
safeGet
    putCopy :: (a, b, c, d, e, f, g) -> Contained Put
putCopy (a
a,b
b,c
c,d
d,e
e,f
f,g
g) = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put) -> Put -> Contained Put
forall a b. (a -> b) -> a -> b
$ a -> Put
forall a. SafeCopy a => a -> Put
safePut a
a Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> b -> Put
forall a. SafeCopy a => a -> Put
safePut b
b Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> c -> Put
forall a. SafeCopy a => a -> Put
safePut c
c Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> d -> Put
forall a. SafeCopy a => a -> Put
safePut d
d Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>>
                                        e -> Put
forall a. SafeCopy a => a -> Put
safePut e
e Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> f -> Put
forall a. SafeCopy a => a -> Put
safePut f
f Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> g -> Put
forall a. SafeCopy a => a -> Put
safePut g
g


instance SafeCopy Int where
    getCopy :: Contained (Get Int)
getCopy = Get Int -> Contained (Get Int)
forall a. a -> Contained a
contain Get Int
forall t. Serialize t => Get t
get; putCopy :: Int -> Contained Put
putCopy = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put) -> Putter Int -> Int -> Contained Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Putter Int
forall t. Serialize t => Putter t
put; errorTypeName :: Proxy Int -> String
errorTypeName = Proxy Int -> String
forall a. Typeable a => Proxy a -> String
typeName
instance SafeCopy Integer where
    getCopy :: Contained (Get Integer)
getCopy = Get Integer -> Contained (Get Integer)
forall a. a -> Contained a
contain Get Integer
forall t. Serialize t => Get t
get; putCopy :: Integer -> Contained Put
putCopy = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put)
-> (Integer -> Put) -> Integer -> Contained Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> Put
forall t. Serialize t => Putter t
put; errorTypeName :: Proxy Integer -> String
errorTypeName = Proxy Integer -> String
forall a. Typeable a => Proxy a -> String
typeName
instance SafeCopy Natural where
    getCopy :: Contained (Get Natural)
getCopy = Get Natural -> Contained (Get Natural)
forall a. a -> Contained a
contain Get Natural
forall t. Serialize t => Get t
get; putCopy :: Natural -> Contained Put
putCopy = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put)
-> (Natural -> Put) -> Natural -> Contained Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Natural -> Put
forall t. Serialize t => Putter t
put; errorTypeName :: Proxy Natural -> String
errorTypeName = Proxy Natural -> String
forall a. Typeable a => Proxy a -> String
typeName

-- | cereal changed the formats for Float/Double in 0.5.*
--
-- https://github.com/GaloisInc/cereal/commit/47d839609413e3e9d1147b99c34ae421ae36bced
-- https://github.com/GaloisInc/cereal/issues/35
newtype CerealFloat040 = CerealFloat040 { CerealFloat040 -> Float
unCerealFloat040 :: Float} deriving (Int -> CerealFloat040 -> ShowS
[CerealFloat040] -> ShowS
CerealFloat040 -> String
(Int -> CerealFloat040 -> ShowS)
-> (CerealFloat040 -> String)
-> ([CerealFloat040] -> ShowS)
-> Show CerealFloat040
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CerealFloat040] -> ShowS
$cshowList :: [CerealFloat040] -> ShowS
show :: CerealFloat040 -> String
$cshow :: CerealFloat040 -> String
showsPrec :: Int -> CerealFloat040 -> ShowS
$cshowsPrec :: Int -> CerealFloat040 -> ShowS
Show, Typeable)
instance SafeCopy CerealFloat040 where
    getCopy :: Contained (Get CerealFloat040)
getCopy = Get CerealFloat040 -> Contained (Get CerealFloat040)
forall a. a -> Contained a
contain (Float -> CerealFloat040
CerealFloat040 (Float -> CerealFloat040) -> Get Float -> Get CerealFloat040
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Integer -> Int -> Float) -> Get Integer -> Get Int -> Get Float
forall (m :: * -> *) a1 a2 r.
Monad m =>
(a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2 Integer -> Int -> Float
forall a. RealFloat a => Integer -> Int -> a
encodeFloat Get Integer
forall t. Serialize t => Get t
get Get Int
forall t. Serialize t => Get t
get)
    putCopy :: CerealFloat040 -> Contained Put
putCopy (CerealFloat040 Float
float) = Put -> Contained Put
forall a. a -> Contained a
contain (Putter (Integer, Int)
forall t. Serialize t => Putter t
put (Float -> (Integer, Int)
forall a. RealFloat a => a -> (Integer, Int)
decodeFloat Float
float))
    errorTypeName :: Proxy CerealFloat040 -> String
errorTypeName = Proxy CerealFloat040 -> String
forall a. Typeable a => Proxy a -> String
typeName

instance Migrate Float where
  type MigrateFrom Float = CerealFloat040
  migrate :: MigrateFrom Float -> Float
migrate (CerealFloat040 d) = Float
d

instance SafeCopy Float where
  version :: Version Float
version = Int32 -> Version Float
forall a. Int32 -> Version a
Version Int32
1
  kind :: Kind Float
kind = Kind Float
forall a. Migrate a => Kind a
extension
  getCopy :: Contained (Get Float)
getCopy = Get Float -> Contained (Get Float)
forall a. a -> Contained a
contain Get Float
forall t. Serialize t => Get t
get
  putCopy :: Float -> Contained Put
putCopy = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put) -> (Float -> Put) -> Float -> Contained Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Float -> Put
forall t. Serialize t => Putter t
put
  errorTypeName :: Proxy Float -> String
errorTypeName = Proxy Float -> String
forall a. Typeable a => Proxy a -> String
typeName

-- | cereal changed the formats for Float/Double in 0.5.*
--
-- https://github.com/GaloisInc/cereal/commit/47d839609413e3e9d1147b99c34ae421ae36bced
-- https://github.com/GaloisInc/cereal/issues/35
newtype CerealDouble040 = CerealDouble040 { CerealDouble040 -> Double
unCerealDouble040 :: Double} deriving (Int -> CerealDouble040 -> ShowS
[CerealDouble040] -> ShowS
CerealDouble040 -> String
(Int -> CerealDouble040 -> ShowS)
-> (CerealDouble040 -> String)
-> ([CerealDouble040] -> ShowS)
-> Show CerealDouble040
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CerealDouble040] -> ShowS
$cshowList :: [CerealDouble040] -> ShowS
show :: CerealDouble040 -> String
$cshow :: CerealDouble040 -> String
showsPrec :: Int -> CerealDouble040 -> ShowS
$cshowsPrec :: Int -> CerealDouble040 -> ShowS
Show, Typeable)
instance SafeCopy CerealDouble040 where
    getCopy :: Contained (Get CerealDouble040)
getCopy = Get CerealDouble040 -> Contained (Get CerealDouble040)
forall a. a -> Contained a
contain (Double -> CerealDouble040
CerealDouble040 (Double -> CerealDouble040) -> Get Double -> Get CerealDouble040
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Integer -> Int -> Double) -> Get Integer -> Get Int -> Get Double
forall (m :: * -> *) a1 a2 r.
Monad m =>
(a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2 Integer -> Int -> Double
forall a. RealFloat a => Integer -> Int -> a
encodeFloat Get Integer
forall t. Serialize t => Get t
get Get Int
forall t. Serialize t => Get t
get)
    putCopy :: CerealDouble040 -> Contained Put
putCopy (CerealDouble040 Double
double) = Put -> Contained Put
forall a. a -> Contained a
contain (Putter (Integer, Int)
forall t. Serialize t => Putter t
put (Double -> (Integer, Int)
forall a. RealFloat a => a -> (Integer, Int)
decodeFloat Double
double))
    errorTypeName :: Proxy CerealDouble040 -> String
errorTypeName = Proxy CerealDouble040 -> String
forall a. Typeable a => Proxy a -> String
typeName

instance Migrate Double where
  type MigrateFrom Double = CerealDouble040
  migrate :: MigrateFrom Double -> Double
migrate (CerealDouble040 d) = Double
d

instance SafeCopy Double where
  version :: Version Double
version = Int32 -> Version Double
forall a. Int32 -> Version a
Version Int32
1
  kind :: Kind Double
kind = Kind Double
forall a. Migrate a => Kind a
extension
  getCopy :: Contained (Get Double)
getCopy = Get Double -> Contained (Get Double)
forall a. a -> Contained a
contain Get Double
forall t. Serialize t => Get t
get
  putCopy :: Double -> Contained Put
putCopy = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put)
-> (Double -> Put) -> Double -> Contained Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Double -> Put
forall t. Serialize t => Putter t
put
  errorTypeName :: Proxy Double -> String
errorTypeName = Proxy Double -> String
forall a. Typeable a => Proxy a -> String
typeName


instance SafeCopy L.ByteString where
    getCopy :: Contained (Get ByteString)
getCopy = Get ByteString -> Contained (Get ByteString)
forall a. a -> Contained a
contain Get ByteString
forall t. Serialize t => Get t
get; putCopy :: ByteString -> Contained Put
putCopy = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put)
-> (ByteString -> Put) -> ByteString -> Contained Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Put
forall t. Serialize t => Putter t
put; errorTypeName :: Proxy ByteString -> String
errorTypeName = Proxy ByteString -> String
forall a. Typeable a => Proxy a -> String
typeName
instance SafeCopy B.ByteString where
    getCopy :: Contained (Get ByteString)
getCopy = Get ByteString -> Contained (Get ByteString)
forall a. a -> Contained a
contain Get ByteString
forall t. Serialize t => Get t
get; putCopy :: ByteString -> Contained Put
putCopy = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put)
-> (ByteString -> Put) -> ByteString -> Contained Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Put
forall t. Serialize t => Putter t
put; errorTypeName :: Proxy ByteString -> String
errorTypeName = Proxy ByteString -> String
forall a. Typeable a => Proxy a -> String
typeName
instance SafeCopy Char where
    getCopy :: Contained (Get Char)
getCopy = Get Char -> Contained (Get Char)
forall a. a -> Contained a
contain Get Char
forall t. Serialize t => Get t
get; putCopy :: Char -> Contained Put
putCopy = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put) -> (Char -> Put) -> Char -> Contained Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Put
forall t. Serialize t => Putter t
put; errorTypeName :: Proxy Char -> String
errorTypeName = Proxy Char -> String
forall a. Typeable a => Proxy a -> String
typeName
instance SafeCopy Word where
    getCopy :: Contained (Get Word)
getCopy = Get Word -> Contained (Get Word)
forall a. a -> Contained a
contain Get Word
forall t. Serialize t => Get t
get; putCopy :: Word -> Contained Put
putCopy = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put) -> (Word -> Put) -> Word -> Contained Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word -> Put
forall t. Serialize t => Putter t
put; errorTypeName :: Proxy Word -> String
errorTypeName = Proxy Word -> String
forall a. Typeable a => Proxy a -> String
typeName
instance SafeCopy Word8 where
    getCopy :: Contained (Get Word8)
getCopy = Get Word8 -> Contained (Get Word8)
forall a. a -> Contained a
contain Get Word8
forall t. Serialize t => Get t
get; putCopy :: Word8 -> Contained Put
putCopy = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put) -> (Word8 -> Put) -> Word8 -> Contained Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word8 -> Put
forall t. Serialize t => Putter t
put; errorTypeName :: Proxy Word8 -> String
errorTypeName = Proxy Word8 -> String
forall a. Typeable a => Proxy a -> String
typeName
instance SafeCopy Word16 where
    getCopy :: Contained (Get Word16)
getCopy = Get Word16 -> Contained (Get Word16)
forall a. a -> Contained a
contain Get Word16
forall t. Serialize t => Get t
get; putCopy :: Word16 -> Contained Put
putCopy = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put)
-> (Word16 -> Put) -> Word16 -> Contained Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word16 -> Put
forall t. Serialize t => Putter t
put; errorTypeName :: Proxy Word16 -> String
errorTypeName = Proxy Word16 -> String
forall a. Typeable a => Proxy a -> String
typeName
instance SafeCopy Word32 where
    getCopy :: Contained (Get Word32)
getCopy = Get Word32 -> Contained (Get Word32)
forall a. a -> Contained a
contain Get Word32
forall t. Serialize t => Get t
get; putCopy :: Word32 -> Contained Put
putCopy = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put)
-> (Word32 -> Put) -> Word32 -> Contained Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word32 -> Put
forall t. Serialize t => Putter t
put; errorTypeName :: Proxy Word32 -> String
errorTypeName = Proxy Word32 -> String
forall a. Typeable a => Proxy a -> String
typeName
instance SafeCopy Word64 where
    getCopy :: Contained (Get Word64)
getCopy = Get Word64 -> Contained (Get Word64)
forall a. a -> Contained a
contain Get Word64
forall t. Serialize t => Get t
get; putCopy :: Word64 -> Contained Put
putCopy = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put)
-> (Word64 -> Put) -> Word64 -> Contained Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word64 -> Put
forall t. Serialize t => Putter t
put; errorTypeName :: Proxy Word64 -> String
errorTypeName = Proxy Word64 -> String
forall a. Typeable a => Proxy a -> String
typeName
instance SafeCopy Ordering where
    getCopy :: Contained (Get Ordering)
getCopy = Get Ordering -> Contained (Get Ordering)
forall a. a -> Contained a
contain Get Ordering
forall t. Serialize t => Get t
get; putCopy :: Ordering -> Contained Put
putCopy = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put)
-> (Ordering -> Put) -> Ordering -> Contained Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ordering -> Put
forall t. Serialize t => Putter t
put; errorTypeName :: Proxy Ordering -> String
errorTypeName = Proxy Ordering -> String
forall a. Typeable a => Proxy a -> String
typeName
instance SafeCopy Int8 where
    getCopy :: Contained (Get Int8)
getCopy = Get Int8 -> Contained (Get Int8)
forall a. a -> Contained a
contain Get Int8
forall t. Serialize t => Get t
get; putCopy :: Int8 -> Contained Put
putCopy = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put) -> (Int8 -> Put) -> Int8 -> Contained Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int8 -> Put
forall t. Serialize t => Putter t
put; errorTypeName :: Proxy Int8 -> String
errorTypeName = Proxy Int8 -> String
forall a. Typeable a => Proxy a -> String
typeName
instance SafeCopy Int16 where
    getCopy :: Contained (Get Int16)
getCopy = Get Int16 -> Contained (Get Int16)
forall a. a -> Contained a
contain Get Int16
forall t. Serialize t => Get t
get; putCopy :: Int16 -> Contained Put
putCopy = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put) -> (Int16 -> Put) -> Int16 -> Contained Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int16 -> Put
forall t. Serialize t => Putter t
put; errorTypeName :: Proxy Int16 -> String
errorTypeName = Proxy Int16 -> String
forall a. Typeable a => Proxy a -> String
typeName
instance SafeCopy Int32 where
    getCopy :: Contained (Get Int32)
getCopy = Get Int32 -> Contained (Get Int32)
forall a. a -> Contained a
contain Get Int32
forall t. Serialize t => Get t
get; putCopy :: Int32 -> Contained Put
putCopy = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put) -> (Int32 -> Put) -> Int32 -> Contained Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int32 -> Put
forall t. Serialize t => Putter t
put; errorTypeName :: Proxy Int32 -> String
errorTypeName = Proxy Int32 -> String
forall a. Typeable a => Proxy a -> String
typeName
instance SafeCopy Int64 where
    getCopy :: Contained (Get Int64)
getCopy = Get Int64 -> Contained (Get Int64)
forall a. a -> Contained a
contain Get Int64
forall t. Serialize t => Get t
get; putCopy :: Int64 -> Contained Put
putCopy = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put) -> (Int64 -> Put) -> Int64 -> Contained Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int64 -> Put
forall t. Serialize t => Putter t
put; errorTypeName :: Proxy Int64 -> String
errorTypeName = Proxy Int64 -> String
forall a. Typeable a => Proxy a -> String
typeName
instance (Integral a, SafeCopy a) => SafeCopy (Ratio a) where
    getCopy :: Contained (Get (Ratio a))
getCopy   = Get (Ratio a) -> Contained (Get (Ratio a))
forall a. a -> Contained a
contain (Get (Ratio a) -> Contained (Get (Ratio a)))
-> Get (Ratio a) -> Contained (Get (Ratio a))
forall a b. (a -> b) -> a -> b
$ do a
n <- Get a
forall a. SafeCopy a => Get a
safeGet
                             a
d <- Get a
forall a. SafeCopy a => Get a
safeGet
                             Ratio a -> Get (Ratio a)
forall (m :: * -> *) a. Monad m => a -> m a
return (a
n a -> a -> Ratio a
forall a. Integral a => a -> a -> Ratio a
% a
d)
    putCopy :: Ratio a -> Contained Put
putCopy Ratio a
r = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put) -> Put -> Contained Put
forall a b. (a -> b) -> a -> b
$ do a -> Put
forall a. SafeCopy a => a -> Put
safePut (Ratio a -> a
forall a. Ratio a -> a
numerator   Ratio a
r)
                             a -> Put
forall a. SafeCopy a => a -> Put
safePut (Ratio a -> a
forall a. Ratio a -> a
denominator Ratio a
r)
    errorTypeName :: Proxy (Ratio a) -> String
errorTypeName = Proxy (Ratio a) -> String
forall (c :: * -> *) a. Typeable c => Proxy (c a) -> String
typeName1
instance (HasResolution a, Fractional (Fixed a), Typeable a) => SafeCopy (Fixed a) where
    getCopy :: Contained (Get (Fixed a))
getCopy   = Get (Fixed a) -> Contained (Get (Fixed a))
forall a. a -> Contained a
contain (Get (Fixed a) -> Contained (Get (Fixed a)))
-> Get (Fixed a) -> Contained (Get (Fixed a))
forall a b. (a -> b) -> a -> b
$ Rational -> Fixed a
forall a. Fractional a => Rational -> a
fromRational (Rational -> Fixed a) -> Get Rational -> Get (Fixed a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get Rational
forall a. SafeCopy a => Get a
safeGet
    putCopy :: Fixed a -> Contained Put
putCopy   = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put)
-> (Fixed a -> Put) -> Fixed a -> Contained Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rational -> Put
forall a. SafeCopy a => a -> Put
safePut (Rational -> Put) -> (Fixed a -> Rational) -> Fixed a -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Fixed a -> Rational
forall a. Real a => a -> Rational
toRational
    errorTypeName :: Proxy (Fixed a) -> String
errorTypeName = Proxy (Fixed a) -> String
forall (c :: * -> *) a. Typeable c => Proxy (c a) -> String
typeName1

instance SafeCopy () where
    getCopy :: Contained (Get ())
getCopy = Get () -> Contained (Get ())
forall a. a -> Contained a
contain Get ()
forall t. Serialize t => Get t
get; putCopy :: () -> Contained Put
putCopy = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put) -> (() -> Put) -> () -> Contained Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. () -> Put
forall t. Serialize t => Putter t
put; errorTypeName :: Proxy () -> String
errorTypeName = Proxy () -> String
forall a. Typeable a => Proxy a -> String
typeName
instance SafeCopy Bool where
    getCopy :: Contained (Get Bool)
getCopy = Get Bool -> Contained (Get Bool)
forall a. a -> Contained a
contain Get Bool
forall t. Serialize t => Get t
get; putCopy :: Bool -> Contained Put
putCopy = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put) -> Putter Bool -> Bool -> Contained Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Putter Bool
forall t. Serialize t => Putter t
put; errorTypeName :: Proxy Bool -> String
errorTypeName = Proxy Bool -> String
forall a. Typeable a => Proxy a -> String
typeName
instance (SafeCopy a, SafeCopy b) => SafeCopy (Either a b) where
    getCopy :: Contained (Get (Either a b))
getCopy = Get (Either a b) -> Contained (Get (Either a b))
forall a. a -> Contained a
contain (Get (Either a b) -> Contained (Get (Either a b)))
-> Get (Either a b) -> Contained (Get (Either a b))
forall a b. (a -> b) -> a -> b
$ do Bool
n <- Get Bool
forall t. Serialize t => Get t
get
                           if Bool
n then (b -> Either a b) -> Get b -> Get (Either a b)
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM b -> Either a b
forall a b. b -> Either a b
Right Get b
forall a. SafeCopy a => Get a
safeGet
                                else (a -> Either a b) -> Get a -> Get (Either a b)
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM a -> Either a b
forall a b. a -> Either a b
Left Get a
forall a. SafeCopy a => Get a
safeGet
    putCopy :: Either a b -> Contained Put
putCopy (Right b
a) = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put) -> Put -> Contained Put
forall a b. (a -> b) -> a -> b
$ Putter Bool
forall t. Serialize t => Putter t
put Bool
True Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> b -> Put
forall a. SafeCopy a => a -> Put
safePut b
a
    putCopy (Left a
a) = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put) -> Put -> Contained Put
forall a b. (a -> b) -> a -> b
$ Putter Bool
forall t. Serialize t => Putter t
put Bool
False Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> a -> Put
forall a. SafeCopy a => a -> Put
safePut a
a

    errorTypeName :: Proxy (Either a b) -> String
errorTypeName = Proxy (Either a b) -> String
forall (c :: * -> * -> *) a b.
Typeable c =>
Proxy (c a b) -> String
typeName2

--  instances for 'text' library

instance SafeCopy T.Text where
    kind :: Kind Text
kind = Kind Text
forall a. Kind a
base
    getCopy :: Contained (Get Text)
getCopy = Get Text -> Contained (Get Text)
forall a. a -> Contained a
contain (Get Text -> Contained (Get Text))
-> Get Text -> Contained (Get Text)
forall a b. (a -> b) -> a -> b
$ ByteString -> Text
T.decodeUtf8 (ByteString -> Text) -> Get ByteString -> Get Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get ByteString
forall a. SafeCopy a => Get a
safeGet
    putCopy :: Text -> Contained Put
putCopy = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put) -> (Text -> Put) -> Text -> Contained Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Put
forall a. SafeCopy a => a -> Put
safePut (ByteString -> Put) -> (Text -> ByteString) -> Text -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> ByteString
T.encodeUtf8
    errorTypeName :: Proxy Text -> String
errorTypeName = Proxy Text -> String
forall a. Typeable a => Proxy a -> String
typeName

instance SafeCopy TL.Text where
    kind :: Kind Text
kind = Kind Text
forall a. Kind a
base
    getCopy :: Contained (Get Text)
getCopy = Get Text -> Contained (Get Text)
forall a. a -> Contained a
contain (Get Text -> Contained (Get Text))
-> Get Text -> Contained (Get Text)
forall a b. (a -> b) -> a -> b
$ ByteString -> Text
TL.decodeUtf8 (ByteString -> Text) -> Get ByteString -> Get Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get ByteString
forall a. SafeCopy a => Get a
safeGet
    putCopy :: Text -> Contained Put
putCopy = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put) -> (Text -> Put) -> Text -> Contained Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Put
forall a. SafeCopy a => a -> Put
safePut (ByteString -> Put) -> (Text -> ByteString) -> Text -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> ByteString
TL.encodeUtf8
    errorTypeName :: Proxy Text -> String
errorTypeName = Proxy Text -> String
forall a. Typeable a => Proxy a -> String
typeName

-- instances for 'time' library

instance SafeCopy Day where
    kind :: Kind Day
kind = Kind Day
forall a. Kind a
base
    getCopy :: Contained (Get Day)
getCopy = Get Day -> Contained (Get Day)
forall a. a -> Contained a
contain (Get Day -> Contained (Get Day)) -> Get Day -> Contained (Get Day)
forall a b. (a -> b) -> a -> b
$ Integer -> Day
ModifiedJulianDay (Integer -> Day) -> Get Integer -> Get Day
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get Integer
forall a. SafeCopy a => Get a
safeGet
    putCopy :: Day -> Contained Put
putCopy = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put) -> (Day -> Put) -> Day -> Contained Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> Put
forall a. SafeCopy a => a -> Put
safePut (Integer -> Put) -> (Day -> Integer) -> Day -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Day -> Integer
toModifiedJulianDay
    errorTypeName :: Proxy Day -> String
errorTypeName = Proxy Day -> String
forall a. Typeable a => Proxy a -> String
typeName

instance SafeCopy DiffTime where
    kind :: Kind DiffTime
kind = Kind DiffTime
forall a. Kind a
base
    getCopy :: Contained (Get DiffTime)
getCopy = Get DiffTime -> Contained (Get DiffTime)
forall a. a -> Contained a
contain (Get DiffTime -> Contained (Get DiffTime))
-> Get DiffTime -> Contained (Get DiffTime)
forall a b. (a -> b) -> a -> b
$ Rational -> DiffTime
forall a. Fractional a => Rational -> a
fromRational (Rational -> DiffTime) -> Get Rational -> Get DiffTime
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get Rational
forall a. SafeCopy a => Get a
safeGet
    putCopy :: DiffTime -> Contained Put
putCopy = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put)
-> (DiffTime -> Put) -> DiffTime -> Contained Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rational -> Put
forall a. SafeCopy a => a -> Put
safePut (Rational -> Put) -> (DiffTime -> Rational) -> DiffTime -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DiffTime -> Rational
forall a. Real a => a -> Rational
toRational
    errorTypeName :: Proxy DiffTime -> String
errorTypeName = Proxy DiffTime -> String
forall a. Typeable a => Proxy a -> String
typeName

instance SafeCopy UniversalTime where
    kind :: Kind UniversalTime
kind = Kind UniversalTime
forall a. Kind a
base
    getCopy :: Contained (Get UniversalTime)
getCopy = Get UniversalTime -> Contained (Get UniversalTime)
forall a. a -> Contained a
contain (Get UniversalTime -> Contained (Get UniversalTime))
-> Get UniversalTime -> Contained (Get UniversalTime)
forall a b. (a -> b) -> a -> b
$ Rational -> UniversalTime
ModJulianDate (Rational -> UniversalTime) -> Get Rational -> Get UniversalTime
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get Rational
forall a. SafeCopy a => Get a
safeGet
    putCopy :: UniversalTime -> Contained Put
putCopy = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put)
-> (UniversalTime -> Put) -> UniversalTime -> Contained Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rational -> Put
forall a. SafeCopy a => a -> Put
safePut (Rational -> Put)
-> (UniversalTime -> Rational) -> UniversalTime -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniversalTime -> Rational
getModJulianDate
    errorTypeName :: Proxy UniversalTime -> String
errorTypeName = Proxy UniversalTime -> String
forall a. Typeable a => Proxy a -> String
typeName

instance SafeCopy UTCTime where
    kind :: Kind UTCTime
kind = Kind UTCTime
forall a. Kind a
base
    getCopy :: Contained (Get UTCTime)
getCopy   = Get UTCTime -> Contained (Get UTCTime)
forall a. a -> Contained a
contain (Get UTCTime -> Contained (Get UTCTime))
-> Get UTCTime -> Contained (Get UTCTime)
forall a b. (a -> b) -> a -> b
$ do Day
day      <- Get Day
forall a. SafeCopy a => Get a
safeGet
                             DiffTime
diffTime <- Get DiffTime
forall a. SafeCopy a => Get a
safeGet
                             UTCTime -> Get UTCTime
forall (m :: * -> *) a. Monad m => a -> m a
return (Day -> DiffTime -> UTCTime
UTCTime Day
day DiffTime
diffTime)
    putCopy :: UTCTime -> Contained Put
putCopy UTCTime
u = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put) -> Put -> Contained Put
forall a b. (a -> b) -> a -> b
$ do Day -> Put
forall a. SafeCopy a => a -> Put
safePut (UTCTime -> Day
utctDay UTCTime
u)
                             DiffTime -> Put
forall a. SafeCopy a => a -> Put
safePut (UTCTime -> DiffTime
utctDayTime UTCTime
u)
    errorTypeName :: Proxy UTCTime -> String
errorTypeName = Proxy UTCTime -> String
forall a. Typeable a => Proxy a -> String
typeName

instance SafeCopy NominalDiffTime where
    kind :: Kind NominalDiffTime
kind = Kind NominalDiffTime
forall a. Kind a
base
    getCopy :: Contained (Get NominalDiffTime)
getCopy = Get NominalDiffTime -> Contained (Get NominalDiffTime)
forall a. a -> Contained a
contain (Get NominalDiffTime -> Contained (Get NominalDiffTime))
-> Get NominalDiffTime -> Contained (Get NominalDiffTime)
forall a b. (a -> b) -> a -> b
$ Rational -> NominalDiffTime
forall a. Fractional a => Rational -> a
fromRational (Rational -> NominalDiffTime)
-> Get Rational -> Get NominalDiffTime
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get Rational
forall a. SafeCopy a => Get a
safeGet
    putCopy :: NominalDiffTime -> Contained Put
putCopy = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put)
-> (NominalDiffTime -> Put) -> NominalDiffTime -> Contained Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rational -> Put
forall a. SafeCopy a => a -> Put
safePut (Rational -> Put)
-> (NominalDiffTime -> Rational) -> NominalDiffTime -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NominalDiffTime -> Rational
forall a. Real a => a -> Rational
toRational
    errorTypeName :: Proxy NominalDiffTime -> String
errorTypeName = Proxy NominalDiffTime -> String
forall a. Typeable a => Proxy a -> String
typeName

instance SafeCopy TimeOfDay where
    kind :: Kind TimeOfDay
kind = Kind TimeOfDay
forall a. Kind a
base
    getCopy :: Contained (Get TimeOfDay)
getCopy   = Get TimeOfDay -> Contained (Get TimeOfDay)
forall a. a -> Contained a
contain (Get TimeOfDay -> Contained (Get TimeOfDay))
-> Get TimeOfDay -> Contained (Get TimeOfDay)
forall a b. (a -> b) -> a -> b
$ do Int
hour <- Get Int
forall a. SafeCopy a => Get a
safeGet
                             Int
mins <- Get Int
forall a. SafeCopy a => Get a
safeGet
                             Pico
sec  <- Get Pico
forall a. SafeCopy a => Get a
safeGet
                             TimeOfDay -> Get TimeOfDay
forall (m :: * -> *) a. Monad m => a -> m a
return (Int -> Int -> Pico -> TimeOfDay
TimeOfDay Int
hour Int
mins Pico
sec)
    putCopy :: TimeOfDay -> Contained Put
putCopy TimeOfDay
t = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put) -> Put -> Contained Put
forall a b. (a -> b) -> a -> b
$ do Putter Int
forall a. SafeCopy a => a -> Put
safePut (TimeOfDay -> Int
todHour TimeOfDay
t)
                             Putter Int
forall a. SafeCopy a => a -> Put
safePut (TimeOfDay -> Int
todMin TimeOfDay
t)
                             Pico -> Put
forall a. SafeCopy a => a -> Put
safePut (TimeOfDay -> Pico
todSec TimeOfDay
t)
    errorTypeName :: Proxy TimeOfDay -> String
errorTypeName = Proxy TimeOfDay -> String
forall a. Typeable a => Proxy a -> String
typeName

instance SafeCopy TimeZone where
    kind :: Kind TimeZone
kind = Kind TimeZone
forall a. Kind a
base
    getCopy :: Contained (Get TimeZone)
getCopy   = Get TimeZone -> Contained (Get TimeZone)
forall a. a -> Contained a
contain (Get TimeZone -> Contained (Get TimeZone))
-> Get TimeZone -> Contained (Get TimeZone)
forall a b. (a -> b) -> a -> b
$ do Int
mins       <- Get Int
forall a. SafeCopy a => Get a
safeGet
                             Bool
summerOnly <- Get Bool
forall a. SafeCopy a => Get a
safeGet
                             String
zoneName   <- Get String
forall a. SafeCopy a => Get a
safeGet
                             TimeZone -> Get TimeZone
forall (m :: * -> *) a. Monad m => a -> m a
return (Int -> Bool -> String -> TimeZone
TimeZone Int
mins Bool
summerOnly String
zoneName)
    putCopy :: TimeZone -> Contained Put
putCopy TimeZone
t = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put) -> Put -> Contained Put
forall a b. (a -> b) -> a -> b
$ do Putter Int
forall a. SafeCopy a => a -> Put
safePut (TimeZone -> Int
timeZoneMinutes TimeZone
t)
                             Putter Bool
forall a. SafeCopy a => a -> Put
safePut (TimeZone -> Bool
timeZoneSummerOnly TimeZone
t)
                             String -> Put
forall a. SafeCopy a => a -> Put
safePut (TimeZone -> String
timeZoneName TimeZone
t)
    errorTypeName :: Proxy TimeZone -> String
errorTypeName = Proxy TimeZone -> String
forall a. Typeable a => Proxy a -> String
typeName

instance SafeCopy LocalTime where
    kind :: Kind LocalTime
kind = Kind LocalTime
forall a. Kind a
base
    getCopy :: Contained (Get LocalTime)
getCopy   = Get LocalTime -> Contained (Get LocalTime)
forall a. a -> Contained a
contain (Get LocalTime -> Contained (Get LocalTime))
-> Get LocalTime -> Contained (Get LocalTime)
forall a b. (a -> b) -> a -> b
$ do Day
day <- Get Day
forall a. SafeCopy a => Get a
safeGet
                             TimeOfDay
tod <- Get TimeOfDay
forall a. SafeCopy a => Get a
safeGet
                             LocalTime -> Get LocalTime
forall (m :: * -> *) a. Monad m => a -> m a
return (Day -> TimeOfDay -> LocalTime
LocalTime Day
day TimeOfDay
tod)
    putCopy :: LocalTime -> Contained Put
putCopy LocalTime
t = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put) -> Put -> Contained Put
forall a b. (a -> b) -> a -> b
$ do Day -> Put
forall a. SafeCopy a => a -> Put
safePut (LocalTime -> Day
localDay LocalTime
t)
                             TimeOfDay -> Put
forall a. SafeCopy a => a -> Put
safePut (LocalTime -> TimeOfDay
localTimeOfDay LocalTime
t)
    errorTypeName :: Proxy LocalTime -> String
errorTypeName = Proxy LocalTime -> String
forall a. Typeable a => Proxy a -> String
typeName

instance SafeCopy ZonedTime where
    kind :: Kind ZonedTime
kind = Kind ZonedTime
forall a. Kind a
base
    getCopy :: Contained (Get ZonedTime)
getCopy   = Get ZonedTime -> Contained (Get ZonedTime)
forall a. a -> Contained a
contain (Get ZonedTime -> Contained (Get ZonedTime))
-> Get ZonedTime -> Contained (Get ZonedTime)
forall a b. (a -> b) -> a -> b
$ do LocalTime
localTime <- Get LocalTime
forall a. SafeCopy a => Get a
safeGet
                             TimeZone
timeZone  <- Get TimeZone
forall a. SafeCopy a => Get a
safeGet
                             ZonedTime -> Get ZonedTime
forall (m :: * -> *) a. Monad m => a -> m a
return (LocalTime -> TimeZone -> ZonedTime
ZonedTime LocalTime
localTime TimeZone
timeZone)
    putCopy :: ZonedTime -> Contained Put
putCopy ZonedTime
t = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put) -> Put -> Contained Put
forall a b. (a -> b) -> a -> b
$ do LocalTime -> Put
forall a. SafeCopy a => a -> Put
safePut (ZonedTime -> LocalTime
zonedTimeToLocalTime ZonedTime
t)
                             TimeZone -> Put
forall a. SafeCopy a => a -> Put
safePut (ZonedTime -> TimeZone
zonedTimeZone ZonedTime
t)
    errorTypeName :: Proxy ZonedTime -> String
errorTypeName = Proxy ZonedTime -> String
forall a. Typeable a => Proxy a -> String
typeName

instance SafeCopy AbsoluteTime where
  getCopy :: Contained (Get AbsoluteTime)
getCopy = Get AbsoluteTime -> Contained (Get AbsoluteTime)
forall a. a -> Contained a
contain (Get AbsoluteTime -> Contained (Get AbsoluteTime))
-> Get AbsoluteTime -> Contained (Get AbsoluteTime)
forall a b. (a -> b) -> a -> b
$ (DiffTime -> AbsoluteTime) -> Get DiffTime -> Get AbsoluteTime
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM DiffTime -> AbsoluteTime
toAbsoluteTime Get DiffTime
forall a. SafeCopy a => Get a
safeGet
    where
      toAbsoluteTime :: DiffTime -> AbsoluteTime
      toAbsoluteTime :: DiffTime -> AbsoluteTime
toAbsoluteTime DiffTime
dt = DiffTime -> AbsoluteTime -> AbsoluteTime
addAbsoluteTime DiffTime
dt AbsoluteTime
taiEpoch
  putCopy :: AbsoluteTime -> Contained Put
putCopy = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put)
-> (AbsoluteTime -> Put) -> AbsoluteTime -> Contained Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DiffTime -> Put
forall a. SafeCopy a => a -> Put
safePut (DiffTime -> Put)
-> (AbsoluteTime -> DiffTime) -> AbsoluteTime -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AbsoluteTime -> DiffTime
fromAbsoluteTime
    where
      fromAbsoluteTime :: AbsoluteTime -> DiffTime
      fromAbsoluteTime :: AbsoluteTime -> DiffTime
fromAbsoluteTime AbsoluteTime
at = AbsoluteTime -> AbsoluteTime -> DiffTime
diffAbsoluteTime AbsoluteTime
at AbsoluteTime
taiEpoch
  errorTypeName :: Proxy AbsoluteTime -> String
errorTypeName = Proxy AbsoluteTime -> String
forall a. Typeable a => Proxy a -> String
typeName

-- instances for old-time

instance SafeCopy ClockTime where
    kind :: Kind ClockTime
kind = Kind ClockTime
forall a. Kind a
base
    getCopy :: Contained (Get ClockTime)
getCopy = Get ClockTime -> Contained (Get ClockTime)
forall a. a -> Contained a
contain (Get ClockTime -> Contained (Get ClockTime))
-> Get ClockTime -> Contained (Get ClockTime)
forall a b. (a -> b) -> a -> b
$ do Integer
secs <- Get Integer
forall a. SafeCopy a => Get a
safeGet
                           Integer
pico <- Get Integer
forall a. SafeCopy a => Get a
safeGet
                           ClockTime -> Get ClockTime
forall (m :: * -> *) a. Monad m => a -> m a
return (Integer -> Integer -> ClockTime
TOD Integer
secs Integer
pico)
    putCopy :: ClockTime -> Contained Put
putCopy (TOD Integer
secs Integer
pico) =
              Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put) -> Put -> Contained Put
forall a b. (a -> b) -> a -> b
$ do Integer -> Put
forall a. SafeCopy a => a -> Put
safePut Integer
secs
                           Integer -> Put
forall a. SafeCopy a => a -> Put
safePut Integer
pico

instance SafeCopy TimeDiff where
    kind :: Kind TimeDiff
kind = Kind TimeDiff
forall a. Kind a
base
    getCopy :: Contained (Get TimeDiff)
getCopy   = Get TimeDiff -> Contained (Get TimeDiff)
forall a. a -> Contained a
contain (Get TimeDiff -> Contained (Get TimeDiff))
-> Get TimeDiff -> Contained (Get TimeDiff)
forall a b. (a -> b) -> a -> b
$ do Int
year    <- Get Int
forall t. Serialize t => Get t
get
                             Int
month   <- Get Int
forall t. Serialize t => Get t
get
                             Int
day     <- Get Int
forall t. Serialize t => Get t
get
                             Int
hour    <- Get Int
forall t. Serialize t => Get t
get
                             Int
mins    <- Get Int
forall t. Serialize t => Get t
get
                             Int
sec     <- Get Int
forall t. Serialize t => Get t
get
                             Integer
pico    <- Get Integer
forall t. Serialize t => Get t
get
                             TimeDiff -> Get TimeDiff
forall (m :: * -> *) a. Monad m => a -> m a
return (Int -> Int -> Int -> Int -> Int -> Int -> Integer -> TimeDiff
TimeDiff Int
year Int
month Int
day Int
hour Int
mins Int
sec Integer
pico)
    putCopy :: TimeDiff -> Contained Put
putCopy TimeDiff
t = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put) -> Put -> Contained Put
forall a b. (a -> b) -> a -> b
$ do Putter Int
forall t. Serialize t => Putter t
put (TimeDiff -> Int
tdYear TimeDiff
t)
                             Putter Int
forall t. Serialize t => Putter t
put (TimeDiff -> Int
tdMonth TimeDiff
t)
                             Putter Int
forall t. Serialize t => Putter t
put (TimeDiff -> Int
tdDay TimeDiff
t)
                             Putter Int
forall t. Serialize t => Putter t
put (TimeDiff -> Int
tdHour TimeDiff
t)
                             Putter Int
forall t. Serialize t => Putter t
put (TimeDiff -> Int
tdMin TimeDiff
t)
                             Putter Int
forall t. Serialize t => Putter t
put (TimeDiff -> Int
tdSec TimeDiff
t)
                             Integer -> Put
forall t. Serialize t => Putter t
put (TimeDiff -> Integer
tdPicosec TimeDiff
t)

instance SafeCopy OT.Day where
    kind :: Kind Day
kind = Kind Day
forall a. Kind a
base ; getCopy :: Contained (Get Day)
getCopy = Get Day -> Contained (Get Day)
forall a. a -> Contained a
contain (Get Day -> Contained (Get Day)) -> Get Day -> Contained (Get Day)
forall a b. (a -> b) -> a -> b
$ Int -> Day
forall a. Enum a => Int -> a
toEnum (Int -> Day) -> Get Int -> Get Day
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get Int
forall t. Serialize t => Get t
get ; putCopy :: Day -> Contained Put
putCopy = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put) -> (Day -> Put) -> Day -> Contained Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Putter Int
forall t. Serialize t => Putter t
put Putter Int -> (Day -> Int) -> Day -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Day -> Int
forall a. Enum a => a -> Int
fromEnum

instance SafeCopy Month where
    kind :: Kind Month
kind = Kind Month
forall a. Kind a
base ; getCopy :: Contained (Get Month)
getCopy = Get Month -> Contained (Get Month)
forall a. a -> Contained a
contain (Get Month -> Contained (Get Month))
-> Get Month -> Contained (Get Month)
forall a b. (a -> b) -> a -> b
$ Int -> Month
forall a. Enum a => Int -> a
toEnum (Int -> Month) -> Get Int -> Get Month
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get Int
forall t. Serialize t => Get t
get ; putCopy :: Month -> Contained Put
putCopy = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put) -> (Month -> Put) -> Month -> Contained Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Putter Int
forall t. Serialize t => Putter t
put Putter Int -> (Month -> Int) -> Month -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Month -> Int
forall a. Enum a => a -> Int
fromEnum


instance SafeCopy CalendarTime where
    kind :: Kind CalendarTime
kind = Kind CalendarTime
forall a. Kind a
base
    getCopy :: Contained (Get CalendarTime)
getCopy   = Get CalendarTime -> Contained (Get CalendarTime)
forall a. a -> Contained a
contain (Get CalendarTime -> Contained (Get CalendarTime))
-> Get CalendarTime -> Contained (Get CalendarTime)
forall a b. (a -> b) -> a -> b
$ do Int
year   <- Get Int
forall t. Serialize t => Get t
get
                             Month
month  <- Get Month
forall a. SafeCopy a => Get a
safeGet
                             Int
day    <- Get Int
forall t. Serialize t => Get t
get
                             Int
hour   <- Get Int
forall t. Serialize t => Get t
get
                             Int
mins   <- Get Int
forall t. Serialize t => Get t
get
                             Int
sec    <- Get Int
forall t. Serialize t => Get t
get
                             Integer
pico   <- Get Integer
forall t. Serialize t => Get t
get
                             Day
wday   <- Get Day
forall a. SafeCopy a => Get a
safeGet
                             Int
yday   <- Get Int
forall t. Serialize t => Get t
get
                             String
tzname <- Get String
forall a. SafeCopy a => Get a
safeGet
                             Int
tz     <- Get Int
forall t. Serialize t => Get t
get
                             Bool
dst    <- Get Bool
forall t. Serialize t => Get t
get
                             CalendarTime -> Get CalendarTime
forall (m :: * -> *) a. Monad m => a -> m a
return (Int
-> Month
-> Int
-> Int
-> Int
-> Int
-> Integer
-> Day
-> Int
-> String
-> Int
-> Bool
-> CalendarTime
CalendarTime Int
year Month
month Int
day Int
hour Int
mins Int
sec Integer
pico Day
wday Int
yday String
tzname Int
tz Bool
dst)
    putCopy :: CalendarTime -> Contained Put
putCopy CalendarTime
t = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put) -> Put -> Contained Put
forall a b. (a -> b) -> a -> b
$ do Putter Int
forall t. Serialize t => Putter t
put     (CalendarTime -> Int
ctYear CalendarTime
t)
                             Month -> Put
forall a. SafeCopy a => a -> Put
safePut (CalendarTime -> Month
ctMonth CalendarTime
t)
                             Putter Int
forall t. Serialize t => Putter t
put     (CalendarTime -> Int
ctDay CalendarTime
t)
                             Putter Int
forall t. Serialize t => Putter t
put     (CalendarTime -> Int
ctHour CalendarTime
t)
                             Putter Int
forall t. Serialize t => Putter t
put     (CalendarTime -> Int
ctMin CalendarTime
t)
                             Putter Int
forall t. Serialize t => Putter t
put     (CalendarTime -> Int
ctSec CalendarTime
t)
                             Integer -> Put
forall t. Serialize t => Putter t
put     (CalendarTime -> Integer
ctPicosec CalendarTime
t)
                             Day -> Put
forall a. SafeCopy a => a -> Put
safePut (CalendarTime -> Day
ctWDay CalendarTime
t)
                             Putter Int
forall t. Serialize t => Putter t
put     (CalendarTime -> Int
ctYDay CalendarTime
t)
                             String -> Put
forall a. SafeCopy a => a -> Put
safePut (CalendarTime -> String
ctTZName CalendarTime
t)
                             Putter Int
forall t. Serialize t => Putter t
put     (CalendarTime -> Int
ctTZ CalendarTime
t)
                             Putter Bool
forall t. Serialize t => Putter t
put     (CalendarTime -> Bool
ctIsDST CalendarTime
t)

typeName :: Typeable a => Proxy a -> String
typeName :: Proxy a -> String
typeName Proxy a
proxy = TypeRep -> String
forall a. Show a => a -> String
show (a -> TypeRep
forall a. Typeable a => a -> TypeRep
typeOf (a
forall a. HasCallStack => a
undefined a -> Proxy a -> a
forall a. a -> Proxy a -> a
`asProxyType` Proxy a
proxy))

#if MIN_VERSION_base(4,10,0)
typeName1 :: (Typeable c) => Proxy (c a) -> String
typeName2 :: (Typeable c) => Proxy (c a b) -> String
#else
typeName1 :: (Typeable1 c) => Proxy (c a) -> String
typeName2 :: (Typeable2 c) => Proxy (c a b) -> String
#endif

typeName1 :: Proxy (c a) -> String
typeName1 Proxy (c a)
proxy = TypeRep -> String
forall a. Show a => a -> String
show (c a -> TypeRep
forall (t :: * -> *) a. Typeable t => t a -> TypeRep
typeOf1 (c a
forall a. HasCallStack => a
undefined c a -> Proxy (c a) -> c a
forall a. a -> Proxy a -> a
`asProxyType` Proxy (c a)
proxy))
typeName2 :: Proxy (c a b) -> String
typeName2 Proxy (c a b)
proxy = TypeRep -> String
forall a. Show a => a -> String
show (c a b -> TypeRep
forall (t :: * -> * -> *) a b. Typeable t => t a b -> TypeRep
typeOf2 (c a b
forall a. HasCallStack => a
undefined c a b -> Proxy (c a b) -> c a b
forall a. a -> Proxy a -> a
`asProxyType` Proxy (c a b)
proxy))

getGenericVector :: (SafeCopy a, VG.Vector v a) => Contained (Get (v a))
getGenericVector :: Contained (Get (v a))
getGenericVector = Get (v a) -> Contained (Get (v a))
forall a. a -> Contained a
contain (Get (v a) -> Contained (Get (v a)))
-> Get (v a) -> Contained (Get (v a))
forall a b. (a -> b) -> a -> b
$ do Int
n <- Get Int
forall t. Serialize t => Get t
get
                                Get (Get a)
forall a. SafeCopy a => Get (Get a)
getSafeGet Get (Get a) -> (Get a -> Get (v a)) -> Get (v a)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Int -> Get a -> Get (v a)
forall (m :: * -> *) (v :: * -> *) a.
(Monad m, Vector v a) =>
Int -> m a -> m (v a)
VG.replicateM Int
n

putGenericVector :: (SafeCopy a, VG.Vector v a) => v a -> Contained Put
putGenericVector :: v a -> Contained Put
putGenericVector v a
v = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put) -> Put -> Contained Put
forall a b. (a -> b) -> a -> b
$ do Putter Int
forall t. Serialize t => Putter t
put (v a -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int
VG.length v a
v)
                                  PutM (a -> Put)
forall a. SafeCopy a => PutM (a -> Put)
getSafePut PutM (a -> Put) -> ((a -> Put) -> Put) -> Put
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= v a -> (a -> Put) -> Put
forall (m :: * -> *) (v :: * -> *) a b.
(Monad m, Vector v a) =>
v a -> (a -> m b) -> m ()
VG.forM_ v a
v

instance SafeCopy a => SafeCopy (V.Vector a) where
    getCopy :: Contained (Get (Vector a))
getCopy = Contained (Get (Vector a))
forall a (v :: * -> *).
(SafeCopy a, Vector v a) =>
Contained (Get (v a))
getGenericVector
    putCopy :: Vector a -> Contained Put
putCopy = Vector a -> Contained Put
forall a (v :: * -> *).
(SafeCopy a, Vector v a) =>
v a -> Contained Put
putGenericVector

instance (SafeCopy a, VP.Prim a) => SafeCopy (VP.Vector a) where
    getCopy :: Contained (Get (Vector a))
getCopy = Contained (Get (Vector a))
forall a (v :: * -> *).
(SafeCopy a, Vector v a) =>
Contained (Get (v a))
getGenericVector
    putCopy :: Vector a -> Contained Put
putCopy = Vector a -> Contained Put
forall a (v :: * -> *).
(SafeCopy a, Vector v a) =>
v a -> Contained Put
putGenericVector

instance (SafeCopy a, VS.Storable a) => SafeCopy (VS.Vector a) where
    getCopy :: Contained (Get (Vector a))
getCopy = Contained (Get (Vector a))
forall a (v :: * -> *).
(SafeCopy a, Vector v a) =>
Contained (Get (v a))
getGenericVector
    putCopy :: Vector a -> Contained Put
putCopy = Vector a -> Contained Put
forall a (v :: * -> *).
(SafeCopy a, Vector v a) =>
v a -> Contained Put
putGenericVector

instance (SafeCopy a, VU.Unbox a) => SafeCopy (VU.Vector a) where
    getCopy :: Contained (Get (Vector a))
getCopy = Contained (Get (Vector a))
forall a (v :: * -> *).
(SafeCopy a, Vector v a) =>
Contained (Get (v a))
getGenericVector
    putCopy :: Vector a -> Contained Put
putCopy = Vector a -> Contained Put
forall a (v :: * -> *).
(SafeCopy a, Vector v a) =>
v a -> Contained Put
putGenericVector