You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
118 lines
2.9 KiB
118 lines
2.9 KiB
var fstream = require('../fstream.js') |
|
var path = require('path') |
|
|
|
var r = fstream.Reader({ |
|
path: path.dirname(__dirname), |
|
filter: function () { |
|
return !this.basename.match(/^\./) && |
|
!this.basename.match(/^node_modules$/) && |
|
!this.basename.match(/^deep-copy$/) |
|
} |
|
}) |
|
|
|
var w = fstream.Writer({ |
|
path: path.resolve(__dirname, 'deep-copy'), |
|
type: 'Directory' |
|
}) |
|
|
|
var indent = '' |
|
|
|
r.on('entry', appears) |
|
r.on('ready', function () { |
|
console.error('ready to begin!', r.path) |
|
}) |
|
|
|
function appears (entry) { |
|
console.error(indent + 'a %s appears!', entry.type, entry.basename, typeof entry.basename, entry) |
|
if (foggy) { |
|
console.error('FOGGY!') |
|
var p = entry |
|
do { |
|
console.error(p.depth, p.path, p._paused) |
|
p = p.parent |
|
} while (p) |
|
|
|
throw new Error('\u001b[mshould not have entries while foggy') |
|
} |
|
indent += '\t' |
|
entry.on('data', missile(entry)) |
|
entry.on('end', runaway(entry)) |
|
entry.on('entry', appears) |
|
} |
|
|
|
var foggy |
|
function missile (entry) { |
|
function liftFog (who) { |
|
if (!foggy) return |
|
if (who) { |
|
console.error('%s breaks the spell!', who && who.path) |
|
} else { |
|
console.error('the spell expires!') |
|
} |
|
console.error('\u001b[mthe fog lifts!\n') |
|
clearTimeout(foggy) |
|
foggy = null |
|
if (entry._paused) entry.resume() |
|
} |
|
|
|
if (entry.type === 'Directory') { |
|
var ended = false |
|
entry.once('end', function () { ended = true }) |
|
return function (c) { |
|
// throw in some pathological pause()/resume() behavior |
|
// just for extra fun. |
|
process.nextTick(function () { |
|
if (!foggy && !ended) { // && Math.random() < 0.3) { |
|
console.error(indent + '%s casts a spell', entry.basename) |
|
console.error('\na slowing fog comes over the battlefield...\n\u001b[32m') |
|
entry.pause() |
|
entry.once('resume', liftFog) |
|
foggy = setTimeout(liftFog, 10) |
|
} |
|
}) |
|
} |
|
} |
|
|
|
return function (c) { |
|
var e = Math.random() < 0.5 |
|
console.error(indent + '%s %s for %d damage!', |
|
entry.basename, |
|
e ? 'is struck' : 'fires a chunk', |
|
c.length) |
|
} |
|
} |
|
|
|
function runaway (entry) { |
|
return function () { |
|
var e = Math.random() < 0.5 |
|
console.error(indent + '%s %s', |
|
entry.basename, |
|
e ? 'turns to flee' : 'is vanquished!') |
|
indent = indent.slice(0, -1) |
|
} |
|
} |
|
|
|
w.on('entry', attacks) |
|
// w.on('ready', function () { attacks(w) }) |
|
function attacks (entry) { |
|
console.error(indent + '%s %s!', entry.basename, |
|
entry.type === 'Directory' ? 'calls for backup' : 'attacks') |
|
entry.on('entry', attacks) |
|
} |
|
|
|
var ended = false |
|
r.on('end', function () { |
|
if (foggy) clearTimeout(foggy) |
|
console.error("\u001b[mIT'S OVER!!") |
|
console.error('A WINNAR IS YOU!') |
|
|
|
console.log('ok 1 A WINNAR IS YOU') |
|
ended = true |
|
}) |
|
|
|
process.on('exit', function () { |
|
console.log((ended ? '' : 'not ') + 'ok 2 ended') |
|
console.log('1..2') |
|
}) |
|
|
|
r.pipe(w)
|
|
|