Duckling/Ordinal/CA/Rules.hs (96 lines of code) (raw):
-- 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.
{-# LANGUAGE GADTs #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE LambdaCase #-}
module Duckling.Ordinal.CA.Rules
( rules ) where
import qualified Data.HashMap.Strict as HashMap
import qualified Data.Text as Text
import Prelude
import Data.String
import Duckling.Dimensions.Types
import Duckling.Ordinal.Helpers
import Duckling.Regex.Types
import Duckling.Types
ordinalsMap :: HashMap.HashMap Text.Text Int
ordinalsMap = HashMap.fromList
[ ( "primer" , 1 )
, ( "primers" , 1 )
, ( "primera" , 1 )
, ( "primeres" , 1 )
, ( "segon" , 2 )
, ( "segona" , 2 )
, ( "segones" , 2 )
, ( "segons" , 2 )
, ( "tercer" , 3 )
, ( "tercera" , 3 )
, ( "tercers" , 3 )
, ( "terceres" , 3 )
, ( "quart" , 4 )
, ( "quarta" , 4 )
, ( "quarts" , 4 )
, ( "quartes" , 4 )
, ( "cinquè" , 5 )
, ( "cinquena" , 5 )
, ( "cinquens" , 5 )
, ( "cinquenes" , 5 )
, ( "sisè" , 6 )
, ( "sisena" , 6 )
, ( "sisens" , 6 )
, ( "sisenes" , 6 )
, ( "setè" , 7 )
, ( "setena" , 7 )
, ( "setens" , 7 )
, ( "setenes" , 7 )
, ( "vuitè" , 8 )
, ( "vuitena" , 8 )
, ( "vuitens" , 8 )
, ( "vuitenes" , 8 )
, ( "novè" , 9 )
, ( "novena" , 9 )
, ( "novens" , 9 )
, ( "novenes" , 9 )
, ( "desè" , 10 )
, ( "desena" , 10 )
, ( "desens" , 10 )
, ( "desenes" , 10 )
, ( "onzè" , 11 )
, ( "onzena" , 11 )
, ( "dotzè" , 12 )
, ( "dotzena" , 12 )
, ( "tretzè" , 13 )
, ( "tretzena" , 13 )
, ( "catorzè" , 14 )
, ( "catorzena" , 14 )
, ( "quinzè" , 15 )
, ( "quinzena" , 15 )
, ( "setzè" , 16 )
, ( "setzena" , 16 )
, ( "dissetè" , 17 )
, ( "dissetena" , 17 )
, ( "divuitè" , 18 )
, ( "divuitena" , 18 )
, ( "dinovè" , 19 )
, ( "dinovena" , 19 )
, ( "vintè" , 20 )
, ( "vintena" , 20 )
]
ruleOrdinalsPrimero :: Rule
ruleOrdinalsPrimero = Rule
{ name = "ordinals (primero..10)"
, pattern =
[ regex "(primer(a|s|es)?|segon(a|s|es)?|tercer(a|s|es)?|quart(a|s|es)?|cinqu(è|(en(a|s|es)))|sis(è|en(a|s|es))|set(è|en(a|s|es))|vuit(è|en(a|s|es))|nov(è|en(a|s|es))|des(è|en(a|s|es))|onz(è|ena)|dotz(è|ena)|tretz(è|ena)|catorz(è|ena)|quinz(è|ena)|setz(è|ena)|disset(è|ena)|divuit(è|ena)|dinov(è|ena)|vint(è|ena))"
]
, prod = \case
(Token RegexMatch (GroupMatch (match:_)):_) ->
ordinal <$> HashMap.lookup (Text.toLower match) ordinalsMap
_ -> Nothing
}
rules :: [Rule]
rules =
[ ruleOrdinalsPrimero
]