-- 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 GADTs #-} {-# LANGUAGE NoRebindableSyntax #-} {-# LANGUAGE OverloadedStrings #-} module Duckling.Time.HE.Rules ( rules ) where import Data.Maybe import Data.String import Data.Text (Text) import Prelude import qualified Data.Text as Text import Duckling.Dimensions.Types import Duckling.Numeral.Helpers (parseInt) import Duckling.Numeral.Types (NumeralData (..)) import Duckling.Ordinal.Types (OrdinalData (..)) import Duckling.Regex.Types import Duckling.Time.Helpers import Duckling.Time.Types (TimeData (..)) import Duckling.Types import qualified Duckling.Numeral.Types as TNumeral import qualified Duckling.Ordinal.Types as TOrdinal import qualified Duckling.TimeGrain.Types as TG import qualified Duckling.Time.Types as TTime ruleNextDayofweek :: Rule ruleNextDayofweek = Rule { name = "next " , pattern = [ Predicate isADayOfWeek , regex "(הבא(ה)?)" ] , prod = \tokens -> case tokens of (Token Time td:_) -> tt $ predNth 1 True td _ -> Nothing } ruleNamedday :: Rule ruleNamedday = Rule { name = "ב " , pattern = [ regex "ב" , Predicate isADayOfWeek ] , prod = \tokens -> case tokens of (_:x:_) -> Just x _ -> Nothing } ruleAtHourTimeofday :: Rule ruleAtHourTimeofday = Rule { name = "at hour " , pattern = [ regex "בשעה" , Predicate isATimeOfDay ] , prod = \tokens -> case tokens of (_:Token Time td:_) -> tt $ notLatent td _ -> Nothing } ruleHourofdayAndInteger :: Rule ruleHourofdayAndInteger = Rule { name = " and " , pattern = [ Predicate isAnHourOfDay , regex "ו" , Predicate $ isIntegerBetween 1 59 ] , prod = \tokens -> case tokens of (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) is12H)}: _: token: _) -> do n <- getIntValue token tt $ hourMinute is12H hours n _ -> Nothing } ruleHourofdayAndQuarter :: Rule ruleHourofdayAndQuarter = Rule { name = " and quarter" , pattern = [ Predicate isAnHourOfDay , regex "ו" , regex "רבע(י)?" ] , prod = \tokens -> case tokens of (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) is12H)}:_) -> tt $ hourMinute is12H hours 15 _ -> Nothing } ruleHourofdayAndHalf :: Rule ruleHourofdayAndHalf = Rule { name = " and half" , pattern = [ Predicate isAnHourOfDay , regex "ו" , regex "חצי|מחצית" ] , prod = \tokens -> case tokens of (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) is12H)}:_) -> tt $ hourMinute is12H hours 30 _ -> Nothing } ruleHourofdayInteger :: Rule ruleHourofdayInteger = Rule { name = " " , pattern = [ Predicate isAnHourOfDay , Predicate $ isIntegerBetween 1 59 ] , prod = \tokens -> case tokens of (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) is12H)}: token: _) -> do n <- getIntValue token tt $ hourMinute is12H hours n _ -> Nothing } ruleHourofdayQuarter :: Rule ruleHourofdayQuarter = Rule { name = " quarter" , pattern = [ Predicate isAnHourOfDay , regex "רבע(י)?" ] , prod = \tokens -> case tokens of (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) is12H)}:_) -> tt $ hourMinute is12H hours 15 _ -> Nothing } ruleHourofdayHalf :: Rule ruleHourofdayHalf = Rule { name = " half" , pattern = [ Predicate isAnHourOfDay , regex "חצי|מחצית" ] , prod = \tokens -> case tokens of (Token Time TimeData {TTime.form = Just (TTime.TimeOfDay (Just hours) is12H)}:_) -> tt $ hourMinute is12H hours 30 _ -> Nothing } ruleIntegerTotillbeforeIntegerHourofday :: Rule ruleIntegerTotillbeforeIntegerHourofday = Rule { name = " to|till|before (hour-of-day)" , pattern = [ Predicate $ isIntegerBetween 1 59 , regex "לפני|ל" , Predicate isAnHourOfDay ] , prod = \tokens -> case tokens of (token:_:Token Time td:_) -> do n <- getIntValue token t <- minutesBefore n td tt t _ -> Nothing } ruleQuarterTotillbeforeIntegerHourofday :: Rule ruleQuarterTotillbeforeIntegerHourofday = Rule { name = "quarter to|till|before (hour-of-day)" , pattern = [ regex "רבע(י)?" , regex "לפני|ל" , Predicate isAnHourOfDay ] , prod = \tokens -> case tokens of (_:_:Token Time td:_) -> Token Time <$> minutesBefore 15 td _ -> Nothing } ruleHalfTotillbeforeIntegerHourofday :: Rule ruleHalfTotillbeforeIntegerHourofday = Rule { name = "half to|till|before (hour-of-day)" , pattern = [ regex "חצי|מחצית" , regex "לפני|ל" , Predicate isAnHourOfDay ] , prod = \tokens -> case tokens of (_:_:Token Time td:_) -> Token Time <$> minutesBefore 30 td _ -> Nothing } ruleIntegerAfterpastIntegerHourofday :: Rule ruleIntegerAfterpastIntegerHourofday = Rule { name = "integer after|past (hour-of-day)" , pattern = [ Predicate $ isIntegerBetween 1 59 , regex "אחרי" , Predicate isAnHourOfDay ] , prod = \tokens -> case tokens of (token:_:Token Time td:_) -> do n <- getIntValue token t <- minutesAfter n td tt t _ -> Nothing } ruleQuarterAfterpastIntegerHourofday :: Rule ruleQuarterAfterpastIntegerHourofday = Rule { name = "quarter after|past (hour-of-day)" , pattern = [ regex "רבע(י)?" , regex "אחרי" , Predicate isAnHourOfDay ] , prod = \tokens -> case tokens of (_:_:Token Time td:_) -> Token Time <$> minutesAfter 15 td _ -> Nothing } ruleHalfAfterpastIntegerHourofday :: Rule ruleHalfAfterpastIntegerHourofday = Rule { name = "half after|past (hour-of-day)" , pattern = [ regex "חצי|מחצית" , regex "אחרי" , Predicate isAnHourOfDay ] , prod = \tokens -> case tokens of (_:Token Time td:_) -> Token Time <$> minutesAfter 30 td _ -> Nothing } ruleNamedday2 :: Rule ruleNamedday2 = Rule { name = "named-day" , pattern = [ regex "(יום )?שני" ] , prod = \_ -> tt $ dayOfWeek 1 } ruleSinceTimeofday :: Rule ruleSinceTimeofday = Rule { name = "since " , pattern = [ regex "מ" , dimension Time ] , prod = \tokens -> case tokens of (_:Token Time td:_) -> tt $ withDirection TTime.After td _ -> Nothing } ruleLastTime :: Rule ruleLastTime = Rule { name = "last