#!/usr/bin/env node
"use strict";
var fs = require('fs');
global.Fiber = require('../fibers');
global.Future = require('../future');

// Start the repl
var vm = require('vm');
var domain = require('domain');
var repl = require('repl').start('node> ', null, fiberEval, true, true);
function fiberEval(code, context, file, cb) {
	if (/^\([ \r\n\t+]\)$/.test(code)) {
		return cb(false, undefined);
	}
	// Parses?
	try {
		new Function(code);
	} catch (err) {
		return cb(err, false);
	}

	// Run in fiber
	Future.task(function() {
		// Save history
		var last;
		repl.rli.history = repl.rli.history.slice(0, 50).filter(function(item) {
			try {
				return item !== last;
			} finally {
				last = item;
			}
		});
		fs.writeFile(process.env.HOME+ '/.node-history', JSON.stringify(repl.rli.history), function(){});

		// Run user code
		var d = domain.create();
		d.run(function() {
			cb(null, vm.runInThisContext(code, file));
		});
		d.on('error', function(err) {
			console.error('\nUnhandled error: '+ err.stack);
		});
	}).resolve(cb);
}

// Load history
try {
	repl.rli.history = JSON.parse(fs.readFileSync(process.env.HOME+ '/.node-history', 'utf-8'));
} catch (err) {}