okkhor 0.9.0

A Rust library for English to Bangla phonetic conversion implementing the 'Avro' rules
Documentation
use crate::parser::{CharType::*, Match::*, Pattern, Patterns, Rule};

const REGEX_PATTERNS: &[Pattern] = &[
    Pattern::simple_replace("chchh", "((চ্ছ)|((চ|ছ|([চছ]্?(হ|ঃ|(হ্‌?))))্?(((চ|ছ|([চছ]্?(হ|ঃ|(হ্‌?))))্?((হ|ঃ|(হ্‌?)))?)|([চছ]্?((হ|ঃ|(হ্‌?))্?(হ|ঃ|(হ্‌?))))|([চছ]্?(হ|ঃ|(হ্‌?))্?(হ|ঃ|(হ্‌?)))))|((চ|ছ|([চছ]্?(হ|ঃ|(হ্‌?))))্?(চ|ছ|([চছ]্?(হ|ঃ|(হ্‌?))))্?(হ|ঃ|(হ্‌?)))|([চছ]্?(হ|ঃ|(হ্‌?))্?[চছ]্?(হ|ঃ|(হ্‌?))্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("ngkkh", "(((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং]্?(গ|(জ্ঞ))))্?((ক্ষ)|((ক্?ক?)্?(হ|ঃ|(হ্‌?)))|(ক?্?(খ|(ক্ষ)|(ক্?(হ|ঃ|(হ্‌?)))))|(ক্?ক্?(হ|ঃ|(হ্‌?)))))|((((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং]্?(গ|(জ্ঞ))))্?ক)|([নণঁঙঞং]্?(গ|(জ্ঞ))্?ক))্?(খ|(ক্ষ)|(ক্?(হ|ঃ|(হ্‌?)))))|((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং]্?(গ|(জ্ঞ))))্?ক্?(খ|(ক্ষ)|(ক্?(হ|ঃ|(হ্‌?)))))|((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং]্?(গ|(জ্ঞ))))্?(ক্?ক?)্?(হ|ঃ|(হ্‌?)))|([নণঁঙঞং]্?(গ|(জ্ঞ))্?ক্?ক্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("ngksh", "(((((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং]্?(গ|(জ্ঞ))))্?ক)|([নণঁঙঞং]্?(গ|(জ্ঞ))্?ক))্?(স|শ|ষ|([সশষ]্?(হ|ঃ|(হ্‌?)))))|((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং]্?(গ|(জ্ঞ))))্?ক্?(স|শ|ষ|([সশষ]্?(হ|ঃ|(হ্‌?)))))|((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং]্?(গ|(জ্ঞ))))্?((ক্?(স|শ|ষ|([সশষ]্?(হ|ঃ|(হ্‌?)))))|((ক্?[সশষ])্?(হ|ঃ|(হ্‌?)))|(ক্?[সশষ]্?(হ|ঃ|(হ্‌?)))))|((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং]্?(গ|(জ্ঞ))))্?(ক্?[সশষ])্?(হ|ঃ|(হ্‌?)))|([নণঁঙঞং]্?(গ|(জ্ঞ))্?ক্?[সশষ]্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("kkhm", "((((ক্ষ)|((ক্?ক?)্?(হ|ঃ|(হ্‌?)))|(ক?্?(খ|(ক্ষ)|(ক্?(হ|ঃ|(হ্‌?)))))|(ক্?ক্?(হ|ঃ|(হ্‌?))))্?ম)|((ক্?ক?)্?((হ|ঃ|(হ্‌?))্?ম))|(ক্?ক্?(হ|ঃ|(হ্‌?))্?ম)|(ক্?(খ|(ক্ষ)|(ক্?(হ|ঃ|(হ্‌?))))্?ম))"),
    Pattern::simple_replace("kkhn", "((((ক্ষ)|((ক্?ক?)্?(হ|ঃ|(হ্‌?)))|(ক?্?(খ|(ক্ষ)|(ক্?(হ|ঃ|(হ্‌?)))))|(ক্?ক্?(হ|ঃ|(হ্‌?))))্?[নণঁঙঞং])|((ক্?ক?)্?((হ|ঃ|(হ্‌?))্?[নণঁঙঞং]))|(ক্?ক্?(হ|ঃ|(হ্‌?))্?[নণঁঙঞং])|(ক্?(খ|(ক্ষ)|(ক্?(হ|ঃ|(হ্‌?))))্?[নণঁঙঞং]))"),
    Pattern::simple_replace("kshm", "((((ক্?(স|শ|ষ|([সশষ]্?(হ|ঃ|(হ্‌?)))))|((ক্?[সশষ])্?(হ|ঃ|(হ্‌?)))|(ক্?[সশষ]্?(হ|ঃ|(হ্‌?))))্?ম)|(ক্?(((স|শ|ষ|([সশষ]্?(হ|ঃ|(হ্‌?))))্?ম)|([সশষ]্?((হ|ঃ|(হ্‌?))্?ম))|([সশষ]্?(হ|ঃ|(হ্‌?))্?ম)))|((ক্?[সশষ])্?((হ|ঃ|(হ্‌?))্?ম))|(ক্?(স|শ|ষ|([সশষ]্?(হ|ঃ|(হ্‌?))))্?ম)|(ক্?[সশষ]্?(হ|ঃ|(হ্‌?))্?ম))"),
    Pattern::simple_replace("kshn", "((((ক্?(স|শ|ষ|([সশষ]্?(হ|ঃ|(হ্‌?)))))|((ক্?[সশষ])্?(হ|ঃ|(হ্‌?)))|(ক্?[সশষ]্?(হ|ঃ|(হ্‌?))))্?[নণঁঙঞং])|(ক্?(((স|শ|ষ|([সশষ]্?(হ|ঃ|(হ্‌?))))্?[নণঁঙঞং])|([সশষ]্?((হ|ঃ|(হ্‌?))্?[নণঁঙঞং]))|([সশষ]্?(হ|ঃ|(হ্‌?))্?[নণঁঙঞং])))|((ক্?[সশষ])্?((হ|ঃ|(হ্‌?))্?[নণঁঙঞং]))|(ক্?(স|শ|ষ|([সশষ]্?(হ|ঃ|(হ্‌?))))্?[নণঁঙঞং])|(ক্?[সশষ]্?(হ|ঃ|(হ্‌?))্?[নণঁঙঞং]))"),
    Pattern::simple_replace("ngch", "(((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং]্?(গ|(জ্ঞ))))্?(চ|ছ|([চছ]্?(হ|ঃ|(হ্‌?)))))|((((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং]্?(গ|(জ্ঞ))))্?[চছ])|([নণঁঙঞং]্?(গ|(জ্ঞ))্?[চছ]))্?(হ|ঃ|(হ্‌?)))|([নণঁঙঞং]্?(গ|(জ্ঞ))্?[চছ]্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("nggh", "(((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং]্?(গ|(জ্ঞ))))্?(ঘ|((গ|(জ্ঞ))্?(হ|ঃ|(হ্‌?)))))|([নণঁঙঞং]্?((জ্ঞ)|((গ|(জ্ঞ))্?((গ|(জ্ঞ)))?))্?(হ|ঃ|(হ্‌?)))|([নণঁঙঞং]্?((((জ্ঞ)|((গ|(জ্ঞ))্?((গ|(জ্ঞ)))?))্?(হ|ঃ|(হ্‌?)))|((গ|(জ্ঞ))্?(ঘ|((গ|(জ্ঞ))্?(হ|ঃ|(হ্‌?)))))|((গ|(জ্ঞ))্?(গ|(জ্ঞ))্?(হ|ঃ|(হ্‌?)))))|([নণঁঙঞং]্?(গ|(জ্ঞ))্?(গ|(জ্ঞ))্?(হ|ঃ|(হ্‌?)))|((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং]্?(গ|(জ্ঞ))))্?(গ|(জ্ঞ))্?(হ|ঃ|(হ্‌?)))|(((ঙ্গ)|((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং]্?(গ|(জ্ঞ))))্?(গ|(জ্ঞ)))|([নণঁঙঞং]্?(গ|(জ্ঞ))্?(গ|(জ্ঞ))))্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("ngjh", "(((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং]্?(গ|(জ্ঞ))))্?(ঝ|(([জয]|(জ়))্?(হ|ঃ|(হ্‌?)))))|((((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং]্?(গ|(জ্ঞ))))্?([জয]|(জ়)))|([নণঁঙঞং]্?(গ|(জ্ঞ))্?([জয]|(জ়))))্?(হ|ঃ|(হ্‌?)))|([নণঁঙঞং]্?(গ|(জ্ঞ))্?([জয]|(জ়))্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("ngkh", "(((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং]্?(গ|(জ্ঞ))))্?(খ|(ক্ষ)|(ক্?(হ|ঃ|(হ্‌?)))))|((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং]্?(গ|(জ্ঞ))))্?ক্?(হ|ঃ|(হ্‌?)))|([নণঁঙঞং]্?(গ|(জ্ঞ))্?ক্?(হ|ঃ|(হ্‌?)))|((((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং]্?(গ|(জ্ঞ))))্?ক)|([নণঁঙঞং]্?(গ|(জ্ঞ))্?ক))্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("ngkx", "(((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং]্?(গ|(জ্ঞ))))্?((ক্ষ)|(ক্?((ক্স)|ষ))))|((((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং]্?(গ|(জ্ঞ))))্?ক)|([নণঁঙঞং]্?(গ|(জ্ঞ))্?ক))্?((ক্স)|ষ))|([নণঁঙঞং]্?(গ|(জ্ঞ))্?((ক্ষ)|(ক্?((ক্স)|ষ))))|([নণঁঙঞং]্?(গ|(জ্ঞ))্?ক্?((ক্স)|ষ)))"),
    Pattern::simple_replace("shsh", "((((স|শ|ষ|([সশষ]্?(হ|ঃ|(হ্‌?)))))?্?(স|শ|ষ|([সশষ]্?(হ|ঃ|(হ্‌?)))))|([সশষ]্?(হ|ঃ|(হ্‌?))্?[সশষ]্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("thth", "((ত্থ)|(((থ|ঠ|([তটৎ]্?(হ|ঃ|(হ্‌?)))))?্?(থ|ঠ|([তটৎ]্?(হ|ঃ|(হ্‌?)))))|([তটৎ]্?(হ|ঃ|(হ্‌?))্?[তটৎ]্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("bbh", "((ব?্?(ভ|(ব্?(হ|ঃ|(হ্‌?)))))|((ব্?ব?)্?(হ|ঃ|(হ্‌?)))|(ব্?ব্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("bdh", "((ব্?(ধ|ঢ|([দড]্?(হ|ঃ|(হ্‌?)))))|((ব্?[দড])্?(হ|ঃ|(হ্‌?)))|(ব্?[দড]্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("bhl", "(((ভ|(ব্?(হ|ঃ|(হ্‌?))))্?ল)|(ব্?((হ|ঃ|(হ্‌?))্?ল))|(ব্?(হ|ঃ|(হ্‌?))্?ল))"),
    Pattern::simple_replace("cch", "(([চছ]্?(চ|ছ|([চছ]্?(হ|ঃ|(হ্‌?)))))|([চছ]্?[চছ]্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("chh", "(((চ|ছ|([চছ]্?(হ|ঃ|(হ্‌?))))্?((হ|ঃ|(হ্‌?)))?)|([চছ]্?((হ|ঃ|(হ্‌?))্?(হ|ঃ|(হ্‌?))))|([চছ]্?(হ|ঃ|(হ্‌?))্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("cng", "((চ্ঞ)|([চছ]্?(ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং]্?(গ|(জ্ঞ)))))|([চছ]্?[নণঁঙঞং]্?(গ|(জ্ঞ)))|(([চছ]্?[নণঁঙঞং])্?(গ|(জ্ঞ))))"),
    Pattern::simple_replace("dbh", "(([দড]্?(ভ|(ব্?(হ|ঃ|(হ্‌?)))))|(([দড]্?ব)্?(হ|ঃ|(হ্‌?)))|([দড]্?ব্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("ddh", "(([দড]?্?(ধ|ঢ|([দড]্?(হ|ঃ|(হ্‌?)))))|(([দড]্?[দড]?)্?(হ|ঃ|(হ্‌?)))|([দড]্?[দড]্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("dgh", "(([দড]্?(ঘ|((গ|(জ্ঞ))্?(হ|ঃ|(হ্‌?)))))|(([দড]্?(গ|(জ্ঞ)))্?(হ|ঃ|(হ্‌?)))|([দড]্?(গ|(জ্ঞ))্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("dhm", "(((ধ|ঢ|([দড]্?(হ|ঃ|(হ্‌?))))্?ম)|([দড]্?((হ|ঃ|(হ্‌?))্?ম))|([দড]্?(হ|ঃ|(হ্‌?))্?ম))"),
    Pattern::simple_replace("dhn", "(((ধ|ঢ|([দড]্?(হ|ঃ|(হ্‌?))))্?[নণঁঙঞং])|([দড]্?((হ|ঃ|(হ্‌?))্?[নণঁঙঞং]))|([দড]্?(হ|ঃ|(হ্‌?))্?[নণঁঙঞং]))"),
    Pattern::simple_replace("gdh", "(((গ|(জ্ঞ))্?(ধ|ঢ|([দড]্?(হ|ঃ|(হ্‌?)))))|((গ|(জ্ঞ))্?[দড]্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("ggh", "((((জ্ঞ)|((গ|(জ্ঞ))্?((গ|(জ্ঞ)))?))্?(হ|ঃ|(হ্‌?)))|((গ|(জ্ঞ))্?(ঘ|((গ|(জ্ঞ))্?(হ|ঃ|(হ্‌?)))))|((গ|(জ্ঞ))্?(গ|(জ্ঞ))্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("ghn", "(((ঘ|((গ|(জ্ঞ))্?(হ|ঃ|(হ্‌?))))্?[নণঁঙঞং])|((গ|(জ্ঞ))্?((হ|ঃ|(হ্‌?))্?[নণঁঙঞং]))|((গ|(জ্ঞ))্?(হ|ঃ|(হ্‌?))্?[নণঁঙঞং]))"),
    Pattern::simple_replace("jjh", "(((([জয]|(জ়)))?্?(ঝ|(([জয]|(জ়))্?(হ|ঃ|(হ্‌?)))))|(হ্য)|(((হ্য)|(([জয]|(জ়))্?(([জয]|(জ়)))?))্?(হ|ঃ|(হ্‌?)))|(([জয]|(জ়))্?([জয]|(জ়))্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("jng", "((জ্ঞ)|(([জয]|(জ়))্?(ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং]্?(গ|(জ্ঞ)))))|(([জয]|(জ়))্?[নণঁঙঞং]্?(গ|(জ্ঞ))))"),
    Pattern::simple_replace("kkh", "((ক্ষ)|((ক্?ক?)্?(হ|ঃ|(হ্‌?)))|(ক?্?(খ|(ক্ষ)|(ক্?(হ|ঃ|(হ্‌?)))))|(ক্?ক্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("ksh", "((ক্?(স|শ|ষ|([সশষ]্?(হ|ঃ|(হ্‌?)))))|((ক্?[সশষ])্?(হ|ঃ|(হ্‌?)))|(ক্?[সশষ]্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("kxm", "((((ক্ষ)|(ক্?((ক্স)|ষ)))্?ম)|(ক্?(((ক্স)|ষ)্?ম))|(ক্?((ক্স)|ষ)্?ম))"),
    Pattern::simple_replace("kxn", "((((ক্ষ)|(ক্?((ক্স)|ষ)))্?[নণঁঙঞং])|(ক্?(((ক্স)|ষ)্?[নণঁঙঞং]))|(ক্?((ক্স)|ষ)্?[নণঁঙঞং]))"),
    Pattern::simple_replace("lbh", "((ল্?(ভ|(ব্?(হ|ঃ|(হ্‌?)))))|((ল্?ব)্?(হ|ঃ|(হ্‌?)))|(ল্?ব্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("ldh", "((ল্?(ধ|ঢ|([দড]্?(হ|ঃ|(হ্‌?)))))|((ল্?[দড])্?(হ|ঃ|(হ্‌?)))|(ল্?[দড]্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("lgh", "((ল্?(ঘ|((গ|(জ্ঞ))্?(হ|ঃ|(হ্‌?)))))|((ল্?(গ|(জ্ঞ)))্?(হ|ঃ|(হ্‌?)))|(ল্?(গ|(জ্ঞ))্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("lkh", "((ল্?(খ|(ক্ষ)|(ক্?(হ|ঃ|(হ্‌?)))))|((ল্?ক)্?(হ|ঃ|(হ্‌?)))|(ল্?ক্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("lph", "((ল্?(ফ|(প্?(হ|ঃ|(হ্‌?)))))|((ল্?প)্?(হ|ঃ|(হ্‌?)))|(ল্?প্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("mbh", "((ম্?(ভ|(ব্?(হ|ঃ|(হ্‌?)))))|((ম্?ব)্?(হ|ঃ|(হ্‌?)))|(ম্?ব্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("mph", "((ম্?(ফ|(প্?(হ|ঃ|(হ্‌?)))))|((ম্?প)্?(হ|ঃ|(হ্‌?)))|(ম্?প্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("mth", "((ম্?(থ|ঠ|([তটৎ]্?(হ|ঃ|(হ্‌?)))))|((ম্?[তটৎ])্?(হ|ঃ|(হ্‌?)))|(ম্?[তটৎ]্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("nch", "(([নণঁঙঞং]্?(চ|ছ|([চছ]্?(হ|ঃ|(হ্‌?)))))|(((ঞ্চ)|([নণঁঙঞং]্?[চছ]))্?(হ|ঃ|(হ্‌?)))|([নণঁঙঞং]্?[চছ]্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("ndh", "(([নণঁঙঞং]্?(ধ|ঢ|([দড]্?(হ|ঃ|(হ্‌?)))))|(([নণঁঙঞং]্?[দড])্?(হ|ঃ|(হ্‌?)))|([নণঁঙঞং]্?[দড]্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("ngc", "(((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং]্?(গ|(জ্ঞ))))্?[চছ])|([নণঁঙঞং]্?(গ|(জ্ঞ))্?[চছ]))"),
    Pattern::simple_replace("ngg", "((ঙ্গ)|((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং]্?(গ|(জ্ঞ))))্?(গ|(জ্ঞ)))|([নণঁঙঞং]্?(গ|(জ্ঞ))্?(গ|(জ্ঞ))))"),
    Pattern::simple_replace("ngh", "((ঙ্ঘ)|([নণঁঙঞং]্?(ঘ|((গ|(জ্ঞ))্?(হ|ঃ|(হ্‌?)))))|([নণঁঙঞং]্?(গ|(জ্ঞ))্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("ngj", "(((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং]্?(গ|(জ্ঞ))))্?([জয]|(জ়)))|([নণঁঙঞং]্?(গ|(জ্ঞ))্?([জয]|(জ়))))"),
    Pattern::simple_replace("ngk", "(((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং]্?(গ|(জ্ঞ))))্?ক)|([নণঁঙঞং]্?(গ|(জ্ঞ))্?ক))"),
    Pattern::simple_replace("ngm", "(((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং]্?(গ|(জ্ঞ))))্?ম)|([নণঁঙঞং]্?(গ|(জ্ঞ))্?ম))"),
    Pattern::simple_replace("ngx", "(((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং]্?(গ|(জ্ঞ))))্?((ক্স)|ষ))|([নণঁঙঞং]্?(গ|(জ্ঞ))্?((ক্স)|ষ)))"),
    Pattern::simple_replace("njh", "(([নণঁঙঞং]্?(ঝ|(([জয]|(জ়))্?(হ|ঃ|(হ্‌?)))))|(((ঞ্জ)|([নণঁঙঞং]্?([জয]|(জ়))))্?(হ|ঃ|(হ্‌?)))|([নণঁঙঞং]্?([জয]|(জ়))্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("nkh", "(([নণঁঙঞং]্?(খ|(ক্ষ)|(ক্?(হ|ঃ|(হ্‌?)))))|(((ঙ্ক)|([নণঁঙঞং]্?ক))্?(হ|ঃ|(হ্‌?)))|([নণঁঙঞং]্?ক্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("nsh", "(([নণঁঙঞং]্?(স|শ|ষ|([সশষ]্?(হ|ঃ|(হ্‌?)))))|([নণঁঙঞং]্?[সশষ]্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("nth", "(([নণঁঙঞং]্?(থ|ঠ|([তটৎ]্?(হ|ঃ|(হ্‌?)))))|(([নণঁঙঞং]্?[তটৎ])্?(হ|ঃ|(হ্‌?)))|([নণঁঙঞং]্?[তটৎ]্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("phl", "(((ফ|(প্?(হ|ঃ|(হ্‌?))))্?ল)|(প্?((হ|ঃ|(হ্‌?))্?ল))|(প্?(হ|ঃ|(হ্‌?))্?ল))"),
    Pattern::simple_replace("rri", "(ঋ|ৃ|(([রড়ঢ়]|(হ্র))([রড়ঢ়]|(হ্র))([ইঈিী]|(য়[িী]))))"),
    Pattern::simple_replace("shm", "(((স|শ|ষ|([সশষ]্?(হ|ঃ|(হ্‌?))))্?ম)|([সশষ]্?((হ|ঃ|(হ্‌?))্?ম))|([সশষ]্?(হ|ঃ|(হ্‌?))্?ম))"),
    Pattern::simple_replace("shn", "(((স|শ|ষ|([সশষ]্?(হ|ঃ|(হ্‌?))))্?[নণঁঙঞং])|([সশষ]্?((হ|ঃ|(হ্‌?))্?[নণঁঙঞং]))|([সশষ]্?(হ|ঃ|(হ্‌?))্?[নণঁঙঞং]))"),
    Pattern::simple_replace("ssh", "(([সশষ]?্?(স|শ|ষ|([সশষ]্?(হ|ঃ|(হ্‌?)))))|([সশষ]্?[সশষ]্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("t``", "ৎ"),
    Pattern::simple_replace("tth", "((([তটৎ]?(্?)(থ|ঠ|([তটৎ](্?)(হ|ঃ|(হ্‌?)))))|(([তটৎ](্?)[তটৎ]?)(্?)(হ|ঃ|(হ্‌?)))|([তটৎ](্?)[তটৎ](্?)(হ|ঃ|(হ্‌?)))))"),
    Pattern::simple_replace("tth", "(([তটৎ]?্?(থ|ঠ|([তটৎ]্?(হ|ঃ|(হ্‌?)))))|(([তটৎ]্?[তটৎ]?)্?(হ|ঃ|(হ্‌?)))|([তটৎ]্?[তটৎ]্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("zzh", "((হ্য)|((জ|য|(জ়)|([‌‍]?্য))্?(ঝ|(([জয]|(জ়))্?(হ|ঃ|(হ্‌?)))))|(((হ্য)|((জ|য|(জ়)|([‌‍]?্য))্?((জ|য|(জ়)|([‌‍]?্য)))?))্?(হ|ঃ|(হ্‌?)))|((জ|য|(জ়)|([‌‍]?্য))্?(জ|য|(জ়)|([‌‍]?্য))্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("aa", "(আ|(য়া)|া|((([অএ]্যা?)|[আএ]|([‌‍]?(্য)?া)|(য়া))((([অএ]্যা?)|[আএ]|([‌‍]?(্য)?া)|(য়া)))?))"),
    Pattern::simple_replace("ai", "(ঐ|ৈ|(([অএ]্যা?)|[আএ]|([‌‍]?(্য)?া)|(য়া))([ইঈিী]|(য়[িী])))"),
    Pattern::simple_replace("au", "(ঔ|ৌ(([অএ]্যা?)|[আএ]|([‌‍]?(্য)?া)|(য়া))([উঊুূ]|(য়[ুূ])))"),
    Pattern::simple_replace("az", "((([অএ]্যা?)|[আএ]|([‌‍]?(্য)?া)|(য়া))((জ|য|(জ়)|([‌‍]?্য)))?)"),
    Pattern::simple_replace("bb", "(ব্?ব?)"),
    Pattern::simple_replace("bd", "(ব্?[দড])"),
    Pattern::simple_replace("bh", "(ভ|(ব্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("bv", "(ব?্?ভ)"),
    Pattern::simple_replace("cc", "([চছ]্?[চছ]?)"),
    Pattern::simple_replace("ch", "(চ|ছ|([চছ]্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("ck", "(ক|([চছ]্?ক))"),
    Pattern::simple_replace("cn", "([চছ]্?[নণঁঙঞং])"),
    Pattern::simple_replace("db", "([দড]্?ব)"),
    Pattern::simple_replace("dd", "([দড]্?[দড]?)"),
    Pattern::simple_replace("dg", "([দড]্?(গ|(জ্ঞ)))"),
    Pattern::simple_replace("dh", "(ধ|ঢ|([দড]্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("ee", "(ই|ঈ|ি|ী|(য়েই)|(((এ্যা?)|[এে]|([‌‍]?(্য)া)|(য়ে))((এ্যা?)|[এে]|([‌‍]?(্য)া)|(য়ে))))"),
    Pattern::simple_replace("ey", "(এ|ই|ে|(েই)|(এই)|ঈ|ী|(((এ্যা?)|[এে]|([‌‍]?(্য)া)|(য়ে))(য়|(ইয়)|([‌‍]?্য))))"),
    Pattern::simple_replace("ff", "(ফ্?ফ?)"),
    Pattern::simple_replace("gg", "((জ্ঞ)|((গ|(জ্ঞ))্?((গ|(জ্ঞ)))?))"),
    Pattern::simple_replace("gh", "(ঘ|((গ|(জ্ঞ))্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("hh", "((হ|ঃ|(হ্‌?))্?(হ|ঃ|(হ্‌?)))"),
    Pattern::simple_replace("hl", "((হ|ঃ|(হ্‌?))্?ল)"),
    Pattern::simple_replace("hm", "((হ|ঃ|(হ্‌?))্?ম)"),
    Pattern::simple_replace("hn", "((হ|ঃ|(হ্‌?))্?[নণঁঙঞং])"),
    Pattern::simple_replace("ia", "((ঞা)|(([ইঈিী]|(য়[িী]))(([অএ]্যা?)|[আএ]|([‌‍]?(্য)?া)|(য়া))))"),
    Pattern::simple_replace("jh", "(ঝ|(([জয]|(জ়))্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("jj", "((হ্য)|(([জয]|(জ়))্?(([জয]|(জ়)))?))"),
    Pattern::simple_replace("kh", "(খ|(ক্ষ)|(ক্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("kk", "(ক্?ক?)"),
    Pattern::simple_replace("ks", "(ক্?[সশষ])"),
    Pattern::simple_replace("kx", "((ক্ষ)|(ক্?((ক্স)|ষ)))"),
    Pattern::simple_replace("lb", "(ল্?ব)"),
    Pattern::simple_replace("ld", "(ল্?[দড])"),
    Pattern::simple_replace("lg", "(ল্?(গ|(জ্ঞ)))"),
    Pattern::simple_replace("lk", "(ল্?ক)"),
    Pattern::simple_replace("ll", "((হ্ল)|(ল?্?ল)|(ল্?ল))"),
    Pattern::simple_replace("lp", "(ল্?প)"),
    Pattern::simple_replace("mb", "(ম্?ব)"),
    Pattern::simple_replace("mm", "((হ্ম)|(ম্?ম?))"),
    Pattern::simple_replace("mp", "(ম্?প)"),
    Pattern::simple_replace("mt", "(ম্?[তটৎ])"),
    Pattern::simple_replace("nc", "((ঞ্চ)|([নণঁঙঞং]্?[চছ]))"),
    Pattern::simple_replace("nd", "([নণঁঙঞং]্?[দড])"),
    Pattern::simple_replace("ng", "(ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং]্?(গ|(জ্ঞ))))"),
    Pattern::simple_replace("nj", "((ঞ্জ)|([নণঁঙঞং]্?([জয]|(জ়))))"),
    Pattern::simple_replace("nk", "((ঙ্ক)|([নণঁঙঞং]্?ক))"),
    Pattern::simple_replace("nn", "((হ্ণ)|(হ্ন)|([নণঁঙঞং]্?[নণঁঙঞং]?))"),
    Pattern::simple_replace("nt", "([নণঁঙঞং]্?[তটৎ])"),
    Pattern::simple_replace("oi", "(ঐ|ৈ|(([ওোঅ]|(অ্য)|(য়ো?))?([ইঈিী]|(য়[িী]))))"),
    Pattern::simple_replace("oo", "((([উঊুূ]|(য়[ুূ])))|(([ওোঅ]|(অ্য)|(য়ো?))?([ওোঅ]|(অ্য)|(য়ো?))?))"),
    Pattern::simple_replace("ou", "(ঔ|ৌ|(([ওোঅ]|(অ্য)|(য়ো?))?([উঊুূ]|(য়[ুূ]))))"),
    Pattern::simple_replace("ph", "(ফ|(প্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("pp", "(প্?প?)"),
    Pattern::simple_replace("qq", "(ক্?ক?)"),
    Pattern::simple_replace("rh", "((([রড়ঢ়]|(হ্র)))|(([রড়ঢ়]|(হ্র))্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("ri", "(ঋ|ৃ|(হৃ)|(([রড়ঢ়]|(হ্র))([ইঈিী]|(য়[িী]))))"),
    Pattern::simple_replace("sh", "(স|শ|ষ|([সশষ]্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("ss", "([সশষ]্?[সশষ]?)"),
    Pattern::simple_replace("th", "(থ|ঠ|([তটৎ]্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("tt", "([তটৎ]্?[তটৎ]?)"),
    Pattern::simple_replace("uu", "(ঊ|ূ|(([উঊুূ]|(য়[ুূ]))(([উঊুূ]|(য়[ুূ])))?))"),
    Pattern::simple_replace("vv", "(ভ্?ভ?)"),
    Pattern::simple_replace("xm", "(((ক্স)|ষ)্?ম)"),
    Pattern::simple_replace("xn", "(((ক্স)|ষ)্?[নণঁঙঞং])"),
    Pattern::simple_replace("zh", "(ঝ|(([জয]|(জ়))্?(হ|ঃ|(হ্‌?))))"),
    Pattern::simple_replace("zz", "((হ্য)|((জ|য|(জ়)|([‌‍]?্য))্?((জ|য|(জ়)|([‌‍]?্য)))?))"),
    Pattern::simple_replace("0", "(০|(0)|(শূন্য))"),
    Pattern::simple_replace("1", "(১|(1)|(এক))"),
    Pattern::simple_replace("2", "(২|(2)|(দুই))"),
    Pattern::simple_replace("3", "(৩|(3)|(তিন))"),
    Pattern::simple_replace("4", "(৪|(4)|(চার))"),
    Pattern::simple_replace("5", "(৫|(5)|(পাঁচ))"),
    Pattern::simple_replace("6", "((6)|৬|(ছয়))"),
    Pattern::simple_replace("7", "(৭|(7)|(সাত))"),
    Pattern::simple_replace("8", "(৮|(8)|(আট))"),
    Pattern::simple_replace("9", "(৯|(9)|(নয়))"),
    Pattern::simple_replace("`", ""),
    Pattern::simple_replace("a", "(([অএ]্যা?)|[আএ]|([‌‍]?(্য)?া)|(য়া))"),
    Pattern::simple_replace("b", "ব"),
    Pattern::simple_replace("c", "([চছ])"),
    Pattern::simple_replace("d", "([দড])"),
    Pattern::simple_replace("e", "((এ্যা?)|[এে]|([‌‍]?(্য)া)|(য়ে))"),
    Pattern::simple_replace("f", "ফ"),
    Pattern::simple_replace("g", "(গ|(জ্ঞ))"),
    Pattern::simple_replace("h", "(হ|ঃ|(হ্‌?))"),
    Pattern::simple_replace("i", "([ইঈিী]|(য়[িী]))"),
    Pattern::simple_replace("j", "([জয]|(জ়))"),
    Pattern::simple_replace("k", "ক"),
    Pattern::simple_replace("l", "ল"),
    Pattern::simple_replace("m", "ম"),
    Pattern::simple_replace("n", "([নণঁঙঞং])"),
    Pattern {
        find:"o",
        default_replacement: "(([ওোঅ]|(অ্য)|(য়ো?))?)",
        rules: &[Rule {
            when_matches: &[PrefixIs(Punctuation)],
            replace_with: "([ওোঅ]|(অ্য)|(য়ো?))"
        }]
    },
    Pattern::simple_replace("p", "প"),
    Pattern::simple_replace("q", "ক"),
    Pattern::simple_replace("r", "([রড়ঢ়]|(হ্র))"),
    Pattern::simple_replace("s", "([সশষ])"),
    Pattern::simple_replace("t", "([তটৎ])"),
    Pattern::simple_replace("u", "([উঊুূ]|(য়[ুূ]))"),
    Pattern::simple_replace("v", "ভ"),
    Pattern::simple_replace("w", "(ও|(ওয়)|(্ব))"),
    Pattern::simple_replace("x", "((ক্স)|ষ)"),
    Pattern::simple_replace("y", "(য়|(ইয়)|([‌‍]?্য))"),
    Pattern::simple_replace("z", "(জ|য|(জ়)|([‌‍]?্য))"),
];

pub struct RegexSuggestion {
    pub(crate) patterns: Patterns,
}

impl RegexSuggestion {
    pub fn new() -> Self {
        Self {
            patterns: Patterns::new(REGEX_PATTERNS),
        }
    }

    pub fn convert_regex(&self, raw_input: &str) -> String {
        let mut output = String::with_capacity(512);
        self.convert_regex_into(raw_input, &mut output);
        output
    }

    pub fn convert_regex_into(&self, raw_input: &str, output: &mut String) {
        const EXTRA: &str = "(্[যবম])?(্?)([ঃঁ]?)";

        let input: String = raw_input
            .chars()
            .filter(|c| !c.is_ascii_punctuation())
            .map(|c| c.to_ascii_lowercase())
            .collect();

        let mut prefix = ' ';
        let mut input = &input[0..];

        output.clear();
        output.push('^');
        while !input.is_empty() {
            match self.patterns.find_pattern(input) {
                Some(pattern) => {
                    let suffix = input.chars().nth(pattern.find.len()).unwrap_or(' ');
                    output.push_str(pattern.get_replacement(prefix, suffix));
                    output.push_str(EXTRA);
                    if let Some(c) = pattern.find.chars().last() {
                        prefix = c;
                    }
                    input = &input[pattern.find.len()..];
                }
                None => {
                    if let Some(c) = input.chars().next() {
                        prefix = c;
                        output.push(c);
                    }
                    input = &input[1..];
                }
            }
        }
        output.push('$');
    }
}