{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
module Duckling.Time.Corpus
( datetime
, datetimeHoliday
, datetimeInterval
, datetimeIntervalHoliday
, datetimeOpenInterval
, examples
) where
import Data.Aeson
import qualified Data.HashMap.Strict as H
import Data.Text (Text)
import qualified Data.Time.LocalTime.TimeZone.Series as Series
import Prelude
import Data.String
import Duckling.Resolve
import Duckling.Testing.Types hiding (examples)
import Duckling.Time.Types hiding (Month)
import Duckling.TimeGrain.Types hiding (add)
import Duckling.Types hiding (Entity(..))
datetime :: Datetime -> Grain -> Context -> TimeValue
datetime d g ctx = datetimeIntervalHolidayHelper (d, Nothing) g Nothing ctx
datetimeHoliday :: Datetime -> Grain -> Text -> Context -> TimeValue
datetimeHoliday d g h ctx =
datetimeIntervalHolidayHelper (d, Nothing) g (Just h) ctx
datetimeInterval :: (Datetime, Datetime) -> Grain -> Context -> TimeValue
datetimeInterval (d1, d2) g ctx =
datetimeIntervalHolidayHelper (d1, Just d2) g Nothing ctx
datetimeIntervalHoliday ::
(Datetime, Datetime) -> Grain -> Text -> Context -> TimeValue
datetimeIntervalHoliday (d1, d2) g h ctx =
datetimeIntervalHolidayHelper (d1, Just d2) g (Just h) ctx
datetimeIntervalHolidayHelper ::
(Datetime, Maybe Datetime) -> Grain -> Maybe Text -> Context -> TimeValue
datetimeIntervalHolidayHelper (d1, md2) g hol ctx = TimeValue tv [tv] hol
where
DucklingTime (Series.ZoneSeriesTime _ tzSeries) = referenceTime ctx
tv = timeValue tzSeries TimeObject {start = dt d1, end = d, grain = g}
d = case md2 of
Nothing -> Nothing
Just d2 -> Just $ dt d2
datetimeOpenInterval
:: IntervalDirection -> Datetime -> Grain -> Context -> TimeValue
datetimeOpenInterval dir d g ctx = TimeValue tv [tv] Nothing
where
DucklingTime (Series.ZoneSeriesTime _ tzSeries) = referenceTime ctx
tv = openInterval tzSeries dir TimeObject
{start = dt d, end = Nothing, grain = g}
check :: ToJSON a => (Context -> a) -> TestPredicate
check f context Resolved{jsonValue} = case jsonValue of
Object o -> deleteValues (toJSON (f context)) == deleteValues (Object o)
_ -> False
where
deleteValues :: Value -> Value
deleteValues (Object o) = Object $ H.delete "values" o
deleteValues _ = Object H.empty
examples :: ToJSON a => (Context -> a) -> [Text] -> [Example]
examples f = examplesCustom (check f)