Skip to content

Instantly share code, notes, and snippets.

@tusharmath
Last active September 22, 2016 10:07
Show Gist options
  • Save tusharmath/10f72eb306671817adbba8d4ea5ce15e to your computer and use it in GitHub Desktop.
Save tusharmath/10f72eb306671817adbba8d4ea5ce15e 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 -->
<app></app>
<custom-button></custom-button>
</body>
</html>
// 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()
})
)
})
{
"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"
}
'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