{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, KindSignatures, GADTs, DataKinds #-}
module Data.Interval.Time (
MinuteInterval,
fromEndTime,
ubZoned,
Min10,
until10,
Min15,
until15
) where
import Data.Interval (Interval(..),addTime)
import Data.Function (on)
import Data.Time (ZonedTime,zonedTimeToUTC,UTCTime,NominalDiffTime)
import GHC.TypeLits (Nat,KnownNat,natVal)
import Data.Proxy (Proxy(..))
data MinuteInterval (n :: Nat) where
Until :: KnownNat n => ZonedTime -> UTCTime -> UTCTime -> MinuteInterval n
ubZoned :: MinuteInterval n -> ZonedTime
ubZoned :: forall (n :: Nat). MinuteInterval n -> ZonedTime
ubZoned (Until ZonedTime
z UTCTime
_ UTCTime
_) = ZonedTime
z
instance Eq (MinuteInterval n) where
== :: MinuteInterval n -> MinuteInterval n -> Bool
(==) = forall a. Eq a => a -> a -> Bool
(==) forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` forall e i. Interval e i => i -> e
ub
instance Ord (MinuteInterval n) where
compare :: MinuteInterval n -> MinuteInterval n -> Ordering
compare = forall a. Ord a => a -> a -> Ordering
compare forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` forall e i. Interval e i => i -> e
ub
instance Interval UTCTime (MinuteInterval n) where
ub :: MinuteInterval n -> UTCTime
ub (Until ZonedTime
_ UTCTime
_ UTCTime
u) = UTCTime
u
lb :: MinuteInterval n -> UTCTime
lb (Until ZonedTime
_ UTCTime
l UTCTime
_) = UTCTime
l
beginMinutes :: KnownNat n => Proxy n -> NominalDiffTime
beginMinutes :: forall (n :: Nat). KnownNat n => Proxy n -> NominalDiffTime
beginMinutes = forall a. Num a => Integer -> a
fromInteger forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Num a => a -> a
negate forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Integer
60forall a. Num a => a -> a -> a
*) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (n :: Nat) (proxy :: Nat -> *).
KnownNat n =>
proxy n -> Integer
natVal
fromEndTime :: KnownNat n => Proxy n -> ZonedTime -> MinuteInterval n
fromEndTime :: forall (n :: Nat).
KnownNat n =>
Proxy n -> ZonedTime -> MinuteInterval n
fromEndTime Proxy n
p ZonedTime
z = let u :: UTCTime
u = ZonedTime -> UTCTime
zonedTimeToUTC ZonedTime
z in forall (n :: Nat).
KnownNat n =>
ZonedTime -> UTCTime -> UTCTime -> MinuteInterval n
Until ZonedTime
z (forall t. TimeDifference t => NominalDiffTime -> t -> t
addTime (forall (n :: Nat). KnownNat n => Proxy n -> NominalDiffTime
beginMinutes Proxy n
p) UTCTime
u) UTCTime
u
type Min10 = MinuteInterval 10
instance Show (MinuteInterval 10) where
show :: MinuteInterval 10 -> String
show MinuteInterval 10
i = String
"until10 " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show (forall (n :: Nat). MinuteInterval n -> ZonedTime
ubZoned MinuteInterval 10
i)
until10 :: ZonedTime -> Min10
until10 :: ZonedTime -> MinuteInterval 10
until10 = forall (n :: Nat).
KnownNat n =>
Proxy n -> ZonedTime -> MinuteInterval n
fromEndTime (forall {k} (t :: k). Proxy t
Proxy :: Proxy 10)
type Min15 = MinuteInterval 15
instance Show (MinuteInterval 15) where
show :: MinuteInterval 15 -> String
show MinuteInterval 15
i = String
"until15 " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show (forall (n :: Nat). MinuteInterval n -> ZonedTime
ubZoned MinuteInterval 15
i)
until15 :: ZonedTime -> Min15
until15 :: ZonedTime -> MinuteInterval 15
until15 = forall (n :: Nat).
KnownNat n =>
Proxy n -> ZonedTime -> MinuteInterval n
fromEndTime (forall {k} (t :: k). Proxy t
Proxy :: Proxy 15)