1 /** International Phonetic Alphabet.
2  */
3 module nxt.ipa;
4 
5 // enum Phoneme : string
6 // {
7 //     `æ`,
8 //     `ə`,
9 //     `ʌ`,
10 //     `ɜ`,
11 //     `eə`,
12 //     `ɜr`,
13 //     `ɑː`,
14 //     `aɪ`,
15 //     `ɑr`,
16 //     `aʊ`,
17 //     `b`,
18 //     `d`,
19 //     `ð`,
20 //     `dʒ`,
21 //     `ɛ`,
22 //     `eɪ`,
23 //     `f`,
24 //     `ɡ`,
25 //     `h`,
26 //     `hw`,
27 //     `iː`,
28 //     `ɪ`,
29 //     `j`,
30 //     `k`,
31 //     `l`,
32 //     `m`,
33 //     `n`,
34 //     `ŋ`,
35 //     `ɔː`,
36 //     `ɔɪ`,
37 //     `oʊ`,
38 //     `p`,
39 //     `r`,
40 //     `s`,
41 //     `ʃ`,
42 //     `t`,
43 //     `θ`,
44 //     `tʃ`,
45 //     `uː`,
46 //     `ʊ`,
47 //     `v`,
48 //     `w`,
49 //     `z`,
50 //     `ʒ`,
51 //     }
52 
53 // size_t countSyllables(Phoneme s) @safe pure nothrow @nogc
54 // {
55 //     return 0;
56 // }
57 
58 import std.traits : isSomeString;
59 
60 bool isIPAVowelPhoneme(S)(S s)
61     if (isSomeString!S)
62 {
63     import std.algorithm.comparison : among;
64     return cast(bool)s.among!(`æ`, `ə`, `ʌ`, `ɜ`, `eə`, `ɜr`, `ɑː`, `aɪ`, `ɑr`, `aʊ`, `ɛ`, `eɪ`, `iː`, `ɪ`, `ɔː`, `ɔɪ`, `oʊ`, `uː`, `ʊ`);
65 }
66 
67 @safe pure nothrow @nogc unittest
68 {
69     assert(`æ`.isIPAVowelPhoneme);
70     assert(!`b`.isIPAVowelPhoneme);
71 }
72 
73 bool isIPAConsonantPhoneme(S)(S s)
74     if (isSomeString!S)
75 {
76     import std.algorithm.comparison : among;
77     return cast(bool)s.among!(`b`, `d`, `ð`, `dʒ`, `f`, `ɡ`, `h`, `hw`, `j`, `k`, `l`, `m`, `n`, `ŋ`, `p`, `r`, `s`, `ʃ`, `t`, `θ`, `tʃ`, `w`, `z`, `ʒ`);
78 }
79 
80 @safe pure nothrow @nogc unittest
81 {
82     assert(!`a`.isIPAConsonantPhoneme);
83     assert(`b`.isIPAConsonantPhoneme);
84 }