Duration/DE+EN: integer <hours> and <minutes> to accept valid minutes

Summary:
* as title
* refactored `numberBetween` to be a `Predicate`

Reviewed By: nishsinghal20

Differential Revision: D34180649

fbshipit-source-id: 8fbe6db83e8b22181bd0bbde533e2d3390d24c75
This commit is contained in:
Julien Odent 2022-02-12 00:05:20 -08:00 committed by Facebook GitHub Bot
parent 03c6197283
commit c6a48a1d06
41 changed files with 131 additions and 109 deletions

View File

@ -226,7 +226,7 @@ ruleOneDollarAnd = Rule
{ name = "one dollar and x dimes (short form)"
, pattern =
[ regex ""
, numberBetween 1 10
, Predicate $ numberBetween 1 10
]
, prod = \case
(_:Token Numeral NumeralData{TNumeral.value = v}:_) ->

View File

@ -19,7 +19,7 @@ import Duckling.Regex.Types
import Control.Monad (join)
import qualified Data.Text as Text
import Prelude
import Duckling.Numeral.Helpers (parseInteger)
import Duckling.Numeral.Helpers (numberBetween, parseInteger)
import Duckling.Duration.Types (DurationData(..))
import qualified Duckling.Duration.Types as TDuration
import Data.String
@ -216,7 +216,7 @@ ruleHoursAndMinutes = Rule
, pattern =
[ Predicate isNatural
, regex "(ein(en?) )?stunden?( und)?"
, Predicate isNatural
, Predicate $ and . sequence [isNatural, numberBetween 1 60]
, Predicate $ isGrain TG.Minute
]
, prod = \case

View File

@ -20,7 +20,7 @@ import qualified Data.Text as Text
import Duckling.Dimensions.Types
import Duckling.Duration.Helpers
import Duckling.Duration.Types (DurationData(..))
import Duckling.Numeral.Helpers (parseInteger)
import Duckling.Numeral.Helpers (numberBetween, parseInteger)
import Duckling.Numeral.Types (NumeralData(..))
import Duckling.Regex.Types
import Duckling.Types
@ -180,7 +180,7 @@ ruleDurationHoursAndMinutes = Rule
, pattern =
[ Predicate isNatural
, regex "hours?( and)?"
, Predicate isNatural
, Predicate $ and . sequence [isNatural, numberBetween 1 60]
]
, prod = \case
(Token Numeral h:

View File

@ -124,7 +124,7 @@ ruleCompositeTens :: Rule
ruleCompositeTens = Rule
{ name = "integer ([3-9][1-9])"
, pattern =
[ numberBetween 1 10
[ Predicate $ numberBetween 1 10
, regex "en"
, oneOf [20, 30..90]
]

View File

@ -42,7 +42,7 @@ ruleInteger23 = Rule
, pattern =
[ oneOf [100, 200 .. 900]
, regex "و"
, numberBetween 1 100
, Predicate $ numberBetween 1 100
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = v1}:
@ -86,7 +86,7 @@ ruleInteger22 :: Rule
ruleInteger22 = Rule
{ name = "integer 21..99"
, pattern =
[ numberBetween 1 10
[ Predicate $ numberBetween 1 10
, regex "و"
, oneOf [20, 30 .. 90]
]
@ -102,7 +102,7 @@ ruleInteger21 :: Rule
ruleInteger21 = Rule
{ name = "integer (13..19)"
, pattern =
[ numberBetween 3 10
[ Predicate $ numberBetween 3 10
, numberWith TNumeral.value (== 10)
]
, prod = \tokens -> case tokens of

View File

@ -111,7 +111,7 @@ ruleCompositeTens = Rule
, pattern =
[ oneOf [20, 30..90]
, regex "и"
, numberBetween 1 10
, Predicate $ numberBetween 1 10
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = tens}:
@ -147,7 +147,7 @@ ruleCompositeHundreds = Rule
{ name = "integer 101..999"
, pattern =
[ oneOf [200, 300..900]
, numberBetween 1 100
, Predicate $ numberBetween 1 100
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = hundreds}:

View File

@ -140,7 +140,10 @@ ruleHigherTensWithOnes :: Rule
ruleHigherTensWithOnes = Rule
{ name = "number (31..39 41..49 51..59 61..69 71..79 81..89 91..99)"
, pattern =
[oneOf [30, 40, 50, 60, 70, 80, 90], regex "-", numberBetween 1 9]
[ oneOf [30, 40, 50, 60, 70, 80, 90]
, regex "-"
, Predicate $ numberBetween 1 9
]
, prod = \case
(Token Numeral NumeralData{TNumeral.value = v1}:
_:
@ -185,7 +188,10 @@ ruleTwenties :: Rule
ruleTwenties = Rule
{ name = "number (21..29)"
, pattern =
[oneOf [20], regex "(-i-| i )", numberBetween 1 10]
[ oneOf [20]
, regex "(-i-| i )"
, Predicate $ numberBetween 1 10
]
, prod = \case
(Token Numeral NumeralData{TNumeral.value = v1}:
_:
@ -212,10 +218,10 @@ ruleNumerals :: Rule
ruleNumerals = Rule
{ name = "numbers 200..999"
, pattern =
[ numberBetween 2 10
[ Predicate $ numberBetween 2 10
, regex "-"
, numberWith TNumeral.value (== 100)
, numberBetween 0 100
, Predicate $ numberBetween 0 100
]
, prod = \case
(Token Numeral NumeralData{TNumeral.value = v1}:
@ -242,7 +248,7 @@ ruleBelowTenWithTwoDigits = Rule
{ name = "integer (0-9) with two digits"
, pattern =
[ regex "zero|0"
, numberBetween 1 10
, Predicate $ numberBetween 1 10
]
, prod = \case
(_:Token Numeral NumeralData{TNumeral.value = v}:_) -> double v

View File

@ -87,7 +87,7 @@ ruleInteger3 = Rule
{ name = "integer 21..99"
, pattern =
[ oneOf [20, 30 .. 90]
, numberBetween 1 10
, Predicate $ numberBetween 1 10
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = v1}:
@ -170,7 +170,7 @@ ruleNumeralsOg :: Rule
ruleNumeralsOg = Rule
{ name = "numbers og"
, pattern =
[ numberBetween 1 10
[ Predicate $ numberBetween 1 10
, regex "og"
, oneOf [70, 20, 60, 50, 40, 90, 30, 80]
]

View File

@ -123,7 +123,7 @@ ruleNumeralsUnd :: Rule
ruleNumeralsUnd = Rule
{ name = "numbers und"
, pattern =
[ numberBetween 1 10
[ Predicate $ numberBetween 1 10
, regex "und"
, oneOf [20, 30 .. 90]
]

View File

@ -123,7 +123,7 @@ ruleCompositeTens = Rule
{ name = "integer 21..99"
, pattern =
[ oneOf [20,30..90]
, numberBetween 1 10
, Predicate $ numberBetween 1 10
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = tens} :

View File

@ -161,7 +161,7 @@ ruleCompositeTens = Rule
, pattern =
[ oneOf [20,30..90]
, regex "[\\s\\-]+"
, numberBetween 1 10
, Predicate $ numberBetween 1 10
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = tens}:

View File

@ -69,9 +69,8 @@ ruleBelowTenWithTwoDigits = Rule
{
name = "integer (0-9) with two digits"
, pattern =
[
regex "((c|z)ero)|0"
, numberBetween 1 10
[ regex "((c|z)ero)|0"
, Predicate $ numberBetween 1 10
]
, prod = \case
(
@ -124,12 +123,17 @@ ruleNumeralSixteenToTwentyNine = Rule
ruleNumeralSixteenToNineteenWithDiez :: Rule
ruleNumeralSixteenToNineteenWithDiez = Rule
{ name = "number (16..19, two words)"
, pattern = [numberWith TNumeral.value (== 10), regex "y", numberBetween 6 10]
, pattern =
[ numberWith TNumeral.value (== 10)
, regex "y"
, Predicate $ numberBetween 6 10
]
, prod = \case
(_ : _ : Token Numeral NumeralData { TNumeral.value = v } : _) ->
double $ 10 + v
_ -> Nothing
}
byTensMap :: HashMap.HashMap Text.Text Integer
byTensMap =
HashMap.fromList
@ -161,7 +165,10 @@ ruleNumeralTwentyOneToNinetyNine :: Rule
ruleNumeralTwentyOneToNinetyNine = Rule
{ name = "number (21..29 31..39 41..49 51..59 61..69 71..79 81..89 91..99)"
, pattern =
[oneOf [20, 30 .. 90], regex "y", numberBetween 1 10]
[ oneOf [20, 30 .. 90]
, regex "y"
, Predicate $ numberBetween 1 10
]
, prod = \case
(Token Numeral NumeralData { TNumeral.value = v1 } : _ : Token Numeral NumeralData { TNumeral.value = v2 } : _) ->
double $ v1 + v2
@ -221,7 +228,7 @@ ruleTwoPartHundreds :: Rule
ruleTwoPartHundreds = Rule
{ name = "2..9 cientos"
, pattern =
[ numberBetween 2 10
[ Predicate $ numberBetween 2 10
, regex "cientos"
]
, prod = \case
@ -235,7 +242,7 @@ ruleNumeralHundredsAndSmaller = Rule
{ name = "<hundreds> 0..99"
, pattern =
[ numberWith TNumeral.value (TNumeral.isMultiple 100)
, numberBetween 0 100
, Predicate $ numberBetween 0 100
]
, prod = \case
(Token Numeral NumeralData { TNumeral.value = v1 } : Token Numeral NumeralData { TNumeral.value = v2 } : _)
@ -247,7 +254,7 @@ ruleNumeralMultiply :: Rule
ruleNumeralMultiply = Rule
{ name = "2..999 <multipliable>"
, pattern =
[ numberBetween 2 1000
[ Predicate $ numberBetween 2 1000
, Predicate isMultipliable
]
, prod = \case
@ -261,7 +268,7 @@ ruleNumeralThousandsAnd = Rule
{ name = "<thousands> 0..999"
, pattern =
[ numberWith TNumeral.value (TNumeral.isMultiple 1000)
, numberBetween 0 999
, Predicate $ numberBetween 0 999
]
, prod = \case
(Token Numeral NumeralData { TNumeral.value = v1 } : Token Numeral NumeralData { TNumeral.value = v2 } : _)
@ -274,7 +281,7 @@ ruleNumeralMillionsAnd = Rule
{ name = "<millions> 0..999999"
, pattern =
[ numberWith TNumeral.value (TNumeral.isMultiple 1000000)
, numberBetween 0 999999
, Predicate $ numberBetween 0 999999
]
, prod = \case
(Token Numeral NumeralData { TNumeral.value = v1 } : Token Numeral NumeralData { TNumeral.value = v2 } : _)

View File

@ -87,7 +87,7 @@ ruleInteger3 = Rule
{ name = "integer 21..99"
, pattern =
[ oneOf [70, 20, 60, 50, 40, 90, 30, 80]
, numberBetween 1 10
, Predicate $ numberBetween 1 10
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = v1}:

View File

@ -135,7 +135,7 @@ ruleCompositeTens = Rule
, pattern =
[ oneOf [20,30..90]
, regex "و"
, numberBetween 1 10
, Predicate $ numberBetween 1 10
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = tens}:
@ -151,7 +151,7 @@ ruleCompositeHundred = Rule
, pattern =
[ oneOf [100,200..900]
, regex "و"
, numberBetween 1 100
, Predicate $ numberBetween 1 100
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = tens}:

View File

@ -57,7 +57,7 @@ ruleNumerals2 = Rule
, pattern =
[ oneOf [20, 50, 40, 30]
, regex "[\\s\\-]+"
, numberBetween 2 10
, Predicate $ numberBetween 2 10
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = v1}:
@ -119,7 +119,7 @@ ruleNumerals5 = Rule
, pattern =
[ oneOf [60, 80]
, regex "[\\s\\-]+"
, numberBetween 2 20
, Predicate $ numberBetween 2 20
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = v1}:
@ -170,7 +170,7 @@ ruleNumeral3 = Rule
, pattern =
[ numberWith TNumeral.value (== 10)
, regex "[\\s\\-]+"
, numberBetween 7 10
, Predicate $ numberBetween 7 10
]
, prod = \tokens -> case tokens of
(_:

View File

@ -68,7 +68,7 @@ ruleCompositeTens = Rule
{ name = "integer 21..99"
, pattern =
[ oneOf [ 20, 30..90 ]
, numberBetween 1 10
, Predicate $ numberBetween 1 10
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = tens}:
@ -83,7 +83,7 @@ ruleCompositeTensWithAnd = Rule
, pattern =
[ oneOf [ 20, 30..90 ]
, regex "ו"
, numberBetween 1 10
, Predicate $ numberBetween 1 10
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = tens}:
@ -230,7 +230,7 @@ ruleInteger14 :: Rule
ruleInteger14 = Rule
{ name = "integer 11..19"
, pattern =
[ numberBetween 1 10
[ Predicate $ numberBetween 1 10
, numberWith TNumeral.value (== 10)
]
, prod = \tokens -> case tokens of
@ -263,7 +263,7 @@ ruleInteger16 = Rule
{ name = "integer 101..999"
, pattern =
[ oneOf [300, 600, 500, 100, 800, 200, 900, 700, 400]
, numberBetween 1 100
, Predicate $ numberBetween 1 100
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = v1}:

View File

@ -222,7 +222,7 @@ ruleCompositeHundreds = Rule
, pattern =
[ oneOf [100,200..5000]
, regex "[\\s\\-]+"
, numberBetween 1 99
, Predicate $ numberBetween 1 99
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = hundreds}:
@ -239,7 +239,7 @@ ruleCompositeThousands = Rule
, pattern =
[ oneOf [1000,2000..50000]
, regex "[\\s\\-]+"
, numberBetween 1 999
, Predicate $ numberBetween 1 999
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = thousands}:

View File

@ -143,7 +143,7 @@ ruleNumbersI = Rule
, pattern =
[ oneOf [70, 20, 60, 50, 40, 90, 30, 80]
, regex "i"
, numberBetween 1 10
, Predicate $ numberBetween 1 10
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = v1}:
@ -255,7 +255,7 @@ ruleInteger4 = Rule
{ name = "integer 21..99"
, pattern =
[ oneOf [70, 20, 60, 50, 40, 90, 30, 80]
, numberBetween 1 10
, Predicate $ numberBetween 1 10
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = v1}:
@ -290,9 +290,9 @@ ruleNumbers :: Rule
ruleNumbers = Rule
{ name = "numbers 100..999"
, pattern =
[ numberBetween 1 10
[ Predicate $ numberBetween 1 10
, numberWith TNumeral.value (== 100)
, numberBetween 0 100
, Predicate $ numberBetween 0 100
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = v1}:

View File

@ -101,12 +101,10 @@ numberWith f pred = Predicate $ \x ->
(Token Numeral x@NumeralData{}) -> pred (f x)
_ -> False
numberBetween :: Double -> Double -> PatternItem
numberBetween low up = Predicate $ \x ->
case x of
(Token Numeral NumeralData {value = v, multipliable = False}) ->
low <= v && v < up
_ -> False
numberBetween :: Double -> Double -> Predicate
numberBetween low up (Token Numeral NumeralData {value = v, multipliable = False}) =
low <= v && v < up
numberBetween _ _ _ = False
isNatural :: Predicate
isNatural (Token Numeral NumeralData {value = v}) =

View File

@ -47,7 +47,7 @@ ruleTeen :: Rule
ruleTeen = Rule
{ name = "teen"
, pattern =
[ numberBetween 2 10
[ Predicate $ numberBetween 2 10
, regex "belas"
]
, prod = \tokens -> case tokens of
@ -132,7 +132,7 @@ ruleInteger3 = Rule
{ name = "integer 21..99"
, pattern =
[ oneOf [70, 20, 60, 50, 40, 90, 30, 80]
, numberBetween 1 10
, Predicate $ numberBetween 1 10
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = v1}:
@ -222,7 +222,7 @@ ruleInteger2 :: Rule
ruleInteger2 = Rule
{ name = "integer 20..90"
, pattern =
[ numberBetween 2 10
[ Predicate $ numberBetween 2 10
, numberWith TNumeral.value (== 10)
]
, prod = \tokens -> case tokens of

View File

@ -159,7 +159,7 @@ ruleNumeral3 = Rule
, pattern =
[ oneOf [70, 20, 60, 50, 40, 90, 30, 80]
, regex "e"
, numberBetween 1 10
, Predicate $ numberBetween 1 10
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = v1}:
@ -287,9 +287,9 @@ ruleNumerals :: Rule
ruleNumerals = Rule
{ name = "numbers 200..999"
, pattern =
[ numberBetween 2 10
[ Predicate $ numberBetween 2 10
, numberWith TNumeral.value (== 100)
, numberBetween 0 100
, Predicate $ numberBetween 0 100
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = v1}:

View File

@ -52,7 +52,7 @@ ruleInteger10 = Rule
{ name = "integer (1000..1999)"
, pattern =
[ regex ""
, numberBetween 1 1000
, Predicate $ numberBetween 1 1000
]
, prod = \tokens -> case tokens of
(_:Token Numeral NumeralData{TNumeral.value = v}:_) ->
@ -76,7 +76,7 @@ ruleInteger15 :: Rule
ruleInteger15 = Rule
{ name = "integer (20000..90000)"
, pattern =
[ numberBetween 2 10
[ Predicate $ numberBetween 2 10
, regex ""
]
, prod = \tokens -> case tokens of
@ -111,7 +111,7 @@ ruleInteger3 :: Rule
ruleInteger3 = Rule
{ name = "integer (20..90)"
, pattern =
[ numberBetween 2 10
[ Predicate $ numberBetween 2 10
, regex ""
]
, prod = \tokens -> case tokens of
@ -133,7 +133,7 @@ ruleInteger6 = Rule
{ name = "integer (100..199)"
, pattern =
[ regex ""
, numberBetween 1 100
, Predicate $ numberBetween 1 100
]
, prod = \tokens -> case tokens of
(_:Token Numeral NumeralData{TNumeral.value = v}:_) -> double $ v + 100
@ -145,7 +145,7 @@ ruleInteger12 = Rule
{ name = "integer 2001..9999"
, pattern =
[ oneOf [3000, 9000, 7000, 8000, 2000, 4000, 6000, 5000]
, numberBetween 1 1000
, Predicate $ numberBetween 1 1000
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = v1}:
@ -178,7 +178,7 @@ ruleInteger7 :: Rule
ruleInteger7 = Rule
{ name = "integer (200..900)"
, pattern =
[ numberBetween 2 10
[ Predicate $ numberBetween 2 10
, regex ""
]
, prod = \tokens -> case tokens of
@ -191,7 +191,7 @@ ruleInteger14 = Rule
{ name = "integer (10000..19999)"
, pattern =
[ regex ""
, numberBetween 1 10000
, Predicate $ numberBetween 1 10000
]
, prod = \tokens -> case tokens of
(_:Token Numeral NumeralData{TNumeral.value = v}:_) ->
@ -204,7 +204,7 @@ ruleInteger8 = Rule
{ name = "integer 201..999"
, pattern =
[ oneOf [300, 600, 500, 800, 200, 900, 700, 400]
, numberBetween 1 100
, Predicate $ numberBetween 1 100
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = v1}:
@ -218,7 +218,7 @@ ruleInteger16 = Rule
{ name = "integer 20001..99999"
, pattern =
[ oneOf [20000, 40000, 80000, 60000, 30000, 70000, 90000, 50000]
, numberBetween 1 10000
, Predicate $ numberBetween 1 10000
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = v1}:
@ -269,7 +269,7 @@ ruleInteger4 = Rule
{ name = "integer 21..99"
, pattern =
[ oneOf [70, 20, 60, 50, 40, 90, 30, 80]
, numberBetween 1 10
, Predicate $ numberBetween 1 10
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = v1}:
@ -283,7 +283,7 @@ ruleInteger2 = Rule
{ name = "integer (11..19)"
, pattern =
[ regex ""
, numberBetween 1 10
, Predicate $ numberBetween 1 10
]
, prod = \tokens -> case tokens of
(_:Token Numeral NumeralData{TNumeral.value = v}:_) -> double $ v + 10
@ -294,7 +294,7 @@ ruleInteger11 :: Rule
ruleInteger11 = Rule
{ name = "integer (2000..9000)"
, pattern =
[ numberBetween 2 10
[ Predicate $ numberBetween 2 10
, regex ""
]
, prod = \tokens -> case tokens of

View File

@ -209,7 +209,7 @@ ruleCompositeTens = Rule
{ name = "integer 21..99"
, pattern =
[ oneOf [20,40..90]
, numberBetween 1 20
, Predicate $ numberBetween 1 20
]
, prod = \case
(Token Numeral NumeralData{TNumeral.value = tens}:
@ -224,7 +224,7 @@ ruleCompositeHundreds = Rule
, pattern =
[ oneOf [100,200..900]
, oneOf [20,40..90]
, numberBetween 1 20
, Predicate $ numberBetween 1 20
]
, prod = \case
(Token Numeral NumeralData{TNumeral.value = hundreds}:
@ -239,7 +239,7 @@ ruleCompositeHundredsAndUnits = Rule
{ name = "integer 100..999"
, pattern =
[ oneOf [100,200..900]
, numberBetween 1 20
, Predicate $ numberBetween 1 20
]
, prod = \case
(Token Numeral NumeralData{TNumeral.value = hundreds}:

View File

@ -112,7 +112,7 @@ ruleNumeralsUnd = Rule
{ name = "numbers und"
, pattern =
[ oneOf [20, 30 .. 90]
, numberBetween 1 10
, Predicate $ numberBetween 1 10
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = v1}:

View File

@ -29,9 +29,9 @@ ruleInteger5 :: Rule
ruleInteger5 = Rule
{ name = "integer (11..99) "
, pattern =
[ numberBetween 1 10
[ Predicate $ numberBetween 1 10
, regex "ဆယ့်"
, numberBetween 1 10
, Predicate $ numberBetween 1 10
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = v1}:
@ -72,7 +72,7 @@ ruleInteger3 = Rule
{ name = "integer (11..19) "
, pattern =
[ regex "ဆယ့်"
, numberBetween 1 10
, Predicate $ numberBetween 1 10
]
, prod = \tokens -> case tokens of
(_:Token Numeral NumeralData{TNumeral.value = v}:_) -> double $ v + 10
@ -102,7 +102,7 @@ ruleInteger6 :: Rule
ruleInteger6 = Rule
{ name = "integer (100..900)"
, pattern =
[ numberBetween 1 10
[ Predicate $ numberBetween 1 10
, regex "ရာ"
]
, prod = \tokens -> case tokens of
@ -114,7 +114,7 @@ ruleInteger7 :: Rule
ruleInteger7 = Rule
{ name = "integer (1000..9000)"
, pattern =
[ numberBetween 1 10
[ Predicate $ numberBetween 1 10
, regex "ထောင်"
]
, prod = \tokens -> case tokens of
@ -126,7 +126,7 @@ ruleInteger8 :: Rule
ruleInteger8 = Rule
{ name = "integer (10000..90000)"
, pattern =
[ numberBetween 1 10
[ Predicate $ numberBetween 1 10
, regex "သောင်း"
]
, prod = \tokens -> case tokens of
@ -147,7 +147,7 @@ ruleInteger4 :: Rule
ruleInteger4 = Rule
{ name = "integer (10..90)"
, pattern =
[ numberBetween 1 10
[ Predicate $ numberBetween 1 10
, regex "ဆယ်"
]
, prod = \tokens -> case tokens of

View File

@ -107,7 +107,7 @@ ruleInteger3 = Rule
{ name = "integer 21..99"
, pattern =
[ oneOf [70, 20, 60, 50, 40, 90, 30, 80]
, numberBetween 1 10
, Predicate $ numberBetween 1 10
]
, prod = \case
(Token Numeral NumeralData{TNumeral.value = v1}:

View File

@ -146,7 +146,7 @@ ruleNumeralsEn :: Rule
ruleNumeralsEn = Rule
{ name = "numbers en"
, pattern =
[ numberBetween 1 10
[ Predicate $ numberBetween 1 10
, regex "-?en-?"
, oneOf [20, 30 .. 90]
]

View File

@ -137,8 +137,8 @@ ruleSpecialCompositionForMissingHundredsLikeInOneTwentyTwo :: Rule
ruleSpecialCompositionForMissingHundredsLikeInOneTwentyTwo = Rule
{ name = "special composition for missing hundreds like in one twenty two"
, pattern =
[ numberBetween 1 10
, numberBetween 10 100
[ Predicate $ numberBetween 1 10
, Predicate $ numberBetween 10 100
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = v1}:
@ -516,7 +516,7 @@ ruleInteger2 = Rule
{ name = "integer 21..99"
, pattern =
[ oneOf [20, 30 .. 90]
, numberBetween 1 10
, Predicate $ numberBetween 1 10
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = v1}:

View File

@ -173,7 +173,7 @@ ruleCompositeTens = Rule
{ name = "integer 21..99"
, pattern =
[ oneOf [20,30..90]
, numberBetween 1 10
, Predicate $ numberBetween 1 10
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = tens}:
@ -188,7 +188,7 @@ ruleDecsAnd = Rule
, pattern =
[ oneOf [20, 30..90]
, regex "e"
, numberBetween 1 10
, Predicate $ numberBetween 1 10
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = v1}:
@ -203,7 +203,7 @@ ruleCompositeCents = Rule
{ name = "integer 101..999"
, pattern =
[ oneOf [100, 200..900]
, numberBetween 1 100
, Predicate $ numberBetween 1 100
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = hundreds}:
@ -218,7 +218,7 @@ ruleCentsAnd = Rule
, pattern =
[ oneOf [100, 200..900]
, regex "e"
, numberBetween 1 100
, Predicate $ numberBetween 1 100
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = v1}:
@ -232,8 +232,8 @@ ruleSkipHundreds :: Rule
ruleSkipHundreds = Rule
{ name = "one twenty two"
, pattern =
[ numberBetween 1 10
, numberBetween 10 100
[ Predicate $ numberBetween 1 10
, Predicate $ numberBetween 10 100
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = hundreds}:

View File

@ -69,7 +69,7 @@ ruleInteger3 = Rule
{ name = "integer 21..99"
, pattern =
[ oneOf [20, 30 .. 90]
, numberBetween 1 10
, Predicate $ numberBetween 1 10
]
, prod = \case
(Token Numeral NumeralData{TNumeral.value = v1}:

View File

@ -179,7 +179,7 @@ ruleInteger7 = Rule
{ name = "integer 21..99"
, pattern =
[ oneOf [70, 20, 60, 50, 40, 90, 30, 80]
, numberBetween 1 10
, Predicate $ numberBetween 1 10
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = v1}:
@ -193,7 +193,7 @@ ruleInteger8 = Rule
{ name = "integer 101..999"
, pattern =
[ oneOf [300, 600, 500, 100, 800, 200, 900, 700, 400]
, numberBetween 1 100
, Predicate $ numberBetween 1 100
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = v1}:

View File

@ -98,7 +98,7 @@ ruleIntegerCompositeTens = Rule
{ name = "integer 21..99"
, pattern =
[ oneOf [20, 30..90]
, numberBetween 1 10
, Predicate $ numberBetween 1 10
]
, prod = \case
(Token Numeral NumeralData{TNumeral.value = tens}:

View File

@ -96,7 +96,7 @@ ruleInteger3 = Rule
{ name = "integer 21..99"
, pattern =
[ oneOf [70, 20, 60, 50, 40, 90, 30, 80]
, numberBetween 1 10
, Predicate $ numberBetween 1 10
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = v1}:

View File

@ -87,7 +87,7 @@ ruleCompositeTens = Rule
{ name = "integer 11..19 21..29 .. 91..99"
, pattern = [oneOf [20,30..90]
, regex "-?na-?"
, numberBetween 1 10]
, Predicate $ numberBetween 1 10]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = v1}:
Token Numeral NumeralData{TNumeral.value = v2}:

View File

@ -246,7 +246,7 @@ ruleCompositeTens = Rule
, pattern =
[ oneOf [20,30..90]
, regex "[\\s\\-]+"
, numberBetween 1 10
, Predicate $ numberBetween 1 10
]
, prod = \case
(Token Numeral NumeralData{TNumeral.value = tens}:

View File

@ -607,7 +607,7 @@ ruleInteger4 = Rule
{ name = "integer 11..99"
, pattern =
[ oneOf [70, 20, 60, 50, 40, 90, 30, 10, 80]
, numberBetween 1 10
, Predicate $ numberBetween 1 10
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = v1}:

View File

@ -145,7 +145,7 @@ ruleInteger7 = Rule
{ name = "integer 21..99"
, pattern =
[ oneOf [70, 20, 60, 50, 40, 90, 30, 80]
, numberBetween 1 10
, Predicate $ numberBetween 1 10
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = v1}:
@ -159,7 +159,7 @@ ruleInteger8 = Rule
{ name = "integer 101..999"
, pattern =
[ oneOf [300, 600, 500, 100, 800, 200, 900, 700, 400]
, numberBetween 1 100
, Predicate $ numberBetween 1 100
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = v1}:

View File

@ -101,7 +101,7 @@ ruleInteger3 = Rule
{ name = "integer 21..99"
, pattern =
[ oneOf [20, 30 .. 90]
, numberBetween 1 10
, Predicate $ numberBetween 1 10
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = v1}:

View File

@ -92,7 +92,7 @@ ruleCompositeTens = Rule
, pattern =
[ oneOf [20,30,40]
, regex "[\\s\\-]+"
, numberBetween 1 10
, Predicate $ numberBetween 1 10
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = tens}:
@ -324,7 +324,7 @@ ruleHundredPrefix = Rule
{ name = "one hundred and <integer> (short form)"
, pattern =
[ regex "百|佰"
, numberBetween 1 10
, Predicate $ numberBetween 1 10
]
, prod = \case
(_:Token Numeral NumeralData{TNumeral.value = v}:_) ->
@ -337,7 +337,7 @@ ruleThousandPrefix = Rule
{ name = "one thousand and <integer> (short form)"
, pattern =
[ regex "千|仟"
, numberBetween 1 10
, Predicate $ numberBetween 1 10
]
, prod = \case
(_:Token Numeral NumeralData{TNumeral.value = v}:_) ->
@ -350,7 +350,7 @@ ruleTenThousandPrefix = Rule
{ name = "ten thousand and <integer> (short form)"
, pattern =
[ regex "万|萬"
, numberBetween 1 10
, Predicate $ numberBetween 1 10
]
, prod = \case
(_:Token Numeral NumeralData{TNumeral.value = v}:_) ->

View File

@ -72,7 +72,7 @@ ruleCattyTael = Rule
, pattern =
[ Predicate isPositive
, regex ""
, numberBetween 1 10
, Predicate $ numberBetween 1 10
, regex "两|兩"
]
, prod = \case

View File

@ -12,13 +12,24 @@ module Duckling.Duration.EN.Tests
import Prelude
import Data.String
import Test.Tasty
import Test.Tasty.HUnit
import Duckling.Dimensions.Types
import Duckling.Duration.EN.Corpus
import Duckling.Testing.Asserts
import Duckling.Testing.Types hiding (examples)
import Duckling.Types (Range(..))
tests :: TestTree
tests = testGroup "EN Tests"
[ makeCorpusTest [Seal Duration] corpus
, makeNegativeCorpusTest [Seal Duration] negativeCorpus
, rangeTests
]
rangeTests :: TestTree
rangeTests = testCase "Range Test" $
mapM_ (analyzedRangeTest testContext testOptions . withTargets [Seal Duration]) xs
where
xs = [ ("1 hour 111565513", Range 0 6) -- ruleDurationHoursAndMinutes to accept valid minutes
]