diff --git a/src/basic.rs b/src/basic.rs index 7aa74a3..be82a67 100644 --- a/src/basic.rs +++ b/src/basic.rs @@ -2,43 +2,8 @@ use std::{collections::HashMap}; use nom::{bytes::complete::tag, multi::separated_list0, IResult}; -use crate::{parsers, commands::{Line, Primitive, PrintOutput, Command}}; +use crate::{parsers, commands::{Primitive, PrintOutput, Command}, node::Node}; -#[derive(Debug, PartialEq, Eq, Clone)] -pub enum Node { - None, - Link { item: Line, next: Box }, -} - -impl Node { - fn push(&mut self, val: Line) { - *self = match self { - Self::Link { item, next } => { - next.push(val); - Self::Link { - item: item.clone(), - next: next.clone(), - } - } - Self::None => Self::Link { - item: val, - next: Box::new(Self::None), - }, - } - } - - pub fn find_line(&self, line: usize) -> Option { - if let Self::Link { item, next } = self { - if item.0 == line { - Some(self.clone()) - } else { - next.find_line(line) - } - } else { - None - } - } -} #[derive(Debug, PartialEq, Eq, Clone)] pub struct Program { @@ -127,9 +92,12 @@ impl Iterator for Program { mod tests { use crate::basic::PrintOutput; - use super::{Command, Line, Node, Primitive, Program}; + use super::{Command, Node, Primitive, Program}; - use crate::parsers::{commands::parse_line, generic::read_string}; + use crate::{ + parsers::{commands::parse_line, generic::read_string}, + commands::Line + }; #[test] fn it_parses_a_print_command() { diff --git a/src/main.rs b/src/main.rs index 6b7b9df..6a3dd14 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,6 +2,7 @@ use std::fs; mod basic; mod commands; +mod node; mod parsers; fn main() { diff --git a/src/node.rs b/src/node.rs new file mode 100644 index 0000000..0dd3cf4 --- /dev/null +++ b/src/node.rs @@ -0,0 +1,37 @@ +use crate::commands::Line; + +#[derive(Debug, PartialEq, Eq, Clone)] +pub enum Node { + None, + Link { item: Line, next: Box }, +} + +impl Node { + pub fn push(&mut self, val: Line) { + *self = match self { + Self::Link { item, next } => { + next.push(val); + Self::Link { + item: item.clone(), + next: next.clone(), + } + } + Self::None => Self::Link { + item: val, + next: Box::new(Self::None), + }, + } + } + + pub fn find_line(&self, line: usize) -> Option { + if let Self::Link { item, next } = self { + if item.0 == line { + Some(self.clone()) + } else { + next.find_line(line) + } + } else { + None + } + } +} \ No newline at end of file