made with esnextbin
Last active
September 22, 2016 10:07
-
-
Save tusharmath/10f72eb306671817adbba8d4ea5ce15e to your computer and use it in GitHub Desktop.
esnextbin sketch
This file contains 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 --> | |
<app></app> | |
<custom-button></custom-button> | |
</body> | |
</html> |
This file contains 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 | |
console.clear() | |
import h from 'snabbdom/h' | |
import R from 'ramda' | |
import {Observable as O} from 'rx' | |
import snabbdom from 'snabbdom' | |
import delegate from 'delegate' | |
const patch = snabbdom.init([ | |
require('snabbdom/modules/class'), | |
require('snabbdom/modules/props'), | |
require('snabbdom/modules/style'), | |
require('snabbdom/modules/eventlisteners') | |
]) | |
class IBaseDriver { | |
init () {} | |
source () {} | |
sink () {} | |
dispose () {} | |
} | |
class DomDriver extends IBaseDriver { | |
init (component) { | |
const root = this.__root = component.attachShadow({mode: 'open'}) | |
this.__vNode = this.__rootNode = root.appendChild(document.createElement('div')) | |
this.__eventListeners = [] | |
} | |
source () { | |
const select = (selector) => { | |
const events = (event) => O.create(observer => { | |
this.__eventListeners.push( | |
delegate( | |
this.__rootNode, | |
selector, | |
event, | |
observer.onNext, | |
false | |
) | |
) | |
}) | |
return { | |
elements: () => O.just(this.__root.querySelector(selector)), | |
events | |
} | |
} | |
return {select} | |
} | |
sink (sink$) { | |
this.__disposable = sink$ | |
.subscribe(vNode => { | |
this.__vNode = patch(this.__vNode, h('div', [vNode])) | |
}) | |
} | |
dispose () { | |
this.__disposable.dispose() | |
} | |
} | |
class EventDriver extends IBaseDriver { | |
init (component) { | |
this.__component = component | |
} | |
source () { | |
} | |
sink (sink$) { | |
this.__disposable = sink$.subscribe(({type, detail}) => | |
this.__component.dispatchEvent(new CustomEvent(type, {bubbling: true, detail})) | |
) | |
} | |
dispose () { | |
this.__disposable.dispose() | |
} | |
} | |
function createProto (main, drivers) { | |
return { | |
createdCallback () { | |
// init() | |
R.map(driver => driver.init(this), drivers) | |
// source() | |
this.__sources = R.compose( | |
R.filter(Boolean), | |
R.map(driver => driver.source(this)), | |
R.filter(R.propIs(Function, 'source')) | |
)(drivers) | |
const sinks = main(this.__sources) | |
R.mapObjIndexed( | |
(driver, name) => driver.sink(sinks[name]), | |
drivers | |
) | |
} | |
} | |
} | |
function main ({DOM}) { | |
DOM | |
.select('h1') | |
.events('click') | |
.subscribe(x => console.log(x)) | |
return { | |
DOM: O.interval(1000).map((count) => | |
h('div', [ | |
h('strong', [count.toString()]), | |
h('h1', ['Hello World']) | |
]) | |
), | |
EVENT: O.interval(5000).map(detail => | |
({type: 'my-custom-event', detail}) | |
) | |
} | |
} | |
document.registerElement('custom-button', { | |
prototype: Object.assign( | |
Object.create(HTMLElement.prototype), | |
createProto(main, { | |
DOM: new DomDriver(), | |
EVENT: new EventDriver() | |
}) | |
) | |
}) |
This file contains 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": "rwc-observable-support", | |
"dependencies": { | |
"ramda": "0.22.1", | |
"rx": "2.3.0", | |
"snabbdom": "0.5.3", | |
"delegate": "3.0.1", | |
"babel-runtime": "6.11.6" | |
}, | |
"version": "0.0.0" | |
} |
This file contains 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 _create = require('babel-runtime/core-js/object/create'); | |
var _create2 = _interopRequireDefault(_create); | |
var _extends2 = require('babel-runtime/helpers/extends'); | |
var _extends3 = _interopRequireDefault(_extends2); | |
var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of'); | |
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf); | |
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); | |
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); | |
var _inherits2 = require('babel-runtime/helpers/inherits'); | |
var _inherits3 = _interopRequireDefault(_inherits2); | |
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); | |
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); | |
var _createClass2 = require('babel-runtime/helpers/createClass'); | |
var _createClass3 = _interopRequireDefault(_createClass2); | |
var _h = require('snabbdom/h'); | |
var _h2 = _interopRequireDefault(_h); | |
var _ramda = require('ramda'); | |
var _ramda2 = _interopRequireDefault(_ramda); | |
var _rx = require('rx'); | |
var _snabbdom = require('snabbdom'); | |
var _snabbdom2 = _interopRequireDefault(_snabbdom); | |
var _delegate = require('delegate'); | |
var _delegate2 = _interopRequireDefault(_delegate); | |
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | |
// write ES2015 code and import modules from npm | |
// and then press "Execute" to run your program | |
console.clear(); | |
var patch = _snabbdom2.default.init([require('snabbdom/modules/class'), require('snabbdom/modules/props'), require('snabbdom/modules/style'), require('snabbdom/modules/eventlisteners')]); | |
var IBaseDriver = function () { | |
function IBaseDriver() { | |
(0, _classCallCheck3.default)(this, IBaseDriver); | |
} | |
(0, _createClass3.default)(IBaseDriver, [{ | |
key: 'init', | |
value: function init() {} | |
}, { | |
key: 'source', | |
value: function source() {} | |
}, { | |
key: 'sink', | |
value: function sink() {} | |
}, { | |
key: 'dispose', | |
value: function dispose() {} | |
}]); | |
return IBaseDriver; | |
}(); | |
var DomDriver = function (_IBaseDriver) { | |
(0, _inherits3.default)(DomDriver, _IBaseDriver); | |
function DomDriver() { | |
(0, _classCallCheck3.default)(this, DomDriver); | |
return (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(DomDriver).apply(this, arguments)); | |
} | |
(0, _createClass3.default)(DomDriver, [{ | |
key: 'init', | |
value: function init(component) { | |
var root = this.__root = component.attachShadow({ mode: 'open' }); | |
this.__vNode = this.__rootNode = root.appendChild(document.createElement('div')); | |
this.__eventListeners = []; | |
} | |
}, { | |
key: 'source', | |
value: function source() { | |
var _this2 = this; | |
var select = function select(selector) { | |
var events = function events(event) { | |
return _rx.Observable.create(function (observer) { | |
_this2.__eventListeners.push((0, _delegate2.default)(_this2.__rootNode, selector, event, observer.onNext, false)); | |
}); | |
}; | |
return { | |
elements: function elements() { | |
return _rx.Observable.just(_this2.__root.querySelector(selector)); | |
}, | |
events: events | |
}; | |
}; | |
return { select: select }; | |
} | |
}, { | |
key: 'sink', | |
value: function sink(sink$) { | |
var _this3 = this; | |
this.__disposable = sink$.subscribe(function (vNode) { | |
_this3.__vNode = patch(_this3.__vNode, (0, _h2.default)('div', [vNode])); | |
}); | |
} | |
}, { | |
key: 'dispose', | |
value: function dispose() { | |
this.__disposable.dispose(); | |
} | |
}]); | |
return DomDriver; | |
}(IBaseDriver); | |
var EventDriver = function (_IBaseDriver2) { | |
(0, _inherits3.default)(EventDriver, _IBaseDriver2); | |
function EventDriver() { | |
(0, _classCallCheck3.default)(this, EventDriver); | |
return (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(EventDriver).apply(this, arguments)); | |
} | |
(0, _createClass3.default)(EventDriver, [{ | |
key: 'init', | |
value: function init(component) { | |
this.__component = component; | |
} | |
}, { | |
key: 'source', | |
value: function source() {} | |
}, { | |
key: 'sink', | |
value: function sink(sink$) { | |
var _this5 = this; | |
this.__disposable = sink$.subscribe(function (_ref) { | |
var type = _ref.type; | |
var detail = _ref.detail; | |
return _this5.__component.dispatchEvent(new CustomEvent(type, { bubbling: true, detail: detail })); | |
}); | |
} | |
}, { | |
key: 'dispose', | |
value: function dispose() { | |
this.__disposable.dispose(); | |
} | |
}]); | |
return EventDriver; | |
}(IBaseDriver); | |
function createProto(main, drivers) { | |
return { | |
createdCallback: function createdCallback() { | |
var _this6 = this; | |
// init() | |
_ramda2.default.map(function (driver) { | |
return driver.init(_this6); | |
}, drivers); | |
// source() | |
this.__sources = _ramda2.default.compose(_ramda2.default.filter(Boolean), _ramda2.default.map(function (driver) { | |
return driver.source(_this6); | |
}), _ramda2.default.filter(_ramda2.default.propIs(Function, 'source')))(drivers); | |
var sinks = main(this.__sources); | |
_ramda2.default.mapObjIndexed(function (driver, name) { | |
return driver.sink(sinks[name]); | |
}, drivers); | |
} | |
}; | |
} | |
function main(_ref2) { | |
var DOM = _ref2.DOM; | |
DOM.select('h1').events('click').subscribe(function (x) { | |
return console.log(x); | |
}); | |
return { | |
DOM: _rx.Observable.interval(1000).map(function (count) { | |
return (0, _h2.default)('div', [(0, _h2.default)('strong', [count.toString()]), (0, _h2.default)('h1', ['Hello World'])]); | |
}), | |
EVENT: _rx.Observable.interval(5000).map(function (detail) { | |
return { type: 'my-custom-event', detail: detail }; | |
}) | |
}; | |
} | |
document.registerElement('custom-button', { | |
prototype: (0, _extends3.default)((0, _create2.default)(HTMLElement.prototype), createProto(main, { | |
DOM: new DomDriver(), | |
EVENT: new EventDriver() | |
})) | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment