Skip to content

Instantly share code, notes, and snippets.

View medikoo's full-sized avatar

Mariusz Nowak medikoo

View GitHub Profile
var d = require('es5-ext/object/descriptor'); // soon just require('d');
var Foo = function () {};
Object.defineProperties(Foo.prototype, d.binder({
someFn: d(function () {
return this.whatever();
})
}));
@medikoo
medikoo / descriptor.js
Created May 18, 2013 11:11
Descriptors helper
var d = require('es5-ext/lib/Object/descriptor');
// with helper
Object.defineProperties(obj, {
simple: d(value),
getter: d.gs(function () { return this.a + this.b; }),
});
// without helper
Object.defineProperties(obj, {
@medikoo
medikoo / db-setprototypeof.md
Last active December 17, 2015 11:29
DB setPrototypeOf case

setPrototypeOf use case for Database engine written in JavaScript

Ability to rebuild DB state in unspecified order

e.g. first set property of an object and then set object's instance type, or set object as a value of given property and in later turn deciding of what instance that object is.

In short we need the ability to create the object before knowing it's instance type. It makes it very safe for any race conditions. Thanks to that behavior, in engine I work with, rebuild of data state from localStorage is done in whatever order iteration of keys is done (where each key describes a single property and not whole object definition). There's no need to watch the order, or mind circular references, it just works.

Proto change possibility in that case solves a lot of problems and opens many doors. I worked before with simpler version of such engine, which didn't rely on proto switching, it was much more error prone. Missing links crashed (or blocked) database, also order in which state is re-create

@medikoo
medikoo / promised.js
Last active December 12, 2015 07:38
versions().invoke('reverse').reduce(function (result, version) {
return install(target, version, prefix)(visitor.bind(null, null), visitor);
}, null).cb(callback);
@medikoo
medikoo / promise-sequentially.js
Created February 7, 2013 19:33
Process promises sequentially
var files = [/* list of files */];
var iterate = function () {
var file = files.shift();
return file ? process(file).then(iterate) : null;
};
var process = function (file) {
// ...
return promise;
@medikoo
medikoo / promise-chaining.js
Last active December 10, 2015 13:58
Promise chaining
a.then(null, function () {
// A failed, patch it
}).then(function () {
// B logic
}).then(function () {
// C logic
});
@medikoo
medikoo / concurrent.txt
Created October 17, 2012 15:01
When.js not in paranoid mode benchmark
$ node concurrent.js
Promise overhead (concurrent calls) x10000:
1: 309ms Base (plain Node.js lstat call)
2: 440ms When: Dedicated wrapper
3: 543ms Deferred: Dedicated wrapper
4: 625ms Deferred: Promisify (generic wrapper)
5: 682ms Deferred: Map + Promisify
6: 813ms jQuery.Deferred: Dedicated wrapper
7: 2965ms Q: Dedicated wrapper
@medikoo
medikoo / title-router.js
Created August 30, 2012 08:21
Title router
patterns.some(function (data) {
var match;
if (match = url.match(data.pattern)) {
location.title = data.fn(match);
return true;
}
});
@medikoo
medikoo / static-server.js
Created August 10, 2012 08:51
Static server + Webmake
'use strict';
var createServer = require('http').createServer
, staticServer = require('node-static').Server
, webmake = require('webmake')
, rootPath = '/Users/foobar/Projects/my-project'
, publicPath = rootPath + '/public'
, jsProgramPath = rootPath + '/lib/public/main.js';
@medikoo
medikoo / normal-module.js
Created August 9, 2012 13:12
dom.js v0.3
var domjs = require('domjs');
var tpl = domjs.require('./template'); // DocumentFragment [<header>, <nav>, <article>, <footer>]