module type T = sig type t val muted : t -> t val a : [`Closed | `Opened] -> t val e : [`Closed | `Opened] -> t val eu : [`Closed | `Opened] -> t val o : [`Closed | `Opened] -> t val schwa : unit -> t val i : [`Closed | `Opened] -> t val u : t val nasal: t -> t val none: t val p: t val b: t val t: t val d: t val k: t val f: t val s: unit -> t val sz: unit -> t val ch: unit -> t val z: unit -> t val n: t val m: t val r: unit -> t val l: unit -> t val semi_voyel_w: t val is_voyel : t -> bool val is_nasal : t -> bool type code = | None | SZ | Voyel_A | Voyel_O val code : t -> code end module T = struct type kind = | None | Voyel type code = | None | SZ | Voyel_A | Voyel_O type t = { code : code ; repr : string ; muted : bool ; kind : kind ; nasal : bool } end module Repr = struct let a = "a" and a_nasal = "@" and o = "o" and o_nasal = "§" and i = "i" and u = "y" and p = "p" and b = "b" and t = "t" and d = "d" and k = "k" and g = "g" and f = "f" and ch = "S" and s = "s" and z = "z" and m = "m" and n = "n" and l = "L" and r = "R" and w = "w" end module S = struct include T let is_voyel t = t.kind = Voyel let is_nasal t = t.nasal let none = { repr = "" ; muted = false ; kind = None ; nasal = false ; code = None } let voyel = { none with kind = Voyel } let code t = t.code let nasal t = match t.code with | Voyel_A -> { t with repr = Repr.a_nasal ; nasal = true } | Voyel_O -> { t with repr = Repr.o_nasal ; nasal = true } | _ -> t let muted f = { none with repr = "(" ^ f.repr ^ ")" ; muted = true } let a _ = { voyel with repr = Repr.a ; code = Voyel_A } let e = function | `Closed -> { voyel with repr = "e" } | `Opened -> { voyel with repr = "E" } let eu = function | `Closed -> { voyel with repr = "2" } | `Opened -> { voyel with repr = "9" } let schwa () = { voyel with repr = "°" } let o _ = { voyel with repr = Repr.o ; code = Voyel_O } let i _ = { voyel with repr = Repr.i } let u = { voyel with repr = Repr.u } let p = { none with repr = Repr.p } let b = { none with repr = Repr.b } let t = { none with repr = Repr.t } let d = { none with repr = Repr.d } let k = { none with repr = Repr.k } let f = { none with repr = Repr.f } let s () = { none with repr = Repr.s } let sz () = { (s()) with code = SZ } let ch () = { none with repr = Repr.ch } let z () = { none with repr = Repr.z } let n = { none with repr = Repr.n ; nasal = true } let m = { none with repr = Repr.m ; nasal = true } let l () = { none with repr = Repr.l } let r () = { none with repr = Repr.r } let semi_voyel_w = { none with repr = Repr.w } end include S