@@ -1,37 +1,33 @@
1'use strict'
1'use strict'
3const Progress = keys => {
3const Progress = keys => {
4− const allKeys = new Set(keys.filter(key => key))
4+ const stack = new Set(keys.filter(key => key))
5− const loadedKeys = new Set()
5+ const loaded = new Set()
6− const failedKeys = new Set()
6+ const failed = new Set()
8− const done = () => loadedKeys.size === allKeys.size
8+ this.ratio = () => {
9−
9+ return loaded.size / stack.size
10− const className = () => done() ? 'done' : 'busy'
10+ }
12− const formatPercentLoaded = () => `
13− ${Math.round(100 * loadedKeys.size / Math.max(allKeys.size, 1))}% loaded
16− const formatFailureCount = () => failedKeys.size === 0
18− : `(${failedKeys.size} failed)`
20− const formatProgress = () => done()
12+ this.percentage = () => {
21− ? ''
13+ return (100 * this.ratio()).toFixed(2)
22− : `<p><progress value='${loadedKeys.size}' max='${allKeys.size}'></progress></p>`
14+ }
24 const render = () => `
16 const render = () => `
25− <div class='${className()}'>
17+ <div class='${loaded.size !== stack.size ? 'busy' : 'done'}'>
26− <p>${formatPercentLoaded()} ${formatFailureCount()}</p>
18+ <p>
27− ${formatProgress()}
19+ ${'|'.repeat(this.ratio() * 10)}
20+ ${loaded.size !== stack.size ? this.percentage() + '% ' : ''}
21+ ${loaded.size === stack.size ? 'Complete' : 'Loading'}
22+ ${failed.size !== 0 ? `(${failed.size} failed)` : ''}
31 const didLoad = (key, success) => new Promise((resolve, reject) => {
27 const didLoad = (key, success) => new Promise((resolve, reject) => {
32− if (allKeys.has(key)) {
28+ if (stack.has(key)) {
33− loadedKeys.add(key)
29+ loaded.add(key)
34− if (!success) failedKeys.add(key)
30+ if (!success) failed.add(key)
35 return resolve()
31 return resolve()
37 return reject()
33 return reject()
@@ -41,7 +37,6 @@ const Progress = keys => {
42 success: key => didLoad(key, true),
38 success: key => didLoad(key, true),
43 failure: key => didLoad(key, false),
39 failure: key => didLoad(key, false),
45− render,
40+ toString: render