String with support for Unicode graphemes
use gstring::*;
const S: &str = "a\u{310}e\u{301}o\u{308}\u{332}";
let mut s = GString::from(S);
assert_eq!(s, S);
assert_eq!(s.graphemes(), &["a\u{310}", "e\u{301}", "o\u{308}\u{332}"]);
assert_eq!(s.len(), 3);
assert!(!s.is_empty());
assert_eq!(s.chars(), &['a', '\u{310}', 'e', '\u{301}', 'o', '\u{308}', '\u{332}']);
assert_eq!(s.bytes(), &[0x61, 0xcc, 0x90, 0x65, 0xcc, 0x81, 0x6f, 0xcc, 0x88, 0xcc, 0xb2]);
s.insert(0, "i\u{301}u\u{301}");
assert_eq!(s, "i\u{301}u\u{301}a\u{310}e\u{301}o\u{308}\u{332}");
assert_eq!(s.remove(1), "u\u{301}");
assert_eq!(s, "i\u{301}a\u{310}e\u{301}o\u{308}\u{332}");
s.push("i\u{301}u\u{301}");
assert_eq!(s, "i\u{301}a\u{310}e\u{301}o\u{308}\u{332}i\u{301}u\u{301}");
assert_eq!(s.pop(), Some("u\u{301}".gstring()));
assert_eq!(s, "i\u{301}a\u{310}e\u{301}o\u{308}\u{332}i\u{301}");
assert_eq!(s.slice(1..4), "a\u{310}e\u{301}o\u{308}\u{332}");
assert_eq!(s.splice(1..4, ""), "a\u{310}e\u{301}o\u{308}\u{332}");
assert_eq!(s, "i\u{301}i\u{301}");
assert_eq!(s.drain(..), "i\u{301}i\u{301}");
assert_eq!(s, "");