rust_multistack 0.33.0

Support for two-dimentional stacks for the Rust programming language
Documentation
use crate::ts::TS;
use rust_dynamic::value::Value;
use easy_error::{bail, Error};

pub fn ts_dup_in_current_stack(ts: &mut TS, n: i64) -> Result<&mut TS, Error> {
    ts.dup_in_current_stack(n)
}

pub fn ts_dup_in_stack(ts: &mut TS, n: i64, name: String) -> Result<&mut TS, Error> {
    ts.dup_in_stack(n, name)
}

pub fn ts_many_in_current_stack(ts: &mut TS, n: i64, value: Value) -> Result<&mut TS, Error> {
    ts.many_in_current_stack(n, value)
}

pub fn ts_many_in_stack(ts: &mut TS, n: i64, name: String, value: Value) -> Result<&mut TS, Error> {
    ts.many_in_stack(n, name, value)
}

pub fn ts_swap_in_current_stack(ts: &mut TS, n: i64) -> Result<&mut TS, Error> {
    ts.swap_in_current_stack(n)
}

pub fn ts_swap_in_stack(ts: &mut TS, n: i64, name: String) -> Result<&mut TS, Error> {
    ts.swap_in_stack(n, name)
}

impl TS {
    pub fn dup_in_current_stack(&mut self, n: i64) -> Result<&mut TS, Error> {
        match self.peek() {
            Some(val) => {
                for _ in 0..n {
                    let _ = match val.dup() {
                        Ok(nval) => {
                            self.push(nval);
                        }
                        Err(err) => {
                            bail!("Error duplicating data in current stack: {}", err);
                        }
                    };
                }
                return Ok(self);
            }
            None => {
                bail!("Error duplicating data in current stack: unable to peek()");
            }
        }
    }

    pub fn dup_in_stack(&mut self, n: i64, name: String) -> Result<&mut TS, Error> {
        match self.peek_from_stack(name.clone()) {
            Some(val) => {
                for _ in 0..n {
                    let _ = match val.dup() {
                        Ok(nval) => self.push_to_stack(name.clone(), nval),
                        Err(err) => {
                            bail!("Error duplicating data in current stack: {}", err);
                        }
                    };
                }
                return Ok(self);
            }
            None => {
                bail!("Error duplicating data in current stack: unable to peek()");
            }
        }
    }

    pub fn many_in_current_stack(&mut self, n: i64, value: Value) -> Result<&mut TS, Error> {
        for _ in 0..n {
            let _ = match value.dup() {
                Ok(nval) => self.push(nval),
                Err(err) => {
                    bail!("Error duplicating data in current stack: {}", err);
                }
            };
        }
        Ok(self)
    }

    pub fn many_in_stack(&mut self, n: i64, name: String, value: Value) -> Result<&mut TS, Error> {
        for _ in 0..n {
            let _ = match value.dup() {
                Ok(nval) => self.push_to_stack(name.clone(), nval),
                Err(err) => {
                    bail!("Error duplicating data in current stack: {}", err);
                }
            };
        }
        Ok(self)
    }

    pub fn swap_in_current_stack(&mut self, n: i64) -> Result<&mut TS, Error> {
        if self.current_stack_len() < 2 {
            bail!("Swap in current stack had failed. Stack too shallow.");
        }
        match self.peek() {
            Some(val) => {
                for _ in 0..n {
                    self.rotate_current_stack_right();
                }
                match self.pull() {
                    Some(oval) => {
                        self.push(val);
                        for _ in 0..n {
                            self.rotate_current_stack_left();
                        }
                        self.pull();
                        self.push(oval);
                        return Ok(self);
                    }
                    None => {
                        bail!("Swap in current stack had failed. Can not pick primary.");
                    }
                }
            }
            None => {
                bail!("Swap in current stack had failed. Can not pick secondary.");
            }
        }
    }

    pub fn swap_in_stack(&mut self, n: i64, name: String) -> Result<&mut TS, Error> {
        if self.stack_len(name.clone()) < 2 {
            bail!("Swap in stack {} had failed. Stack too shallow.", &name);
        }
        match self.peek_from_stack(name.clone()) {
            Some(val) => {
                for _ in 0..n {
                    self.rotate_stack_right(name.clone());
                }
                match self.pull_from_stack(name.clone()) {
                    Some(oval) => {
                        self.push_to_stack(name.clone(), val);
                        for _ in 0..n {
                            self.rotate_stack_left(name.clone());
                        }
                        self.pull_from_stack(name.clone());
                        self.push_to_stack(name.clone(), oval);
                        return Ok(self);
                    }
                    None => {
                        bail!("Swap in stack {} had failed. Can not pick primary.", &name);
                    }
                }
            }
            None => {
                bail!("Swap in stack {} had failed. Can not pick primary.", &name);
            }
        }
    }

}