Skip to content

Instantly share code, notes, and snippets.

@theadam
Created December 29, 2016 21:42
Show Gist options
  • Save theadam/85507ba7d96c71d1290b6bdda8e832a1 to your computer and use it in GitHub Desktop.
Save theadam/85507ba7d96c71d1290b6bdda8e832a1 to your computer and use it in GitHub Desktop.
esnextbin sketch
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>ESNextbin Sketch</title>
<!-- put additional styles and scripts here -->
</head>
<body>
<!-- put markup and other contents here -->
</body>
</html>
// write ES2015 code and import modules from npm
// and then press "Execute" to run your program
import { createRunner } from 'effed';
// Commands
const readFile = name => ({ type: 'READ', name });
const writeFile = (name, data) => ({ type: 'WRITE', name, data });
// Interpreters
// Logging interpreter
const loggingRunner = createRunner(run => next => effect => {
if (effect.type === 'READ') {
console.log(`Reading file '${effect.name}'`);
return Promise.resolve('Fake file data.');
} else if (effect.type === 'WRITE') {
console.log(`Writing data '${effect.data}' to file '${effect.name}'`);
return Promise.resolve(effect.data.length);
}
return next(effect)
});
// LocalStorage interpreter
const localStorageRunner = createRunner(run => next => effect => {
if (effect.type === 'READ') {
const { name } = effect;
const data = localStorage.getItem(name);
return Promise.resolve(data);
} else if (effect.type === 'WRITE') {
const { name, data } = effect;
localStorage.setItem(name, data)
return Promise.resolve(effect.data.length);
}
return next(effect)
});
// DSL
const copy = (from, to) => function * () {
const test = yield readFile(from);
return yield writeFile(to, test);
}
// Fake implementation
loggingRunner(copy('from', 'to')).then(x => console.log(`${x} bytes written`))
// localStorage implementation
localStorage.removeItem('to');
localStorage.setItem('from', 'Fake file data');
localStorageRunner(copy('from', 'to')).then(x => {
const data = localStorage.getItem('to');
console.log(`'${data}' written to 'to'`);
});
{
"name": "esnextbin-sketch",
"version": "0.0.0",
"dependencies": {
"effed": "0.1.0",
"babel-runtime": "6.18.0"
}
}
'use strict';
var _regenerator = require('babel-runtime/regenerator');
var _regenerator2 = _interopRequireDefault(_regenerator);
var _promise = require('babel-runtime/core-js/promise');
var _promise2 = _interopRequireDefault(_promise);
var _effed = require('effed');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
// Commands
var readFile = function readFile(name) {
return { type: 'READ', name: name };
}; // write ES2015 code and import modules from npm
// and then press "Execute" to run your program
var writeFile = function writeFile(name, data) {
return { type: 'WRITE', name: name, data: data };
};
// Interpreters
// Logging interpreter
var loggingRunner = (0, _effed.createRunner)(function (run) {
return function (next) {
return function (effect) {
if (effect.type === 'READ') {
console.log('Reading file \'' + effect.name + '\'');
return _promise2.default.resolve('Fake file data.');
} else if (effect.type === 'WRITE') {
console.log('Writing data \'' + effect.data + '\' to file \'' + effect.name + '\'');
return _promise2.default.resolve(effect.data.length);
}
return next(effect);
};
};
});
// LocalStorage interpreter
var localStorageRunner = (0, _effed.createRunner)(function (run) {
return function (next) {
return function (effect) {
if (effect.type === 'READ') {
var name = effect.name;
var data = localStorage.getItem(name);
return _promise2.default.resolve(data);
} else if (effect.type === 'WRITE') {
var _name = effect.name;
var _data = effect.data;
localStorage.setItem(_name, _data);
return _promise2.default.resolve(effect.data.length);
}
return next(effect);
};
};
});
// DSL
var copy = function copy(from, to) {
return _regenerator2.default.mark(function _callee() {
var test;
return _regenerator2.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
_context.next = 2;
return readFile(from);
case 2:
test = _context.sent;
_context.next = 5;
return writeFile(to, test);
case 5:
return _context.abrupt('return', _context.sent);
case 6:
case 'end':
return _context.stop();
}
}
}, _callee, this);
});
};
// Fake implementation
loggingRunner(copy('from', 'to')).then(function (x) {
return console.log(x + ' bytes written');
});
// localStorage implementation
localStorage.removeItem('to');
localStorage.setItem('from', 'Fake file data');
localStorageRunner(copy('from', 'to')).then(function (x) {
var data = localStorage.getItem('to');
console.log('\'' + data + '\' written to \'to\'');
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment