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