ulid-0.2.0.0: src/Data/ULID/TimeStamp.hs
{-# LANGUAGE DeriveDataTypeable #-}
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 -- 48 bits
-- UNIX time in milliseconds
newtype ULIDTimeStamp = ULIDTimeStamp Integer
deriving (Eq, Ord, Typeable, Data)
-- | Generate a ULID Timestamp based on a specified time
mkULIDTimeStamp :: POSIXTime -- ^ The specified UNIX time (seconds) to millisecond precision, e.g. 1469918176.385
-> ULIDTimeStamp
mkULIDTimeStamp = ULIDTimeStamp . round . (*1000)
-- | Generate a ULID Timestamp based on current system UNIX time
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