algostru 0.4.0

Algorithms (algo) and Data Structures (stru)
Documentation
use tui::{
    style::{
        Color,
        Modifier,
        Style
    },
    widgets::{
        Axis,
        Block,
        Borders,
        Chart,
        Dataset,
    },
    symbols,
    text::{
        Span
    }
};

use crate::gui::screen::dashboard::Plot;

const COLORS: [Color; 7] = [
    Color::Green,
    Color::LightGreen,
    Color::LightYellow,
    Color::Yellow,
    Color::Rgb(255,165,0),
    Color::Rgb(255,140,0),
    Color::Red,
];

pub fn draw_big_o_chart<'a>(window: &[(f64, f64); 2], plot: &'a mut Plot) -> Chart<'a> {
    let x_labels = vec![
        Span::styled(format!("{}", window[0].0), Style::default().add_modifier(Modifier::BOLD)),
        Span::raw(format!("{}", (window[0].0 + window[0].1) / 2.0)),
        Span::styled(format!("{}", window[0].1), Style::default().add_modifier(Modifier::BOLD)),
    ];

    let y_labels = vec![
        Span::styled(format!("{}", window[1].0), Style::default().add_modifier(Modifier::BOLD)),
        Span::raw(format!("{}", (window[1].0 + window[1].1) / 2.0)),
        Span::styled(format!("{}", window[1].1), Style::default().add_modifier(Modifier::BOLD)),
    ];

    let mut datasets = vec![];
    for (i, line) in plot.lines.iter_mut().enumerate() {
        datasets.push(
            Dataset::default()
                .name(&line.label)
                .marker(symbols::Marker::Dot)
                .style(Style::default().fg(COLORS[i]))
                .data(&line.points)
        );
    }

    Chart::new(datasets)
        .block(
            Block::default()
                .title(Span::styled(
                    "Big-O Notation",
                    Style::default()
                        .fg(Color::Cyan)
                        .add_modifier(Modifier::BOLD),
                ))
                .borders(Borders::ALL),
        )
        .x_axis(
            Axis::default()
                .title("Elements")
                .style(Style::default().fg(Color::Gray))
                .bounds([window[0].0, window[0].1])
                .labels(x_labels),
        )
        .y_axis(
            Axis::default()
                .title("Operations")
                .style(Style::default().fg(Color::Gray))
                .bounds([window[1].0, window[1].1])
                .labels(y_labels),
        )
}