@tpluscode/rdfine
Version:
RDF/JS idiomatic, native, effective
50 lines (49 loc) • 1.64 kB
JavaScript
import namespace from '@rdfjs/namespace';
const rdf = namespace('http://www.w3.org/1999/02/22-rdf-syntax-ns#');
function isLast(node) {
return rdf.nil.equals(node.term);
}
export function isList(node) {
const isLastListNode = isLast(node);
const isListNode = node.out([rdf.first, rdf.rest]).values.length === 2;
return isLastListNode || isListNode;
}
export function enumerateList(parent, listNode, fromTerm) {
const items = [];
let current = listNode;
while (!isLast(current)) {
const firstItem = current.out(parent.env.ns.rdf.first).map((first, index) => {
if (index > 0) {
throw new Error('Malformed RDF List with multiple rdf:first objects');
}
return fromTerm.call(parent, first);
});
firstItem.forEach(item => {
if (Array.isArray(item)) {
throw new Error('Malformed RDF List had multiple rdf:first objects');
}
items.push(item);
});
current = current.out(parent.env.ns.rdf.rest).map((quad, index) => {
if (index > 0) {
throw new Error('Malformed RDF List with multiple rdf:rest objects');
}
return quad;
})[0];
}
return items;
}
export function initialize(...items) {
return items.reduceRight((prev, item) => {
if (!prev) {
return {
[rdf.first.value]: item,
[rdf.rest.value]: rdf.nil,
};
}
return {
[rdf.first.value]: item,
[rdf.rest.value]: prev,
};
}, null) || rdf.nil;
}