1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586(*****************************************************************************)(* *)(* Copyright (C) 2026 Yves Ndiaye *)(* *)(* This Source Code Form is subject to the terms of the Mozilla Public *)(* License, v. 2.0. If a copy of the MPL was not distributed with this *)(* file, You can obtain one at https://mozilla.org/MPL/2.0/. *)(* *)(*****************************************************************************)moduleKeys=structletunicode_nf="unicode_normalization_form"letduplicate_query="duplicate_query"endmoduleDefault=structletunicode_normalization_form:Uunf.form=`NFCendmoduleUnicode=structletform_of_string=function|"nfd"->`NFD|"nfkd"->`NFKD|"nfkc"->`NFKC|"nfc"->`NFC|_->`NFCletform_to_string=function|`NFC->"nfc"|`NFD->"nfd"|`NFKD->"nfkd"|`NFKC->"nfkc"endtypet={unicode_normalization_form:Uunf.form;duplicate_query:(unit,unit,unit,unit,unit)SkhcQuery.Field.tSkhcQuery.Query.toption;}letsection="misc"letdefault:t={unicode_normalization_form=`NFC;duplicate_query=None}letinit~unicode_normalization_form~duplicate_query={unicode_normalization_form;duplicate_query}(*let conv ~default key section =
match Section.assoc key section with Some e -> e | None -> default*)letof_sectionsection=let(>>=)=Option.bindinletunicode_normalization_form=section|>Section.assocKeys.unicode_nf|>Option.mapUnicode.form_of_string|>Option.value~default:Default.unicode_normalization_forminletduplicate_query=section|>Section.assocKeys.duplicate_query>>=SkhcQuery.Query.of_sexp_keysin{unicode_normalization_form;duplicate_query}letto_sectiont=letunicode=Unicode.form_to_stringt.unicode_normalization_forminletduplicate_query=t.duplicate_query|>Option.mapSkhcQuery.Query.to_sexp_keys|>Option.value~default:String.emptyinSection.initsection[(Keys.unicode_nf,unicode);(Keys.duplicate_query,duplicate_query)]letunicode_normalization_formt=t.unicode_normalization_formletduplicate_queryt=t.duplicate_queryletset_duplicate_queryqueryt={twithduplicate_query=query}