#![allow(clippy::while_let_on_iterator)]

use cursor::*;

fn main() {
    example1();
    example2();
    example3();
    example4();
    example5();
    example6();
    example7();
    example8();
    example9();
    // TODO: more examples
    println!();
}

#[inline]
fn example1() {
    let cursor = StrCursor::new("test입니다. ^^");
    for i in cursor {
        print!("{} ", i);
    }
}

#[inline]
fn example2() {
    let mut cursor = StrCursor::new("test입니다. ^^");
    while let Some(i) = cursor.next() {
        print!("{} ", i);
    }
}

#[inline]
fn example3() {
    let mut cursor = StrCursor::new("test ascii only!");
    for _ in cursor.range() {
        let i = cursor.unwrapped_next();
        print!("{} ", i);
    }
}

#[inline]
fn example4() {
    let mut cursor = StrCursor::new("test ascii only!");
    for _ in cursor.range() {
        cursor += 1;
        print!("{} ", cursor.current());
    }
}

#[inline]
fn example5() {
    let mut cursor = StrCursor::new("test ascii only!");
    while let Some(ch) = &mut cursor + 1 {
        print!("{} ", ch);
    }
}

#[inline]
fn example6() -> Option<char> {
    let mut cursor = StrCursor::new("test입니다. ^^");

    cursor.next_to_offset(5)?;
    cursor.next_to_offset(-5)?;

    cursor.turnaround();
    cursor.next()?;
    cursor.next()?;
    cursor.turnaround();
    cursor.next()?;

    cursor.next()
}

#[inline]
fn example7() -> char {
    let mut cursor = StrCursor::new("test입니다. ^^");
    cursor += 5;
    cursor -= 2;
    cursor += 1;

    cursor.current()
}

#[inline]
fn example8() -> char {
    let mut cursor = StrCursor::new("test입니다. ^^");
    cursor += 10;

    let _ = &mut cursor + (5 - 2 + 1);
    let _ = &mut cursor - 1;

    (cursor - 1).unwrap()
}

#[inline]
fn example9() {
    let mut cursor = StrCursor::new("test입니다. ^^");
    cursor += 5;

    assert_eq!(cursor.as_preserved_str(), "testìž…");
    assert_eq!(cursor.current(), '니');
    assert_eq!(cursor.as_remaining_str(), "다. ^^");
}