logisheets_controller 0.6.0

the core of LogiSheets
Documentation
use crate::calc_engine::calculator::calc_vertex::{CalcValue, CalcVertex, Value};
use crate::calc_engine::connector::Connector;
use logisheets_parser::ast;
use unicode_segmentation::UnicodeSegmentation;

pub fn calc_left<C>(args: Vec<CalcVertex>, fetcher: &mut C) -> CalcVertex
where
    C: Connector,
{
    let func = |s: String, n: u8| -> String {
        s.graphemes(true)
            .take(n as usize)
            .fold(String::from(""), |mut prev, g| {
                prev.push_str(g);
                prev
            })
    };
    calc(args, fetcher, func)
}

pub fn calc_right<C>(args: Vec<CalcVertex>, fetcher: &mut C) -> CalcVertex
where
    C: Connector,
{
    let func = |s: String, n: u8| -> String {
        let graphemes = s.graphemes(true);
        graphemes
            .rev()
            .take(n as usize)
            .fold(String::from(""), |prev, g| {
                let mut curr = g.to_string();
                curr = curr + &prev;
                curr
            })
    };
    calc(args, fetcher, func)
}

fn calc<C, F>(args: Vec<CalcVertex>, fetcher: &mut C, func: F) -> CalcVertex
where
    C: Connector,
    F: Fn(String, u8) -> String,
{
    assert_or_return!(args.len() == 2, ast::Error::Unspecified);
    let mut args_iter = args.into_iter();
    let first = fetcher.get_calc_value(args_iter.next().unwrap());
    assert_text_from_calc_value!(s, first);
    let second = fetcher.get_calc_value(args_iter.next().unwrap());
    assert_f64_from_calc_value!(n, second);
    let res = func(s, n as u8);
    CalcVertex::from_string(res)
}