Skip to content

Instantly share code, notes, and snippets.

@grebaldi
Created April 1, 2016 17:44
Show Gist options
  • Save grebaldi/f02b9da474634712f965545440265ab4 to your computer and use it in GitHub Desktop.
Save grebaldi/f02b9da474634712f965545440265ab4 to your computer and use it in GitHub Desktop.
Weird rendering approach
const RENDER_COMMAND = '@blubb/RENDER';
const createOverride = factory => {
const override = lower => {
if (lower === RENDER_COMMAND) {
return factory();
}
return createOverride(upper => factory(Object.assign(lower, upper)));
};
override.isOverride = true;
return override;
};
const resolveObject = (obj, context) => {
let newObj = {};
Object.keys(obj).forEach(key => {
if (typeof obj[key] === 'function') {
if (obj[key].isOverride) {
newObj[key] = obj[key](RENDER_COMMAND)(context);
} else {
newObj[key] = obj[key](context);
}
} else {
newObj[key] = obj[key];
}
});
return newObj;
};
export const createRenderer = factory => configuration => {
return createOverride(override => context => factory(resolveObject(Object.assign(configuration, override), context)));
};
export const runtimeFactory = callback => {
const runtime = (renderer, context = {}) => override => {
const result = override ? renderer(override)(RENDER_COMMAND)(context) : renderer(RENDER_COMMAND)(context);
callback(result);
return runtime(renderer, context);
};
return runtime;
}
export const graph = createRenderer(configuration => {
return Object.keys(configuration).map(key => configuration[key]).join('');
});
export const template = createRenderer(configuration => {
const {template} = configuration;
return template(configuration);
});
const graph = require('./src/index.js').graph;
const template = require('./src/index.js').template;
const runtimeFactory = require('./src/index.js').runtimeFactory;
const runtime = runtimeFactory(result => console.log(result));
const test = graph({
welcome: 'Hello, ',
name: 'Paul!'
});
const peter = test({
name: context => (context.unlike || 'Peter') + '?!?'
});
const goaway = peter({
welcome: 'Go away, '
});
const mary = peter({
welcome: 'Good to see you, ',
name: 'Mary <3 :)',
add: graph({
1: 'some more',
2: 'details'
}),
blubb: template({
template: () => ({name, age}) => name + ' is ' + age + ' years old',
name: 'wilhelm',
age: 122
})
});
runtime(test)();
runtime(peter)();
runtime(goaway, { unlike: 'Dieter' })();
runtime(mary)();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment