Created
April 1, 2016 17:44
-
-
Save grebaldi/f02b9da474634712f965545440265ab4 to your computer and use it in GitHub Desktop.
Weird rendering approach
This file contains hidden or 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
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); | |
}); |
This file contains hidden or 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
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