module Data.ULID.TimeStamp (
ULIDTimeStamp,
mkULIDTimeStamp,
getULIDTimeStamp
) where
import Control.DeepSeq
import Control.Monad
import Data.Binary
import Data.Binary.Roll
import Data.Data
import Data.Time.Clock
import Data.Time.Clock.POSIX
import qualified Data.ULID.Crockford as CR
numBytes = 6
newtype ULIDTimeStamp = ULIDTimeStamp Integer
deriving (Eq, Ord, Typeable, Data)
mkULIDTimeStamp :: POSIXTime
-> ULIDTimeStamp
mkULIDTimeStamp = ULIDTimeStamp . round . (*1000)
getULIDTimeStamp :: IO ULIDTimeStamp
getULIDTimeStamp = mkULIDTimeStamp <$> getPOSIXTime
instance Show ULIDTimeStamp where
show (ULIDTimeStamp i) = CR.encode 10 i
instance Read ULIDTimeStamp where
readsPrec _ = map (\(c,r)->(ULIDTimeStamp c, r)) . (CR.decode) 10
instance Binary ULIDTimeStamp where
put (ULIDTimeStamp i) = mapM_ put (unroll numBytes i)
get = ULIDTimeStamp <$> roll <$> replicateM numBytes get
instance NFData ULIDTimeStamp where
rnf (ULIDTimeStamp i) = rnf i