-- 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 OverloadedStrings #-} module Duckling.Ordinal.ET.Rules ( rules ) where import qualified Data.Text as Text import Prelude import Data.String import Duckling.Dimensions.Types import Duckling.Numeral.Helpers (parseInt) import Duckling.Ordinal.Helpers import Duckling.Regex.Types import Duckling.Types ruleOrdinalsFirstth :: Rule ruleOrdinalsFirstth = Rule { name = "ordinals (first..19th)" , pattern = [ regex "(esimene|teine|kolmas|neljas|viies|kuues|seitsmes|kaheksas|\x00fcheksas|k\x00fcmnes|\x00fcheteistk\x00fcmnes|kaheteistk\x00fcmnes|kolmeteistk\x00fcmnes|neljateistk\x00fcmnes|viieteistk\x00fcmnes|kuueteistk\x00fcmnes|seitsmeteistk\x00fcmnes|kaheksateistk\x00fcmnes|\x00fcheksateistk\x00fcmnes)" ] , prod = \tokens -> case tokens of (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of "esimene" -> Just $ ordinal 1 "teine" -> Just $ ordinal 2 "kolmas" -> Just $ ordinal 3 "neljas" -> Just $ ordinal 4 "viies" -> Just $ ordinal 5 "kuues" -> Just $ ordinal 6 "seitsmes" -> Just $ ordinal 7 "kaheksas" -> Just $ ordinal 8 "\x00fcheksas" -> Just $ ordinal 9 "k\x00fcmnes" -> Just $ ordinal 10 "\x00fcheteistk\x00fcmnes" -> Just $ ordinal 11 "kaheteistk\x00fcmnes" -> Just $ ordinal 12 "kolmeteistk\x00fcmnes" -> Just $ ordinal 13 "neljateistk\x00fcmnes" -> Just $ ordinal 14 "viieteistk\x00fcmnes" -> Just $ ordinal 15 "kuueteistk\x00fcmnes" -> Just $ ordinal 16 "seitsmeteistk\x00fcmnes" -> Just $ ordinal 17 "kaheksateistk\x00fcmnes" -> Just $ ordinal 18 "\x00fcheksateistk\x00fcmnes" -> Just $ ordinal 19 _ -> Nothing _ -> Nothing } ruleOrdinalDigits :: Rule ruleOrdinalDigits = Rule { name = "ordinal (digits)" , pattern = [ regex "0*(\\d+)\\." ] , prod = \tokens -> case tokens of (Token RegexMatch (GroupMatch (match:_)):_) -> ordinal <$> parseInt match _ -> Nothing } rules :: [Rule] rules = [ ruleOrdinalDigits , ruleOrdinalsFirstth ]