From 4cc652dc9dc4038d0e0083800f2ebe8a875d156b Mon Sep 17 00:00:00 2001 From: Isaac Ezer Date: Tue, 20 Aug 2019 16:52:00 -0400 Subject: [PATCH] debug bubble sort --- ember/algos/app/components/bubble-sort.js | 97 +++++++++++++++++++ ember/algos/app/styles/app.scss | 10 ++ ember/algos/app/templates/application.hbs | 2 + .../app/templates/components/bubble-sort.hbs | 4 + 4 files changed, 113 insertions(+) create mode 100644 ember/algos/app/components/bubble-sort.js create mode 100644 ember/algos/app/templates/components/bubble-sort.hbs diff --git a/ember/algos/app/components/bubble-sort.js b/ember/algos/app/components/bubble-sort.js new file mode 100644 index 0000000..ffe082c --- /dev/null +++ b/ember/algos/app/components/bubble-sort.js @@ -0,0 +1,97 @@ +import Component from '@ember/component'; +import { schedule } from '@ember/runloop'; + +export default Component.extend({ + step: false, + + createLines() { + let { a } = this; + let container = document.querySelector('.bubble-sort'); + for (let i = 0; i < a.length; i++) { + let line = document.createElement('div'); + line.classList = ['line']; + line.id = `line-${i}`; + line.style.width = `${a[i] * 10}%`; + container.appendChild(line); + } + schedule('afterRender', this, 'bubbleSort'); + }, + + bubbleSort: async function() { + let { a: lines } = this; + + for (let i = 0; i < lines.length; i++) { + for (let j = i; j < lines.length; j++) { + if (lines[i] > lines[j]) { + let temp = lines[j]; + lines[j] = lines[i]; + lines[i] = temp; + this.updateLines(lines); + + await new Promise(resolve => { + let checkStep = () => { + setTimeout(() => { + if (this.step) { + resolve(); + } else { + checkStep(); + } + }, 400); + }; + + checkStep(); + }); + } + } + } + }, + + syncBubbleSort() { // without async/await + let { a: lines } = this; + let promise = Promise.resolve(); + for (let i = 0; i < lines.length; i++) { + for (let j = i; j < lines.length; j++) { + + let doSwap = (lines, i, j) => { + promise = promise.then(() => { + return new Promise(resolve => { + setTimeout(() => { + if (lines[i] > lines[j]) { + let temp = lines[j]; + lines[j] = lines[i]; + lines[i] = temp; + this.updateLines(lines); + } + resolve(); + }, 100); + }); + }); + }; + + doSwap(lines, i, j); + } + } + }, + + updateLines() { + let { a } = this; + a.forEach((value, index) => { + let line = document.querySelector(`#line-${index}`); + line.style.width = `${value * 10}%`; + }); + }, + + didInsertElement() { + this._super(...arguments); + + this.a = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]; + + schedule('afterRender', this, 'createLines'); + }, + + actions: { + step() { + this.toggleProperty('step'); + } + } +}); diff --git a/ember/algos/app/styles/app.scss b/ember/algos/app/styles/app.scss index f8bb39c..987e50b 100644 --- a/ember/algos/app/styles/app.scss +++ b/ember/algos/app/styles/app.scss @@ -85,3 +85,13 @@ border: 1px solid; } } + +.bubble-sort { + width: 400px; + + .line { + background-color: red; + height: 10px; + margin-bottom: 10px; + } +} diff --git a/ember/algos/app/templates/application.hbs b/ember/algos/app/templates/application.hbs index 3ac0e9a..035ad72 100644 --- a/ember/algos/app/templates/application.hbs +++ b/ember/algos/app/templates/application.hbs @@ -1,3 +1,5 @@ + + diff --git a/ember/algos/app/templates/components/bubble-sort.hbs b/ember/algos/app/templates/components/bubble-sort.hbs new file mode 100644 index 0000000..ea58529 --- /dev/null +++ b/ember/algos/app/templates/components/bubble-sort.hbs @@ -0,0 +1,4 @@ +
+
+ +