{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeFamilies #-}
module Duckling.Resolve
( Context(..)
, DucklingTime(..)
, Resolve(..)
, fromUTC
, fromZonedTime
, toUTC
) where
import Data.Aeson
import Data.String
import qualified Data.Time as Time
import qualified Data.Time.LocalTime.TimeZone.Series as Series
import Prelude
import Duckling.Lang
newtype DucklingTime = DucklingTime Series.ZoneSeriesTime
deriving (Eq, Show)
data Context = Context
{ referenceTime :: DucklingTime
, lang :: Lang
}
deriving (Eq, Show)
class ToJSON (ResolvedValue a) => Resolve a where
type ResolvedValue a
resolve :: Context -> a -> Maybe (ResolvedValue a)
fromZonedTime :: Time.ZonedTime -> DucklingTime
fromZonedTime (Time.ZonedTime localTime timeZone) = DucklingTime $
Series.ZoneSeriesTime (toUTC localTime) (Series.TimeZoneSeries timeZone [])
fromUTC :: Time.UTCTime -> Time.TimeZone -> Time.ZonedTime
fromUTC (Time.UTCTime day diffTime) timeZone = Time.ZonedTime localTime timeZone
where
localTime = Time.LocalTime day timeOfDay
timeOfDay = Time.timeToTimeOfDay diffTime
toUTC :: Time.LocalTime -> Time.UTCTime
toUTC (Time.LocalTime day timeOfDay) = Time.UTCTime day diffTime
where
diffTime = Time.timeOfDayToTime timeOfDay