
//! Sejong [`Buffer`] takes English letters([`Byte`]) that appears on standard
//! keyboard and convert them to corresponding Hangul Jamos as
//! in standard Korean 2-set keyboard. It can output complete Hangul
//! Syllables as a UTF-32 string. It also allows deletion by Hangul
//! Jamo.

#[cfg(feature = "wasm")]
use wasm_bindgen::prelude::wasm_bindgen;

mod buffer;
mod byte;
mod syllable;
pub use buffer::Buffer;
pub use byte::Byte;

#[cfg(feature = "wasm")]
#[macro_use]
extern crate lazy_static;

#[cfg(feature = "wasm")]
lazy_static! {
    static ref BUFFER: std::sync::Mutex<Buffer> = std::sync::Mutex::new(Buffer::default());
}

/// This is a simple wrapper for [`Buffer::put`]. 
/// When used as a WASM module, this lib instantiate a global
/// [`Buffer`] and this method is using the global instance.
#[cfg(any(feature = "wasm", doc))]
#[cfg_attr(feature = "wasm", wasm_bindgen)]
pub fn put(c: char) -> Option<String> {
    let mut b = BUFFER.lock().unwrap();
    match b.put(c) {
        None => Some(b.to_string()),
        _ => None,
    }
}

/// This is a simple wrapper for [`Buffer::pop`]. 
/// When used as a WASM module, this lib instantiate a global
/// [`Buffer`] and this method is using the global instance.
#[cfg(any(feature = "wasm", doc))]
#[cfg_attr(feature = "wasm", wasm_bindgen)]
pub fn pop() -> Option<String> {
    let mut b = BUFFER.lock().unwrap();
    b.pop().map(|_| b.to_string())
}

/// This is a simple wrapper for [`Buffer::out`]. 
/// When used as a WASM module, this lib instantiate a global
/// [`Buffer`] and this method is using the global instance.
#[cfg(any(feature = "wasm", doc))]
#[cfg_attr(feature = "wasm", wasm_bindgen)]
pub fn out() -> String {
    let mut b = BUFFER.lock().unwrap();
    b.out()
}