Skip to content

Instantly share code, notes, and snippets.

View trxcllnt's full-sized avatar

Paul Taylor trxcllnt

View GitHub Profile
@trxcllnt
trxcllnt / Generator.js
Created June 1, 2015 20:31
RxJS 3 CurrentFrame Scheduler
var noop = require("rx/support/noop");
var try_catch = require("rx/support/try-catch");
var flatten_args = require("rx/support/arguments-flatten");
var errorObj = require("rx/support/error-object");
function Generator(destinationOrNext, _throw, _return) {
if(destinationOrNext && typeof destinationOrNext === "object") {
this.result = destinationOrNext.result || { done: false };
this.destination = destinationOrNext;
} else {
@trxcllnt
trxcllnt / tailrec.sjs
Last active August 29, 2015 14:14
Macros to rewrite tail-recursive immediately invoked function expressions (IIFE) and function declarations as tight while loops.
/* output *//*
var result;
var acc = 1, x = 10;
while (true) {
if (x <= 1) {
// non-recursive return invocations aren't rewritten
acc = log(acc);
break;
} else {
acc = acc * x;
@trxcllnt
trxcllnt / curried.sjs
Last active March 18, 2017 13:34
curry and partially apply functions or macros with sweet.js
/*output*//*
var foo = 'd', bar = 'e';
console.log('a', 'b', 'c', foo, bar);
console.log('a', 'b', 'c', foo, 2, 3, 4, 5);
console.log('a', 'c', 'b');
console.log('a', 'd', 'b', 'f', 'e', 'g', foo);
function veryLongFunction() {
console.log.apply(console, arguments);
}
veryLongFunction('a', 'b', 'c', 'd', 'e', 'f');
@trxcllnt
trxcllnt / scheduler-tests.js
Last active August 29, 2015 14:13
Testing Rx's currentThread and immediate scheduler schedule events appropriately even when requested in the future (and they have to block).
/* output:
legend:
current: Scheduled concurrently by the CurrentThread scheduler.
recursive: Scheduled recursively by the Immediate scheduler.
setTimeout: Scheduled asynchronously by the Timeout scheduler.
blocking-current: Scheduled to block concurrently by the CurrentThread scheduler.
blocking-recursive: Scheduled to block recursively by the Immediate scheduler.
setTimeout a 0
setTimeout b 0
@trxcllnt
trxcllnt / EnumerableX.js
Last active August 29, 2015 14:11
Unrolling Enumerable.
macro flatMapVars { rule { } => { } }
macro concatVars { rule { } => { } }
macro flatMapCond { rule { } => { true } }
macro concatsCond { rule { } => { true } }
macro concatBlocks { rule { } => { } }
// wrapArgs(x, i, a) .foo(function (y, j, b) { return y + 1; }) ... ;
macro wrapArgs {
function(stxs, context) {
var name_stx = stxs[0];
@trxcllnt
trxcllnt / expandRecursive.js
Created October 3, 2014 08:07
Ix/Rx expandRecursive is a depth-first recursive expansion on the sequences.
var Ix = require('ix'),
Rx = require('rx'),
Enumerable = Ix.Enumerable,
Enumerator = Ix.Enumerator,
Observable = Rx.Observable;
Observable.permute = function(root, hasPermutation, resultSelector) {
return Observable
.returnValue({ value: root, depth: -1 })
.expandRecursive(function(wrapper) {
@trxcllnt
trxcllnt / optional-params-and-tail-call-optimizer.sjs.js
Last active August 29, 2015 14:04
Sweet.js macros for optional/default params, and a macro to unroll tail-recursive functions into imperative loops.
macro parameters {
rule { ($arguments ...) } => { (params ($arguments ...)) }
}
macro params {
// group matchers
rule { ($x:ident = $y:expr , $rest:params (,) ...) } => { $x , $rest (,) ... }
rule { ($x:ident , $rest:params (,) ...) } => { $x , $rest (,) ... }
rule { ($x:ident = $y:expr) } => { $x }
@trxcllnt
trxcllnt / zone.js
Last active August 29, 2015 14:01
// Zone.create = Observable.create
// Zone#setCallback = Observable#forEach/Observable#subscribe
// Zone#then = Observable#map
// Zone#catch = Observable#catch
//
// A little stub of some zone examples that map 1-1 with Rx. Instead of a zone global,
// the "zone" object is passed in to the function we created the Zone with.
//
// This allows us to run multiple Zones in parallel, for example, if we want to await
// two run two asynchronous operations (say, a file-read and a network request) at the
@trxcllnt
trxcllnt / Observable.js
Last active August 29, 2015 14:00
Observable with Lift and Mutate
var Subscriber = require('./Subscriber'),
noop = require('./support/noop')
;
module.exports = (function Observable() {
function fixDisposable(subscriber, disposable) {
var disposableType;
if(disposable != null) {
if((disposableType = typeof disposable) === 'function') {
@trxcllnt
trxcllnt / client.js
Created November 23, 2013 05:11
Browserify + Rx
// Have to do this to browserify Rx :/
window.global = window;
var Rx = require('rx');
Rx.Observable.interval(100).subscribe(function(i) {
console.log(i);
});