mirror of
https://github.com/facebook/duckling.git
synced 2025-01-08 15:00:59 +03:00
5460d8df0e
Summary: Support custom dimensions Had to move the definition of `Dimension` from `Duckling.Dimensions.Types` to `Duckling.Types` to avoid cyclic imports between these two modules. A sample custom dimension is in `exe/CustomDimensionExample.hs`. Limitations of custom dimensions: - All rules for a custom dimension must be in the same module with the definition of the custom dimension. Otherwise there will be cyclic imports, because the definition of the dimension and the rules refer to each other. - The custom dimension must be specified when using `parse`, since there's no way to get all the existing custom dimensions. Reviewed By: patapizza Differential Revision: D7630360 fbshipit-source-id: 30e12dcb33611f5692c4f5949de377bf61b75e1e
123 lines
5.5 KiB
Haskell
123 lines
5.5 KiB
Haskell
-- 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 #-}
|
|
|
|
module Duckling.Dimensions
|
|
( allDimensions
|
|
, explicitDimensions
|
|
) where
|
|
|
|
import Data.HashSet (HashSet)
|
|
import Prelude
|
|
import qualified Data.HashSet as HashSet
|
|
|
|
import Duckling.Dimensions.Types
|
|
import Duckling.Locale
|
|
import Duckling.Types
|
|
import qualified Duckling.Dimensions.Common as CommonDimensions
|
|
import qualified Duckling.Dimensions.AR as ARDimensions
|
|
import qualified Duckling.Dimensions.BG as BGDimensions
|
|
import qualified Duckling.Dimensions.CS as CSDimensions
|
|
import qualified Duckling.Dimensions.DA as DADimensions
|
|
import qualified Duckling.Dimensions.DE as DEDimensions
|
|
import qualified Duckling.Dimensions.EL as ELDimensions
|
|
import qualified Duckling.Dimensions.EN as ENDimensions
|
|
import qualified Duckling.Dimensions.ES as ESDimensions
|
|
import qualified Duckling.Dimensions.ET as ETDimensions
|
|
import qualified Duckling.Dimensions.FR as FRDimensions
|
|
import qualified Duckling.Dimensions.GA as GADimensions
|
|
import qualified Duckling.Dimensions.HE as HEDimensions
|
|
import qualified Duckling.Dimensions.HI as HIDimensions
|
|
import qualified Duckling.Dimensions.HR as HRDimensions
|
|
import qualified Duckling.Dimensions.HU as HUDimensions
|
|
import qualified Duckling.Dimensions.ID as IDDimensions
|
|
import qualified Duckling.Dimensions.IT as ITDimensions
|
|
import qualified Duckling.Dimensions.JA as JADimensions
|
|
import qualified Duckling.Dimensions.KA as KADimensions
|
|
import qualified Duckling.Dimensions.KO as KODimensions
|
|
import qualified Duckling.Dimensions.MY as MYDimensions
|
|
import qualified Duckling.Dimensions.NB as NBDimensions
|
|
import qualified Duckling.Dimensions.NE as NEDimensions
|
|
import qualified Duckling.Dimensions.NL as NLDimensions
|
|
import qualified Duckling.Dimensions.PL as PLDimensions
|
|
import qualified Duckling.Dimensions.PT as PTDimensions
|
|
import qualified Duckling.Dimensions.RO as RODimensions
|
|
import qualified Duckling.Dimensions.RU as RUDimensions
|
|
import qualified Duckling.Dimensions.SV as SVDimensions
|
|
import qualified Duckling.Dimensions.TA as TADimensions
|
|
import qualified Duckling.Dimensions.TR as TRDimensions
|
|
import qualified Duckling.Dimensions.UK as UKDimensions
|
|
import qualified Duckling.Dimensions.VI as VIDimensions
|
|
import qualified Duckling.Dimensions.ZH as ZHDimensions
|
|
|
|
allDimensions :: Lang -> [Some Dimension]
|
|
allDimensions lang = CommonDimensions.allDimensions ++ langDimensions lang
|
|
|
|
-- | Augments `targets` with all dependent dimensions.
|
|
explicitDimensions :: HashSet (Some Dimension) -> HashSet (Some Dimension)
|
|
explicitDimensions targets = HashSet.union targets deps
|
|
where
|
|
deps = HashSet.unions . map dependents $ HashSet.toList targets
|
|
|
|
-- | Ordinal depends on Numeral for JA, KO, and ZH.
|
|
dependents :: Some Dimension -> HashSet (Some Dimension)
|
|
dependents (This Distance) = HashSet.singleton (This Numeral)
|
|
dependents (This Duration) = HashSet.fromList [This Numeral, This TimeGrain]
|
|
dependents (This Numeral) = HashSet.empty
|
|
dependents (This Email) = HashSet.empty
|
|
dependents (This AmountOfMoney) = HashSet.singleton (This Numeral)
|
|
dependents (This Ordinal) = HashSet.singleton (This Numeral)
|
|
dependents (This PhoneNumber) = HashSet.empty
|
|
dependents (This Quantity) = HashSet.singleton (This Numeral)
|
|
dependents (This RegexMatch) = HashSet.empty
|
|
dependents (This Temperature) = HashSet.singleton (This Numeral)
|
|
dependents (This Time) =
|
|
HashSet.fromList [This Numeral, This Duration, This Ordinal, This TimeGrain]
|
|
dependents (This TimeGrain) = HashSet.empty
|
|
dependents (This Url) = HashSet.empty
|
|
dependents (This Volume) = HashSet.singleton (This Numeral)
|
|
dependents (This (CustomDimension dim)) = dimDependents dim
|
|
|
|
langDimensions :: Lang -> [Some Dimension]
|
|
langDimensions AR = ARDimensions.allDimensions
|
|
langDimensions BG = BGDimensions.allDimensions
|
|
langDimensions CS = CSDimensions.allDimensions
|
|
langDimensions DA = DADimensions.allDimensions
|
|
langDimensions DE = DEDimensions.allDimensions
|
|
langDimensions EL = ELDimensions.allDimensions
|
|
langDimensions EN = ENDimensions.allDimensions
|
|
langDimensions ES = ESDimensions.allDimensions
|
|
langDimensions ET = ETDimensions.allDimensions
|
|
langDimensions FR = FRDimensions.allDimensions
|
|
langDimensions GA = GADimensions.allDimensions
|
|
langDimensions HE = HEDimensions.allDimensions
|
|
langDimensions HI = HIDimensions.allDimensions
|
|
langDimensions HR = HRDimensions.allDimensions
|
|
langDimensions HU = HUDimensions.allDimensions
|
|
langDimensions ID = IDDimensions.allDimensions
|
|
langDimensions IT = ITDimensions.allDimensions
|
|
langDimensions JA = JADimensions.allDimensions
|
|
langDimensions KA = KADimensions.allDimensions
|
|
langDimensions KO = KODimensions.allDimensions
|
|
langDimensions MY = MYDimensions.allDimensions
|
|
langDimensions NB = NBDimensions.allDimensions
|
|
langDimensions NE = NEDimensions.allDimensions
|
|
langDimensions NL = NLDimensions.allDimensions
|
|
langDimensions PL = PLDimensions.allDimensions
|
|
langDimensions PT = PTDimensions.allDimensions
|
|
langDimensions RO = RODimensions.allDimensions
|
|
langDimensions RU = RUDimensions.allDimensions
|
|
langDimensions SV = SVDimensions.allDimensions
|
|
langDimensions TA = TADimensions.allDimensions
|
|
langDimensions TR = TRDimensions.allDimensions
|
|
langDimensions UK = UKDimensions.allDimensions
|
|
langDimensions VI = VIDimensions.allDimensions
|
|
langDimensions ZH = ZHDimensions.allDimensions
|