From 26faec7a69051f639b50c8e8741f0823c6be52a2 Mon Sep 17 00:00:00 2001 From: Sébastien Dailly Date: Fri, 27 Aug 2021 17:20:59 +0200 Subject: Managed diphtongues --- src/lib/modifiers/nasal.ml | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) (limited to 'src/lib/modifiers') diff --git a/src/lib/modifiers/nasal.ml b/src/lib/modifiers/nasal.ml index da24863..b9874c9 100644 --- a/src/lib/modifiers/nasal.ml +++ b/src/lib/modifiers/nasal.ml @@ -9,15 +9,28 @@ let process let module T = (val m:Sounds.T with type t = el) in let (((v1, v2), c) , ending) = init in let ending = Option.bind ending (fun x -> x) in - match ending with - | None -> init - | Some ending -> - match T.is_nasal ending with - | false -> init - | true -> - (* Remove the ending consonant, and transform the voyel into - the nasal form *) - ( ( (T.nasal v1, T.nasal v2) - , c ) - , None ) + let opening = Option.map (fun v -> v.Sig.opening) c in + let is_voyel = T.is_voyel v1 && T.is_voyel v2 in + match ending, is_voyel, opening with + | Some ending, _, _ when T.is_nasal ending -> + (* Remove the ending consonant, and transform the voyel into + the nasal form *) + ( ( (T.nasal v1, T.nasal v2) + , c ) + , None ) + | None, false, Some (opening::tl) when T.is_nasal opening -> + (* If there is no voyel here, transform the opening consonant as an + ending consonant for the next syllabus *) + let c = Option.map + (fun c -> + { c with + Sig.opening = tl + ; Sig.ending = (Some (Some opening)) + }) c in + ( ( (T.nasal v1, T.nasal v2) + , c ) + , None ) + | _ -> + (* Return the element unchanged *) + init -- cgit v1.2.3