@startuml "bliplib class diagram" left to right direction skinparam linetype ortho package std { interface From { from(value: T): Self } } package nom { interface Parser } package fasteval { enum Instruction } package parser { interface TokenParser struct ParserParametters<'n, 's, 'v, I: Input + Clone + nom::Compare, C: Into> { +notes: &'n [I] +slopes: &'s HashMap +variables: &'v [C] } struct Parser<'i, 'n, 's, 'v, I: Input + Clone, C: Into> { -input: &'i I -parametters: ParserParametters<'n, 's, 'v, I, C> +parse_all(): Result>, nom::Error>> } struct ParserBuilder<'i, 'n, 's, 'v, I: Input + Clone, C: Into> { -input: Option<&'i I> -notes: Option<&'n [I]> -slopes: Option<&'s HashMap> -variables: Option<&'v [C]> +input(self, input: &'i I): Self +notes(self, notes: &'n [I]): Self +slopes(self, slopes: &'s HashMap): Self +variables(self, variables: &'v [C]): Self } } package compiler { interface Token { -apply(&self, context: Context): Context } struct Silence { -parser(): impl TokenParser } struct Marker { -parser(): impl TokenParser } struct Note { +n: u8 -parser<'a, I: nom::Input + nom::Compare + Clone>(notes: &'a [I]): impl TokenParser } struct VariableChange { +name: char, +change: Instruction -parser<'a, I, C: Into + Clone>(variables: &'a [C]): impl TokenParser } struct Loop { +times: usize +inner: Vec> -parser<'n, 's, 'v, I: Input + Clone + nom::Compare, C: Into>(parametters: ParserParametters<'n, 's, 'v, I, C>): impl TokenParser } struct Tuplet { +inner: Vec> -parser<'n, 's, 'v, I: Input + Clone + nom::Compare, C: Into>(parametters: ParserParametters<'n, 's, 'v, I, C>): impl TokenParser } struct Slope { +inner: Vec> +each_frame: VariableChange -parser<'n, 's, 'v, I: Input + Clone + nom::Compare, C: Into>(parametters: ParserParametters<'n, 's, 'v, I, C>): impl TokenParser } struct Context { +result: Vec +variables: HashMap +instrument: Instruction +slopes: HashMap +current_length(&self): f64 +render(&self, n: Option): Vec } } compiler.Silence ..|> Token compiler.Marker ..|> Token compiler.Note ..|> Token compiler.VariableChange ..|> Token compiler.Loop ..|> Token compiler.Tuplet ..|> Token compiler.Slope ..|> Token compiler.Token --> parser.Parser parser.Parser --> VariableChange parser.ParserBuilder --> VariableChange compiler.Loop --> ParserParametters compiler.Tuplet --> ParserParametters compiler.Slope --> ParserParametters compiler.Silence --> TokenParser compiler.Marker --> TokenParser compiler.Note --> TokenParser compiler.VariableChange --> TokenParser compiler.Loop --> TokenParser compiler.Tuplet --> TokenParser compiler.Slope --> TokenParser interface "From" as from_parserbuilder interface "nom::Parser>" as nomparser_locatedspan from_parserbuilder --> parser.ParserBuilder from_parserbuilder --> parser.ParserParametters from_parserbuilder --|> std.From nomparser_locatedspan --|> nom.Parser parser.Parser --> nomparser_locatedspan parser.Parser ..|> from_parserbuilder parser.TokenParser --|> nomparser_locatedspan: Output = Self, Error = nom::Err nomparser_locatedspan ..|> parser.TokenParser: for any T compiler.Slope --> compiler.VariableChange compiler.Token --> compiler.Context compiler.VariableChange --> Instruction Context --> Instruction @enduml