case
      (Token Numeral NumeralData{TNumeral.value = v}:
       Token RegexMatch (GroupMatch (match:_)):
       _) -> do
         unit <- HashMap.lookup match unitsMap
         Just . Token Quantity $ quantity unit v
      _ -> Nothing
  }

quantities :: [(Text, String, TQuantity.Unit)]
quantities =
  [ ("<quantity> grams", "((មីលី|គីឡូ)?ក្រាម)", TQuantity.Gram)
  ]

opsMap :: HashMap Text (Double -> Double)
opsMap = HashMap.fromList
  [ ( "មីលីក្រាម" , (/ 1000))
  , ( "គីឡូក្រាម" , (* 1000))
  ]

ruleNumeralUnits2 :: [Rule]
ruleNumeralUnits2 = map go quantities
  where
    go :: (Text, String, TQuantity.Unit) -> Rule
    go (name, r
ruleNumeralUnits :: Rule
ruleNumeralUnits = Rule
  { name = "<number><units>"
  , pattern =
    [ dimension Numeral
    , regex "(ចាន|ពែង|កែវ|ថូ|ស្លាបព្រា|ស្លាបព្រាបាយ|ស្លាបព្រាកាហ្វេ|នាក់|ក្បាល|ដើម|ទង|ខ្នង|គ្រឿង|កញ្ចប់|ឈុត)"
    ]
  , prod = \case
      (Token Numeral NumeralData{TNumeral.value = v}:
       Token RegexMatch (GroupMatch (match:_)):
       _) -> do
         unit <- HashMap.lookup match unitsMap
         Just . Token Quantity $ quantity unit v
      _ -> Nothing
  }
ruleNumeralUnits = Rule
  { name = "<number><units>"
  , pattern =
    [ dimension Numeral
    , regex "(ចាន|ពែង|កែវ|ថូ|ស្លាបព្រា|ស្លាបព្រាបាយ|ស្លាបព្រាកាហ្វេ|នាក់|ក្បាល|ដើម|ទង|ខ្នង|គ្រឿង|កញ្ចប់|ឈុត)"
    ]
  , prod = \case
      (Token Numeral NumeralData{TNumeral.value = v}:
       Token RegexMatch (GroupMatch (match:_)):
       _) -> do
         unit <- HashMap.lookup match unitsMap
         Just . Token Quantity $ quantity unit v
      _ -> Nothing
  }