-- Copyright (c) 2016-present, Facebook, Inc. -- All rights reserved. -- -- This source code is licensed under the BSD-style license found in the -- LICENSE file in the root directory of this source tree. An additional grant -- of patent rights can be found in the PATENTS file in the same directory. {-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE OverloadedStrings #-} 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)