module Calamity.Types.UnixTimestamp
( UnixTimestamp(..)
, unixToMilliseconds
, millisecondsToUnix ) where
import Calamity.Internal.Utils ()
import Control.Arrow
import Data.Aeson
import Data.Aeson.Encoding ( word64 )
import Data.Time
import Data.Time.Clock.POSIX
import Data.Word
import GHC.Generics
import TextShow
import qualified TextShow.Generic as TSG
newtype UnixTimestamp = UnixTimestamp
{ unUnixTimestamp :: UTCTime
}
deriving ( Show, Eq, Generic )
deriving ( TextShow ) via TSG.FromGeneric UnixTimestamp
unixToMilliseconds :: UnixTimestamp -> Word64
unixToMilliseconds = unUnixTimestamp
>>> utcTimeToPOSIXSeconds
>>> toRational
>>> (* 1000)
>>> round
millisecondsToUnix :: Word64 -> UnixTimestamp
millisecondsToUnix = toRational
>>> fromRational
>>> (/ 1000)
>>> posixSecondsToUTCTime
>>> UnixTimestamp
instance ToJSON UnixTimestamp where
toEncoding = unUnixTimestamp
>>> utcTimeToPOSIXSeconds
>>> toRational
>>> round
>>> word64
instance FromJSON UnixTimestamp where
parseJSON = withScientific "UnixTimestamp" $
toRational
>>> fromRational
>>> posixSecondsToUTCTime
>>> UnixTimestamp
>>> pure