Move Node into module
This commit is contained in:
parent
756d572d21
commit
627baa8449
44
src/basic.rs
44
src/basic.rs
@ -2,43 +2,8 @@ use std::{collections::HashMap};
|
|||||||
|
|
||||||
use nom::{bytes::complete::tag, multi::separated_list0, IResult};
|
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<Node> },
|
|
||||||
}
|
|
||||||
|
|
||||||
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<Node> {
|
|
||||||
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)]
|
#[derive(Debug, PartialEq, Eq, Clone)]
|
||||||
pub struct Program {
|
pub struct Program {
|
||||||
@ -127,9 +92,12 @@ impl Iterator for Program {
|
|||||||
mod tests {
|
mod tests {
|
||||||
use crate::basic::PrintOutput;
|
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]
|
#[test]
|
||||||
fn it_parses_a_print_command() {
|
fn it_parses_a_print_command() {
|
||||||
|
@ -2,6 +2,7 @@ use std::fs;
|
|||||||
|
|
||||||
mod basic;
|
mod basic;
|
||||||
mod commands;
|
mod commands;
|
||||||
|
mod node;
|
||||||
mod parsers;
|
mod parsers;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
37
src/node.rs
Normal file
37
src/node.rs
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
use crate::commands::Line;
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq, Eq, Clone)]
|
||||||
|
pub enum Node {
|
||||||
|
None,
|
||||||
|
Link { item: Line, next: Box<Node> },
|
||||||
|
}
|
||||||
|
|
||||||
|
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<Node> {
|
||||||
|
if let Self::Link { item, next } = self {
|
||||||
|
if item.0 == line {
|
||||||
|
Some(self.clone())
|
||||||
|
} else {
|
||||||
|
next.find_line(line)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user