UNPKG

@tpluscode/rdfine

Version:
50 lines (49 loc) 1.64 kB
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; }