module Duckling.Time.Corpus
( datetime
, datetimeInterval
, 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 -> SingleTimeValue
datetime d g ctx =
timeValue tzSeries TimeObject {start = dt d, end = Nothing, grain = g}
where
DucklingTime (Series.ZoneSeriesTime _ tzSeries) = referenceTime ctx
datetimeInterval :: (Datetime, Datetime) -> Grain -> Context -> SingleTimeValue
datetimeInterval (d1, d2) g ctx = timeValue tzSeries TimeObject
{start = dt d1, end = Just $ dt d2, grain = g}
where
DucklingTime (Series.ZoneSeriesTime _ tzSeries) = referenceTime ctx
datetimeOpenInterval
:: IntervalDirection -> Datetime -> Grain -> Context -> SingleTimeValue
datetimeOpenInterval dir d g ctx = openInterval tzSeries dir TimeObject
{start = dt d, end = Nothing, grain = g}
where
DucklingTime (Series.ZoneSeriesTime _ tzSeries) = referenceTime ctx
check :: ToJSON a => (Context -> a) -> TestPredicate
check f context (Resolved {jsonValue}) = case jsonValue of
Object o -> toJSON (f context) == (Object $ H.delete "values" o)
_ -> False
examples :: ToJSON a => (Context -> a) -> [Text] -> [Example]
examples f = examplesCustom (check f)