made with esnextbin
Created
December 29, 2016 21:42
-
-
Save theadam/85507ba7d96c71d1290b6bdda8e832a1 to your computer and use it in GitHub Desktop.
esnextbin sketch
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!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> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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'`); | |
}); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"name": "esnextbin-sketch", | |
"version": "0.0.0", | |
"dependencies": { | |
"effed": "0.1.0", | |
"babel-runtime": "6.18.0" | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'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