module Eternity.Timestamped.Data.TypesAndInstances
where

import Eternity.Timestamped.Prelude
import qualified Generic.Random as A


{-|
A value paired with a timestamp. 
-}
data Timestamped event = Timestamped {-# UNPACK #-} !Timestamp !event

{-|
Amount of microseconds since @1970-01-01 00:00.000000 UTC@.
The semantics are the same as of 'Data.Time.Clock.POSIX.POSIXTime'.

This datatype is used instead of 'UTCTime' or 'Data.Time.Clock.POSIX.POSIXTime'
for space-efficiency.
-}
newtype Timestamp = Timestamp Int64


deriving instance Eq a => Eq (Timestamped a)
deriving instance Ord a => Ord (Timestamped a)
deriving instance Show a => Show (Timestamped a)
deriving instance Functor Timestamped
deriving instance Generic (Timestamped a)
instance Arbitrary a => Arbitrary (Timestamped a) where arbitrary = A.genericArbitraryU
instance Hashable a => Hashable (Timestamped a)
instance Serialize a => Serialize (Timestamped a)

deriving instance Eq Timestamp
deriving instance Ord Timestamp
deriving instance Show Timestamp
deriving instance Generic Timestamp
instance Arbitrary Timestamp where arbitrary = A.genericArbitraryU
instance Hashable Timestamp
instance Serialize Timestamp