Cleaner layout for editor
[tengwarjs.git] / trie-parser.js
1
2 var Parser = require("./parser");
3
4 module.exports = makeParserFromTrie;
5 function makeParserFromTrie(trie, makeProducer, callback, fallback) {
6 var children = {};
7 var characters = Object.keys(trie.children);
8 characters.forEach(function (character) {
9 children[character] = makeParserFromTrie(
10 trie.children[character],
11 makeProducer,
12 callback,
13 fallback
14 );
15 });
16 var producer;
17 if (trie.value) {
18 producer = makeProducer(trie.value);
19 }
20 return characters.reduceRight(function (next, expected) {
21 return function (state) {
22 return function (character) {
23 if (character === expected) {
24 return callback(children[character](state));
25 } else {
26 return next(state)(character);
27 }
28 };
29 };
30 }, function (state) {
31 if (producer) {
32 return callback(producer(state));
33 } else {
34 return fallback(state);
35 }
36 });
37 }
38