@tpluscode/rdfine
Version:
RDF/JS idiomatic, native, effective
40 lines (39 loc) • 1.65 kB
JavaScript
export function createFactory(mixins, baseInitializer, env) {
const fullFactory = (pointer, initializer, { additionalMixins = [] } = {}) => {
return env.rdfine().factory.createEntity(pointer, [...mixins, ...additionalMixins], {
initializer: {
...baseInitializer,
...(initializer || {}),
},
});
};
const curriedNamedFactory = (id, initializer, { additionalMixins = [] } = {}) => {
return (ptr) => {
const graph = ptr || env.clownface();
const term = typeof id === 'string' ? graph.namedNode(id) : graph.node(id);
return env.rdfine().factory.createEntity(term, [...mixins, ...additionalMixins], {
initializer: {
...baseInitializer,
...(initializer || {}),
},
});
};
};
const curriedBlankFactory = (initializer, { additionalMixins = [] } = {}) => {
return (graph) => env.rdfine().factory.createEntity((graph || env.clownface()).blankNode(), [...mixins, ...additionalMixins], {
initializer: {
...baseInitializer,
...(initializer || {}),
},
});
};
return (first, second, third) => {
if (typeof first === 'object' && 'term' in first) {
return fullFactory(first, second, third);
}
if ((typeof first === 'object' && first.termType === 'NamedNode') || typeof first === 'string') {
return curriedNamedFactory(first, second, third);
}
return curriedBlankFactory(first, second);
};
}