diff --git a/.gitignore b/.gitignore
index ea8c4bf..3a8cabc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,2 @@
/target
+.idea
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..e0ddf81
--- /dev/null
+++ b/index.html
@@ -0,0 +1,29 @@
+
+
+
+
+ TITLE
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Algorithm.rs b/src/Algorithm.rs
index 2dcdab9..b0428b7 100644
--- a/src/Algorithm.rs
+++ b/src/Algorithm.rs
@@ -15,133 +15,123 @@ pub struct Algorithm{
}
-pub enum AlgoEnum{
- InsertSort(Box>),
-}
-
impl Algorithm{
- pub fn insertSort(length:i32) -> impl Generator{
+ pub async fn insertSort(length:i32, delay:f32){
+ let mut list = GuiVec::new(screen_width(), screen_height(), length, delay);
+ list.randomize();
+ for index in 0..list.len(){
+ let mut j = index;
+ while j>0 && list.lessThan(j, j-1){
+ list.swap(j, j - 1).await;
+ j -= 1;
+ }
+ }
+ }
+ /*
+ pub fn stalinSort(length:i32){
let mut list = GuiVec::new(screen_width(), screen_height(), length);
list.randomize();
- move ||{
+
+ let mut cur = 1;
+ loop{
+ if cur == list.len() {
+ break;
+ }
+ if list.lessThan(cur, cur-1){
+ list.delete(cur);
+ }else{
+ cur += 1;
+ }
yield list.clone();
- for index in 0..list.len(){
- let mut j = index;
- while j>0 && list.lessThan(j, j-1){
- yield list.swap(j, j - 1);
- j -= 1;
- }
-
- }
}
+
}
- pub fn stalinSort(length:i32) -> impl Generator{
+
+
+ pub async fn bubbleSort(length:i32){
let mut list = GuiVec::new(screen_width(), screen_height(), length);
list.randomize();
- move ||{
- yield list.clone();
- let mut cur = 1;
- loop{
- if cur == list.len() {
- break;
+ let n = list.len();
+ for i in 0..n {
+ for j in 0..(n - i - 1) {
+ if list.lessThan(j + 1, j) {
+ list.swap(j, j + 1).await;
}
- yield list.clone();
- if list.lessThan(cur, cur-1){
- list.delete(cur)
- }else{
- cur += 1;
- }
- yield list.clone();
}
}
+
}
- pub fn bubbleSort(length:i32) -> impl Generator{
+ pub async fn bogoSort(length:i32){
let mut list = GuiVec::new(screen_width(), screen_height(), length);
list.randomize();
- move || {
- let n = list.len();
- for i in 0..n {
- for j in 0..(n - i - 1) {
- if list.lessThan(j + 1, j) {
- yield list.swap(j, j + 1);
- }
- }
+ loop{
+ list.draw().await;
+ if list.isSorted() {
+ break;
}
+ list.randomize();
}
}
- pub fn bogoSort(length:i32) -> impl Generator{
+ pub async fn cocktailShaker(length:i32){
let mut list = GuiVec::new(screen_width(), screen_height(), length);
list.randomize();
- move || {
- loop{
- yield list.clone();
- if list.isSorted() {
- break;
+ let mut lowerBound = 0;
+ let mut upperBound = list.len()-1;
+ let mut swapped = true;
+ while swapped{
+ swapped = false;
+ for i in lowerBound..upperBound {
+ if list.lessThan(i+1, i) {
+ list.swap(i+1, i).await;
+ swapped = true;
+ }
+ }
+ if !swapped{
+ break;
+ }
+ swapped = false;
+ upperBound = upperBound-1;
+ for i in ((lowerBound)..(upperBound-1)).rev() {
+ if list.lessThan(i+1, i) {
+ list.swap(i+1, i).await;
+ swapped = true;
}
- list.randomize();
}
+ lowerBound = lowerBound+1;
}
- }
- pub fn cocktailShaker(length:i32) -> impl Generator{
- let mut list = GuiVec::new(screen_width(), screen_height(), length);
- list.randomize();
- move || {
- let mut lowerBound = 0;
- let mut upperBound = list.len()-1;
- let mut swapped = true;
- while swapped{
- swapped = false;
- for i in lowerBound..upperBound {
- if list.lessThan(i+1, i) {
- yield list.swap(i+1, i);
- swapped = true;
- }
- }
- if !swapped{
- break;
- }
- swapped = false;
- upperBound = upperBound-1;
- for i in ((lowerBound)..(upperBound-1)).rev() {
- if list.lessThan(i+1, i) {
- yield list.swap(i+1, i);
- swapped = true;
- }
- }
- lowerBound = lowerBound+1;
- }
-
- }
}
- pub fn binaryHeap(length:i32) -> impl Generator{
+ pub async fn binaryHeap(length:i32){
let mut list = GuiVec::new(screen_width(), screen_height(), length);
let mut indexMap:HashMap = HashMap::new();
let mut binHeap:BinaryHeap = BinaryHeap::new();
list.randomize();
- move || {
- let mut ind = 0;
- for bar in list.elements(){
- binHeap.push(bar.position);
- indexMap.insert(bar.position, ind);
- ind += 1;
- }
- for i in (0..list.len()).rev(){
- let bar = binHeap.pop().unwrap();
- let barIndex = *indexMap.get(&bar).unwrap();
- let clone = list.swap(i, barIndex);
- let temp = list.get(barIndex).position;
- indexMap.insert(temp, barIndex);
- yield clone;
- }
+ let mut ind = 0;
+ for bar in list.elements(){
+ binHeap.push(bar.position);
+ indexMap.insert(bar.position, ind);
+ ind += 1;
}
+ for i in (0..list.len()).rev(){
+ let bar = binHeap.pop().unwrap();
+ let barIndex = *indexMap.get(&bar).unwrap();
+ list.swap(i, barIndex).await;
+ let temp = list.get(barIndex).position;
+ indexMap.insert(temp, barIndex);
+
+ }
+
}
+ */
+
+
+
}
\ No newline at end of file
diff --git a/src/GuiHookVec.rs b/src/GuiHookVec.rs
index f54ae06..207c8d8 100644
--- a/src/GuiHookVec.rs
+++ b/src/GuiHookVec.rs
@@ -2,10 +2,14 @@
use std::borrow::{Borrow, BorrowMut};
use std::ops::Add;
use std::path::Iter;
-use macroquad::color::BROWN;
+use macroquad::color::{BROWN, WHITE};
+use macroquad::hash;
+use macroquad::prelude::{clear_background, Vec2};
use macroquad::rand::ChooseRandom;
use macroquad::shapes::draw_rectangle;
-use macroquad::window::{screen_height, screen_width};
+use macroquad::time::get_frame_time;
+use macroquad::ui::root_ui;
+use macroquad::window::{next_frame, screen_height, screen_width};
use crate::BarPlugin::Bar;
use crate::Algorithm::Algorithm;
@@ -16,36 +20,75 @@ pub struct GuiVec{
list: Vec,
initialSize:usize,
pub lastTime:f64,
-
pub reads:i32,
pub writes:i32,
pub comps:i32,
screen_height:f32,
- screen_width:f32
+ screen_width:f32,
+ isPaused:bool,
+ delay:f32
+
}
impl GuiVec{
- pub fn new(screen_width:f32, screen_height:f32,length:i32) -> Self {
- let barWidth = (screen_width/((length) as f32)) - 1_f32;
- let barHeightStep = (screen_height/((length) as f32));
+ pub fn new(screen_width:f32, screen_height:f32,length:i32, delay:f32) -> Self {
let colorStep = 360./length as f32;
let mut list:Vec = vec!();
for i in 1..length+1 {
list.push(Bar::new(i, (colorStep*i as f32)/360.));
}
- GuiVec{list, initialSize:length as usize, lastTime: 0.0 , reads:0, writes:0, comps:0, screen_height, screen_width}
+ GuiVec{list, initialSize:length as usize, lastTime: 0.0 , reads:0, writes:0, comps:0, screen_height, screen_width, isPaused:false, delay}
}
- pub fn draw(&self){
- let mut count = 0;
- for bar in &self.list{
- draw_rectangle(screen_width() * ((count as f32)/(self.initialSize as f32)),screen_height() - (screen_height()/((self.len()) as f32))*bar.position as f32 , screen_width()/((self.len()) as f32), (screen_height()/((self.len()) as f32))*bar.position as f32, bar.color);
- count += 1;
+ pub async fn draw(&mut self){
+ let mut frames = 0.0;
+ let mut delayText = self.delay.to_string();
+
+ loop {
+ /*
+ self.checkPaused();
+ if self.isPaused{
+ break;
+ }
+
+ */
+
+ clear_background(WHITE);
+ let mut count = 0;
+ for bar in &self.list{
+ draw_rectangle(screen_width() * ((count as f32)/(self.initialSize as f32)),screen_height() - (screen_height()/((self.len()) as f32))*bar.position as f32 , screen_width()/((self.len()) as f32), (screen_height()/((self.len()) as f32))*bar.position as f32, bar.color);
+ count += 1;
+ }
+
+ root_ui().window(hash!(), Vec2::new(screen_width()*0.2, 5.), Vec2::new(200., 25.), |ui|{
+ ui.input_text(hash!(), "Delay (ms)", &mut delayText);
+ });
+ self.delay = match delayText.parse::(){
+ Ok(a) => a,
+ Err(error)=> {1.0}
+ };
+
+ next_frame().await;
+ if frames >= self.delay{
+ break;
+ }
+ frames += get_frame_time()*1000.0;
+ }
+
+ }
+
+ fn checkPaused(&mut self){
+ if root_ui().button(Vec2::new(screen_width()*0.01, 90.), "Pause"){
+ if self.isPaused {
+ self.isPaused = false;
+ }else{
+ self.isPaused = true;
+ }
}
}
pub fn resize(&mut self, length:i32){
- self.list = GuiVec::new(self.screen_width, self.screen_height,length).list;
+ self.list = GuiVec::new(self.screen_width, self.screen_height,length, self.delay).list;
}
pub fn len(&self) -> usize{
self.list.len()
@@ -65,11 +108,11 @@ impl GuiVec{
self.initialSize -= 1;
}
- pub fn swap(&mut self, index1:usize, index2:usize) -> GuiVec{
+ pub async fn swap(&mut self, index1:usize, index2:usize){
self.writes += 2;
self.reads += 2;
self.list.swap(index1, index2);
- self.clone()
+ self.draw().await;
}
pub fn randomize(&mut self){
self.list.shuffle();
diff --git a/src/State.rs b/src/State.rs
deleted file mode 100644
index 83fd6b9..0000000
--- a/src/State.rs
+++ /dev/null
@@ -1,71 +0,0 @@
-use std::ops::{Generator, GeneratorState};
-use std::pin::Pin;
-use std::time::Instant;
-
-use macroquad::color::{BLACK, WHITE};
-use macroquad::math::Vec2;
-use macroquad::prelude::{clear_background, draw_text, get_fps, get_time, next_frame, screen_width};
-use macroquad::time::get_frame_time;
-use macroquad::ui::{root_ui, hash};
-use macroquad::window::screen_height;
-use crate::Algorithm::Algorithm;
-use crate::GuiHookVec::GuiVec;
-pub struct State{
-
-}
-
-impl State{
- pub async fn runInsertSort(timeout: f64, length:i32, mut generator:impl Generator+ std::marker::Unpin){
- let mut finished = false;
- let mut paused = false;
- let mut ret = false;
- let mut lasttime:f64 = 0.;
- let mut holder = GuiVec::new(screen_width(), screen_height(), length);
- let mut speed = 1;
- let mut speedText = "1".to_owned();
- loop{
- clear_background(WHITE);
- speed = match speedText.parse::(){
- Ok(a) => a,
- Err(error)=> {1}
- };
- for _ in 0..speed{
- if get_time()-lasttime > timeout && !finished && !paused{
- match Pin::new(& mut generator).resume(()){
- GeneratorState::Yielded(x) => {
- holder = x;
- },
- GeneratorState::Complete(x) => {
- finished = true;
- paused = true;
- }
- };
- lasttime = get_time();
- }
- }
- holder.draw();
- draw_text(format!("Read: {}", holder.reads).as_str(), screen_width()*0.01, 20.0, 20.0, BLACK);
- draw_text(format!("Write: {}", holder.writes).as_str(), screen_width()*0.01, 40.0, 20.0, BLACK);
- draw_text(format!("Comparisons: {}", holder.comps).as_str(), screen_width()*0.01, 60.0, 20.0, BLACK);
- draw_text(format!("FPS: {}", get_fps()).as_str(), screen_width()*0.01, 80., 20.0, BLACK);
- root_ui().window(hash!(), Vec2::new(screen_width()*0.2, 5.), Vec2::new(200., 25.), |ui|{
- ui.input_text(hash!(), "Speed", &mut speedText);
- });
-
- if root_ui().button(Vec2::new(screen_width()*0.01, 90.), "Pause"){
- if paused {
- paused = false;
- }else{
- paused = true;
- }
- }
- if root_ui().button(Vec2::new(screen_width()*0.01, 120.), "Return"){
- ret = true;
- }
- if ret{
- break;
- }
- next_frame().await
- }
- }
-}
\ No newline at end of file
diff --git a/src/main.rs b/src/main.rs
index c7eade2..969e2ab 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -2,20 +2,14 @@
mod BarPlugin;
mod GuiHookVec;
mod Algorithm;
-mod State;
-
-use std::pin::Pin;
use macroquad::prelude::*;
use macroquad::prelude::scene::clear;
use crate::BarPlugin::Bar;
use crate::GuiHookVec::GuiVec;
-use std::ops::{Deref, Generator, GeneratorState};
-use std::process::id;
use macroquad::hash;
use macroquad::ui::root_ui;
-use crate::Algorithm::AlgoEnum;
#[macroquad::main("BeepSort")]
@@ -38,31 +32,16 @@ async fn main() {
draw_text("Sorting!", screen_width()*0.3, screen_height()*0.5, 100.0, GREEN);
draw_text(format!("Length: {}", length.to_string()).as_str(), screen_width()*0.83, 30., 20.0, BLACK);
-
+ draw_text(&get_fps().to_string(), screen_width()*0.7, 30.0, 20.0, BLACK);
root_ui().window(hash!(), Vec2::new(screen_width()*0.01, 45.), Vec2::new(250., 50.), |ui|{
ui.input_text(hash!(), "Delay (ms)", &mut delayText);
ui.input_text(hash!(), "Length Of Array!", &mut lengthString);
});
- if root_ui().button(Vec2::new(screen_width()*0.01, 100.), "InsertSort"){
- State::State::runInsertSort(delay,length, Algorithm::Algorithm::insertSort(length)).await;
+ if root_ui().button(Vec2::new(screen_width()*0.01, 100.), "RUN!"){
+ //State::State::runInsertSort(delay,length).await;
+ Algorithm::Algorithm::insertSort(length, 1.0).await;
}
- if root_ui().button(Vec2::new(screen_width()*0.01, 130.), "BogoSort"){
- State::State::runInsertSort(delay,length, Algorithm::Algorithm::bogoSort(length)).await;
- }
- if root_ui().button(Vec2::new(screen_width()*0.01, 160.), "BubbleSort"){
- State::State::runInsertSort(delay, length, Algorithm::Algorithm::bubbleSort(length)).await;
- }
- if root_ui().button(Vec2::new(screen_width()*0.01, 190.), "StalinSort"){
- State::State::runInsertSort(delay, length, Algorithm::Algorithm::stalinSort(length)).await;
- }
- if root_ui().button(Vec2::new(screen_width()*0.01, 220.), "CoctailShaker"){
- State::State::runInsertSort(delay, length, Algorithm::Algorithm::cocktailShaker(length)).await;
- }
- if root_ui().button(Vec2::new(screen_width()*0.01, 250.), "HeapSort!"){
- State::State::runInsertSort(delay, length, Algorithm::Algorithm::binaryHeap(length)).await;
- }
-
next_frame().await
}