meral.value = hundreds}:
       Token Numeral NumeralData{TNumeral.value = tens}:
       Token Numeral NumeralData{TNumeral.value = units}:
       _) -> double $ hundreds + tens + units
      _ -> Nothing
  }

ruleCompositeHundredsAndUnits :: Rule
ruleCompositeHundredsAndUnits = Rule
  { name = "integer 100..999"
  , pattern =
    [ oneOf [100,200..900]
    , numberBetween 1 20
    ]
  , prod = \case
      (Token Numeral NumeralData{TNumeral.value = hundreds
ruleHundreds :: Rule
ruleHundreds = Rule
  { name = "integer (800..900)"
  , pattern =
    [ regex "(ასი?|ორ ?ასი?|სამ ?ასი?|ოთხ ?ასი?|ხუთ ?ასი?|ექვს ?ასი?|შვიდ ?ასი?|რვა ?ასი?|ცხრა ?ასი?)"
    ]
  , prod = \case
      (Token RegexMatch (GroupMatch (match:_)):_) ->
        HashMap.lookup (Text.toLower match) hundredsMap >>= integer
      _ -> Nothing
  }
ruleHundreds = Rule
  { name = "integer (800..900)"
  , pattern =
    [ regex "(ასი?|ორ ?ასი?|სამ ?ასი?|ოთხ ?ასი?|ხუთ ?ასი?|ექვს ?ასი?|შვიდ ?ასი?|რვა ?ასი?|ცხრა ?ასი?)"
    ]
  , prod = \case
      (Token RegexMatch (GroupMatch (match:_)):_) ->
        HashMap.lookup (Text.toLower match) hundredsMap >>= integer
      _ -> Nothing
  }