mod constants {
pub const LETTER_A: char = '𐤠';
pub const LETTER_B: char = '𐤡';
pub const LETTER_G: char = '𐤢';
pub const LETTER_D: char = '𐤣';
pub const LETTER_E: char = '𐤤';
pub const LETTER_V: char = '𐤥';
pub const LETTER_I: char = '𐤦';
pub const LETTER_Y: char = '𐤧';
pub const LETTER_K: char = '𐤨';
pub const LETTER_L: char = '𐤩';
pub const LETTER_M: char = '𐤪';
pub const LETTER_N: char = '𐤫';
pub const LETTER_O: char = '𐤬';
pub const LETTER_R: char = '𐤭';
pub const LETTER_SS: char = '𐤮';
pub const LETTER_T: char = '𐤯';
pub const LETTER_U: char = '𐤰';
pub const LETTER_F: char = '𐤱';
pub const LETTER_Q: char = '𐤲';
pub const LETTER_S: char = '𐤳';
pub const LETTER_TT: char = '𐤴';
pub const LETTER_AN: char = '𐤵';
pub const LETTER_EN: char = '𐤶';
pub const LETTER_LY: char = '𐤷';
pub const LETTER_NN: char = '𐤸';
pub const LETTER_C: char = '𐤹';
}
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
pub enum Lydian {
LetterA,
LetterB,
LetterG,
LetterD,
LetterE,
LetterV,
LetterI,
LetterY,
LetterK,
LetterL,
LetterM,
LetterN,
LetterO,
LetterR,
LetterSs,
LetterT,
LetterU,
LetterF,
LetterQ,
LetterS,
LetterTt,
LetterAn,
LetterEn,
LetterLy,
LetterNn,
LetterC,
}
impl Into<char> for Lydian {
fn into(self) -> char {
use constants::*;
match self {
Lydian::LetterA => LETTER_A,
Lydian::LetterB => LETTER_B,
Lydian::LetterG => LETTER_G,
Lydian::LetterD => LETTER_D,
Lydian::LetterE => LETTER_E,
Lydian::LetterV => LETTER_V,
Lydian::LetterI => LETTER_I,
Lydian::LetterY => LETTER_Y,
Lydian::LetterK => LETTER_K,
Lydian::LetterL => LETTER_L,
Lydian::LetterM => LETTER_M,
Lydian::LetterN => LETTER_N,
Lydian::LetterO => LETTER_O,
Lydian::LetterR => LETTER_R,
Lydian::LetterSs => LETTER_SS,
Lydian::LetterT => LETTER_T,
Lydian::LetterU => LETTER_U,
Lydian::LetterF => LETTER_F,
Lydian::LetterQ => LETTER_Q,
Lydian::LetterS => LETTER_S,
Lydian::LetterTt => LETTER_TT,
Lydian::LetterAn => LETTER_AN,
Lydian::LetterEn => LETTER_EN,
Lydian::LetterLy => LETTER_LY,
Lydian::LetterNn => LETTER_NN,
Lydian::LetterC => LETTER_C,
}
}
}
impl std::convert::TryFrom<char> for Lydian {
type Error = ();
fn try_from(c: char) -> Result<Self, Self::Error> {
use constants::*;
match c {
LETTER_A => Ok(Lydian::LetterA),
LETTER_B => Ok(Lydian::LetterB),
LETTER_G => Ok(Lydian::LetterG),
LETTER_D => Ok(Lydian::LetterD),
LETTER_E => Ok(Lydian::LetterE),
LETTER_V => Ok(Lydian::LetterV),
LETTER_I => Ok(Lydian::LetterI),
LETTER_Y => Ok(Lydian::LetterY),
LETTER_K => Ok(Lydian::LetterK),
LETTER_L => Ok(Lydian::LetterL),
LETTER_M => Ok(Lydian::LetterM),
LETTER_N => Ok(Lydian::LetterN),
LETTER_O => Ok(Lydian::LetterO),
LETTER_R => Ok(Lydian::LetterR),
LETTER_SS => Ok(Lydian::LetterSs),
LETTER_T => Ok(Lydian::LetterT),
LETTER_U => Ok(Lydian::LetterU),
LETTER_F => Ok(Lydian::LetterF),
LETTER_Q => Ok(Lydian::LetterQ),
LETTER_S => Ok(Lydian::LetterS),
LETTER_TT => Ok(Lydian::LetterTt),
LETTER_AN => Ok(Lydian::LetterAn),
LETTER_EN => Ok(Lydian::LetterEn),
LETTER_LY => Ok(Lydian::LetterLy),
LETTER_NN => Ok(Lydian::LetterNn),
LETTER_C => Ok(Lydian::LetterC),
_ => Err(()),
}
}
}
impl Into<u32> for Lydian {
fn into(self) -> u32 {
let c: char = self.into();
let hex = c
.escape_unicode()
.to_string()
.replace("\\u{", "")
.replace("}", "");
u32::from_str_radix(&hex, 16).unwrap()
}
}
impl std::convert::TryFrom<u32> for Lydian {
type Error = ();
fn try_from(u: u32) -> Result<Self, Self::Error> {
if let Ok(c) = char::try_from(u) {
Self::try_from(c)
} else {
Err(())
}
}
}
impl Iterator for Lydian {
type Item = Self;
fn next(&mut self) -> Option<Self> {
let index: u32 = (*self).into();
use std::convert::TryFrom;
Self::try_from(index + 1).ok()
}
}
impl Lydian {
pub fn new() -> Self {
Lydian::LetterA
}
pub fn name(&self) -> &str {
match self {
Lydian::LetterA => "lydian letter a",
Lydian::LetterB => "lydian letter b",
Lydian::LetterG => "lydian letter g",
Lydian::LetterD => "lydian letter d",
Lydian::LetterE => "lydian letter e",
Lydian::LetterV => "lydian letter v",
Lydian::LetterI => "lydian letter i",
Lydian::LetterY => "lydian letter y",
Lydian::LetterK => "lydian letter k",
Lydian::LetterL => "lydian letter l",
Lydian::LetterM => "lydian letter m",
Lydian::LetterN => "lydian letter n",
Lydian::LetterO => "lydian letter o",
Lydian::LetterR => "lydian letter r",
Lydian::LetterSs => "lydian letter ss",
Lydian::LetterT => "lydian letter t",
Lydian::LetterU => "lydian letter u",
Lydian::LetterF => "lydian letter f",
Lydian::LetterQ => "lydian letter q",
Lydian::LetterS => "lydian letter s",
Lydian::LetterTt => "lydian letter tt",
Lydian::LetterAn => "lydian letter an",
Lydian::LetterEn => "lydian letter en",
Lydian::LetterLy => "lydian letter ly",
Lydian::LetterNn => "lydian letter nn",
Lydian::LetterC => "lydian letter c",
}
}
}