diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..ff45b86
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,15 @@
+; EditorConfig file: https://EditorConfig.org
+; Install the "EditorConfig" plugin into your editor to use
+
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+insert_final_newline = true
+indent_style = space
+indent_size = 2
+trim_trailing_whitespace = true
+
+[*.md]
+indent_size = 4
diff --git a/.eslintignore b/.eslintignore
new file mode 100644
index 0000000..590f666
--- /dev/null
+++ b/.eslintignore
@@ -0,0 +1,4 @@
+dist
+node_modules
+test/js
+docs/index.html
diff --git a/.eslintrc.cjs b/.eslintrc.cjs
new file mode 100644
index 0000000..03eb773
--- /dev/null
+++ b/.eslintrc.cjs
@@ -0,0 +1,80 @@
+'use strict';
+
+module.exports = {
+ extends: [
+ 'ash-nazg/sauron-node-overrides'
+ ],
+ parser: '@babel/eslint-parser',
+ parserOptions: {
+ requireConfigFile: false,
+ ecmaVersion: 2020
+ },
+ env: {
+ es6: true
+ },
+ settings: {
+ polyfills: [
+ 'Math.trunc',
+ 'Number.parseFloat',
+ 'Symbol.iterator'
+ ]
+ },
+ overrides: [{
+ files: '*.cjs',
+ extends: ['ash-nazg/sauron-node-script-overrides'],
+ rules: {
+ // Internal use
+ 'node/shebang': 'off'
+ }
+ }, {
+ files: 'test/index.js',
+ parser: '@babel/eslint-parser',
+ parserOptions: {
+ requireConfigFile: false,
+ ecmaVersion: 2020,
+ sourceType: 'module'
+ },
+ rules: {
+ 'no-shadow': ['error', {allow: ['assert']}],
+ 'node/no-unsupported-features/es-syntax': ['error', {
+ ignores: ['dynamicImport', 'modules']
+ }],
+ 'no-console': 0
+ }
+ }, {
+ files: '*.html',
+ env: {
+ browser: true
+ },
+ globals: {
+ JSONPullParser: true
+ },
+ rules: {
+ 'import/unambiguous': 0
+ }
+ }, {
+ files: ['*.md/*.js'],
+ globals: {
+ json: true,
+ require: true,
+ JSONPullParser: true
+ },
+ rules: {
+ 'import/no-commonjs': 0,
+ 'import/unambiguous': 0,
+ 'no-shadow': ['error', {
+ allow: ['JSONPullParser']
+ }],
+ 'no-unused-vars': ['error', {
+ varsIgnorePattern: 'token|JSONPullParser'
+ }],
+ 'node/no-missing-require': ['error', {
+ allowModules: ['json-pull-parser']
+ }]
+ }
+ }],
+ rules: {
+ 'no-bitwise': 0,
+ 'unicorn/consistent-destructuring': 0
+ }
+};
diff --git a/README.md b/README.md
index d7af98b..a7a81c5 100644
--- a/README.md
+++ b/README.md
@@ -1,18 +1,18 @@
-JSONPullParser
---------------
+# JSONPullParser
-**Introduction**
+## Introduction
-`JSONPullParser` is a dropin replacement for `JSON.parse` and also provides a
-pull based api.
+A dropin replacement for `JSON.parse` and also provides a pull based api.
-**Usage**
+## Usage
-```javascript
-let parser = new JSONPullParser(json);
-let builder = new JSONPullParser.ObjectBuilder();
+```js
+const parser = new JSONPullParser(json);
+const builder = new JSONPullParser.ObjectBuilder();
-for (let token of parser) builder.handle(token);
+for (const token of parser) {
+ builder.handle(token);
+}
```
See live [demo](http://www.susi.se/json-pull-parser/demo.html)!
@@ -26,23 +26,25 @@ If your *JavaScript* engine supports [Symbol.iterator](https://developer.mozilla
then your parser is *iterable*.
```javascript
-let parser = new JSONPullParser(json);
+const parser = new JSONPullParser(json);
-for (let token of parser) {
+for (const token of parser) {
// use token
}
```
-Otherwise you have to get an *iterator* from `parser.tokens()`
+Otherwise you have to get an *iterator* from `parser.tokens()`:
```javascript
-var parser = new JSONPullParser(json);
-var it = parser.tokens();
+const parser = new JSONPullParser(json);
+const it = parser.tokens();
while (true) {
- var step = it.next();
- if (step.done) break;
- var token = step.value;
+ const step = it.next();
+ if (step.done) {
+ break;
+ }
+ const token = step.value;
// use token
}
```
@@ -53,20 +55,20 @@ and `EndArray` at the correct depth.
## Installation
-**Node (CommonJS)**
+### Node (CommonJS)
```sh
$ npm install json-pull-parser
```
-```javascript
-const JSONPullParser = require('json-pull-parser')
+```js
+const JSONPullParser = require('json-pull-parser');
```
-**Browser**
+### Browser
```html
-
+
```
## ObjectBuilder
@@ -77,43 +79,46 @@ const JSONPullParser = require('json-pull-parser')
`JSON.parse` could be implemented by simply feeding all the tokens to
`ObjectBuilder`.
-```javascript
-JSON.parse = function (source)
-{
- let parser = new JSONPullParser(source);
- let builder = new JSONPullParser.ObjectBuilder();
- for (let token of parser) builder.handle(token);
+```js
+JSON.parse = function (source) {
+ const parser = new JSONPullParser(source);
+ const builder = new JSONPullParser.ObjectBuilder();
+ for (const token of parser) {
+ builder.handle(token);
+ }
return builder.value;
-}
+};
```
## Custom handling of events
-```javascript
-let parser = new JSONPullParser(json);
+```js
+const parser = new JSONPullParser(json);
-for (let token of parser) {
+for (const token of parser) {
switch (token.type) {
- case JSONPullParser.StartObject:
- break;
- case JSONPullParser.EndObject:
- break;
- case JSONPullParser.StartArray:
- break;
- case JSONPullParser.EndArray:
- break;
- case JSONPullParser.String:
- break;
- case JSONPullParser.Number:
- break;
- case JSONPullParser.TrueLiteral:
- break;
- case JSONPullParser.FalseLiteral:
- break;
- case JSONPullParser.NullLiteral:
- break;
- case JSONPullParser.Error:
- break;
+ case JSONPullParser.StartObject:
+ break;
+ case JSONPullParser.EndObject:
+ break;
+ case JSONPullParser.StartArray:
+ break;
+ case JSONPullParser.EndArray:
+ break;
+ case JSONPullParser.String:
+ break;
+ case JSONPullParser.Number:
+ break;
+ case JSONPullParser.TrueLiteral:
+ break;
+ case JSONPullParser.FalseLiteral:
+ break;
+ case JSONPullParser.NullLiteral:
+ break;
+ case JSONPullParser.Error:
+ break;
+ default:
+ throw new Error('Should not get here');
}
}
diff --git a/bin/verify b/bin/verify
deleted file mode 100755
index c0fd333..0000000
--- a/bin/verify
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/usr/bin/env node
-
-var JSONPullParser = require('../');
-
-var content = '';
-process.stdin.resume();
-process.stdin.on('data', data => content += data.toString());
-process.stdin.on('end', () => console.log(JSONPullParser.parse(content)));
\ No newline at end of file
diff --git a/bin/verify.cjs b/bin/verify.cjs
new file mode 100755
index 0000000..e5fb135
--- /dev/null
+++ b/bin/verify.cjs
@@ -0,0 +1,13 @@
+#!/usr/bin/env node
+'use strict';
+
+const JSONPullParser = require('../');
+
+let content = '';
+process.stdin.resume();
+process.stdin.on('data', (data) => {
+ content += data.toString();
+});
+
+// eslint-disable-next-line no-console -- CLI
+process.stdin.on('end', () => console.log(JSONPullParser.parse(content)));
diff --git a/dist/json-pull-parser.cjs b/dist/json-pull-parser.cjs
new file mode 100644
index 0000000..ba45e65
--- /dev/null
+++ b/dist/json-pull-parser.cjs
@@ -0,0 +1,2 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).JSONPullParser=t()}(this,(function(){"use strict";class e{constructor(){this.handler={ref:this,add(e){return this.ref.value=e,e}}}startObject(){this.handler={old:this.handler,key:null,ref:this.handler.add({}),add(e){return null===this.key?this.key=e:(this.ref[this.key]=e,this.key=null),e}}}endObject(){this.handler=this.handler.old}startArray(){this.handler={old:this.handler,ref:this.handler.add([]),add(e){return this.ref.push(e),e}}}add(e){this.handler.add(e)}handle(e){switch(e.type){case"{":this.startObject();break;case"}":this.endObject();break;case"[":this.startArray();break;case"]":this.endArray();break;case"string":case"number":case"true":case"false":case"null":this.add(e.value);break;case"error":throw new SyntaxError(e.value.message)}}}e.prototype.endArray=e.prototype.endObject;const t=16;class r{constructor(e){this.text=e}[Symbol.iterator](){return n(this.text)}tokens(){return n(this.text)}}function*n(e){const t={s:e,d:!1,f:0,l:e.length,e:1,c:0,r:1,x:[]};for(;;){if(t.f===t.l){if(!t.e&&!t.x.length)return;yield a(t.s,t.l,t.l,"Unexpected end of JSON input")}const e=u(t);t.f=e.last,yield e}}function a(e,t,n,a,s=1){let i=t,o=e.charCodeAt(i);for(;10!==o&&i>0;)o=e.charCodeAt(--i);10===o&&++i;const c="undefined:"+s,u=e.slice(i,t+1);let l="";for(let e=i;e0?20:0,i(0,f)):a(n,f,u,"Unexpected token } in JSON at position "+f,e.r);case 91:return 1&e.e?(e.e=17,e.x.push(64),o(0,f)):a(n,f,u,"Unexpected token [ in JSON at position "+f,e.r);case 93:return e.e&t&&64===e.x.pop()?(e.e=e.x.length>0?20:0,c(0,f)):a(n,f,u,"Unexpected token ] in JSON at position "+f,e.r);case 58:if(!(8&e.e))return a(n,f,u,"Unexpected token : in JSON at position "+f,e.r);e.e=1,++f;continue;case 44:if(!(4&e.e))return a(n,f,u,"Unexpected token , in JSON at position "+f,e.r);e.x.length>0&&32===e.x[e.x.length-1]?e.e=2:e.e=1,++f;continue;case 45:case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:return 1&e.e?(e.e=e.x.length>0?20:0,l(n,f,u)):a(n,f,u,"Unexpected number in JSON at position "+f,e.r);case 34:return 2&e.e?(e.e=8,d(n,f,u)):1&e.e?(e.e=e.x.length>0?20:0,d(n,f,u)):a(n,f,u,"Unexpected string in JSON at position "+f,e.r);case 116:return 1&e.e?(e.e=e.x.length>0?20:0,h(n,f,u)):a(n,f,u,"Unexpected token t in JSON at position "+f,e.r);case 102:return 1&e.e?(e.e=e.x.length>0?20:0,p(n,f,u)):a(n,f,u,"Unexpected token f in JSON at position "+f,e.r);case 110:return 1&e.e?(e.e=e.x.length>0?20:0,x(n,f,u)):a(n,f,u,"Unexpected token n in JSON at position "+f,e.r);default:return a(n,f,u,"Unexpected token "+n[f]+" in JSON at position "+f,e.r)}return{type:r.EndDocument,first:u,last:u}}function l(e,t,n){let s=t,i=e.charCodeAt(s++);if(45===i&&(i=e.charCodeAt(s++)),48!==i)for(;i>=48&&i<=57;)i=e.charCodeAt(s++);else i=e.charCodeAt(s++);if(46===i)for(i=e.charCodeAt(s++);i>=48&&i<=57;)i=e.charCodeAt(s++);if(101===i||69===i){if(i=e.charCodeAt(s++),43!==i&&45!==i||(i=e.charCodeAt(s++)),i<48||i>57)return a(e,s-1,n,"Unexpected token "+e[s-1]+" in JSON at position "+(s-1));if(s>=n)return a(e,t,n,"Unexpected end of JSON input");for(;i>=48&&i<=57;)i=e.charCodeAt(s++)}return{type:r.Number,value:Number.parseFloat(e.slice(t,s-1)),first:t,last:s-1}}function d(e,t,n){let s=t+1;for(;sn)))return a(e,n,n,"Unexpected end of JSON input")}return{type:r.String,value:JSON.parse(e.slice(t,s)),source:e,first:t,last:s}}function f(e,t,r,n,s){if(t+n.length>r)return a(e,r,r,"Unexpected end of JSON input");for(const s of n){if(e.charCodeAt(t++)!==s)return a(e,t,r,"Unexpected token "+e[t-1]+" in JSON at position "+(t-1))}return s}function h(e,t,n){return f(e,t,n,[116,114,117,101],{type:r.TrueLiteral,value:!0,source:e,first:t,last:t+4})}function p(e,t,n){return f(e,t,n,[102,97,108,115,101],{type:r.FalseLiteral,value:!1,source:e,first:t,last:t+5})}function x(e,t,n){return f(e,t,n,[110,117,108,108],{type:r.NullLiteral,value:null,source:e,first:t,last:t+4})}return r.StartDocument="<",r.EndDocument=">",r.StartObject="{",r.EndObject="}",r.StartArray="[",r.EndArray="]",r.String="string",r.Number="number",r.TrueLiteral="true",r.FalseLiteral="false",r.NullLiteral="null",r.Whitespace="ws",r.Error="error",r.ObjectBuilder=e,r.parse=function(t,r){"string"!=typeof t&&(t=String(t));const a=new e;for(const e of n(t))a.handle(e);if(void 0===a.value)throw new SyntaxError("Unexpected end of JSON input");return a.value},r}));
+//# sourceMappingURL=json-pull-parser.cjs.map
diff --git a/dist/json-pull-parser.cjs.map b/dist/json-pull-parser.cjs.map
new file mode 100644
index 0000000..5ca7719
--- /dev/null
+++ b/dist/json-pull-parser.cjs.map
@@ -0,0 +1 @@
+{"version":3,"file":"json-pull-parser.cjs","sources":["../src/builder.js","../src/parser.js"],"sourcesContent":["/**\n *\n */\nclass ObjectBuilder {\n /**\n *\n */\n constructor () {\n this.handler = {\n ref: this,\n add (value) { this.ref.value = value; return value; }\n };\n }\n\n /**\n * @returns {void}\n */\n startObject () {\n this.handler = {\n old: this.handler,\n key: null,\n ref: this.handler.add({}),\n add (value) {\n if (this.key === null) this.key = value;\n else { this.ref[this.key] = value; this.key = null; }\n return value;\n }\n };\n }\n\n /**\n * @returns {void}\n */\n endObject () {\n this.handler = this.handler.old;\n }\n\n /**\n * @returns {void}\n */\n startArray () {\n this.handler = {\n old: this.handler,\n ref: this.handler.add([]),\n add (value) {\n this.ref.push(value);\n return value;\n }\n };\n }\n\n /**\n * @param {JSONValueOrError} value\n * @returns {void}\n */\n add (value) {\n this.handler.add(value);\n }\n\n /**\n * @param {Token|TokenEnd} token\n * @returns {void}\n */\n handle (token) {\n switch (token.type) {\n case '{':\n this.startObject();\n break;\n case '}':\n this.endObject();\n break;\n case '[':\n this.startArray();\n break;\n case ']':\n this.endArray();\n break;\n case 'string':\n case 'number':\n case 'true':\n case 'false':\n case 'null':\n this.add(token.value);\n break;\n case 'error':\n throw new SyntaxError(token.value.message);\n default:\n break;\n }\n }\n}\n\nObjectBuilder.prototype.endArray = ObjectBuilder.prototype.endObject;\n\nexport default ObjectBuilder;\n","import ObjectBuilder from './builder.js';\n\n/**\n * @typedef {PlainObject} State\n * @property {string} s Text\n * @property {boolean} [d=false] Done\n * @property {Integer} [f=0] Position\n * @property {Integer} [l] Defaults to text length\n * @property {Integer} [e=VALUE] Expect\n * @property {Integer} [c=0] Column\n * @property {Integer} [r=1] Row\n * @property {Integer[]} [x=[]]\n*/\n\n/**\n* @typedef {string} Type\n*/\n\n/**\n * @typedef {PlainObject} TokenPlain\n * @property {Type} type\n * @property {Integer} first\n * @property {Integer} last\n*/\n\n/**\n * @typedef {TokenPlain} TokenEnd\n */\n\n/**\n * @typedef {SyntaxError|string|Float|boolean|null} JSONValueOrError\n */\n\n/**\n * @typedef {TokenPlain} Token\n * @property {JSONValueOrError} value\n */\n\n/**\n * @typedef {Token} TokenWithSource\n * @property {string} source\n */\n\nconst VALUE = 1;\nconst KEY = 2;\nconst COMMA = 4;\nconst COLON = 8;\nconst CLOSE = 16;\nconst OBJECT = 32;\nconst ARRAY = 64;\n\n/**\n *\n */\nclass JSONPullParser {\n /**\n * @param {string} text\n * @returns {void}\n */\n constructor (text) {\n this.text = text;\n }\n\n /**\n * @returns {Iterator}\n */\n [Symbol.iterator] () {\n return tokenIterator(this.text);\n }\n\n /**\n * @returns {Iterator}\n */\n tokens () {\n return tokenIterator(this.text);\n }\n}\n\n/*\nif (typeof Symbol === 'object' && Symbol.iterator) {\n JSONPullParser.prototype[Symbol.iterator] = JSONPullParser.prototype.tokens;\n}\n*/\n\nJSONPullParser.StartDocument = '<';\nJSONPullParser.EndDocument = '>';\nJSONPullParser.StartObject = '{';\nJSONPullParser.EndObject = '}';\nJSONPullParser.StartArray = '[';\nJSONPullParser.EndArray = ']';\nJSONPullParser.String = 'string';\nJSONPullParser.Number = 'number';\nJSONPullParser.TrueLiteral = 'true';\nJSONPullParser.FalseLiteral = 'false';\nJSONPullParser.NullLiteral = 'null';\nJSONPullParser.Whitespace = 'ws';\nJSONPullParser.Error = 'error';\n\nJSONPullParser.ObjectBuilder = ObjectBuilder;\n\n/**\n* @callback ReviverFunction\n* @returns {JSON}\n*/\n\n/**\n* @param {string} text\n* @param {ReviverFunction} reviver\n*/\nJSONPullParser.parse = function (text, reviver) {\n if (typeof text !== 'string') text = String(text);\n const builder = new ObjectBuilder();\n for (const token of tokenIterator(text)) {\n // console.log(\"token: \" + token.type);\n builder.handle(token);\n }\n if (typeof builder.value === 'undefined') {\n throw new SyntaxError('Unexpected end of JSON input');\n }\n return builder.value;\n};\n\n/**\n * @param {string} text\n * @yields {Token|TokenEnd}\n * @returns {void}\n */\nfunction * tokenIterator (text) {\n const state = {\n s: text,\n d: false, // done\n f: 0, // position\n l: text.length, // length\n e: VALUE, // expect\n c: 0, // column\n r: 1, // row\n x: []\n };\n\n while (true) {\n // console.log(\n // `next: ${state.f}, ${state.l}, ` +\n // `${text.charCodeAt(state.f).toString(16)}`\n // );\n if (state.f === state.l) {\n if (!state.e && !state.x.length) {\n return;\n }\n yield parserError(\n state.s, state.l, state.l, 'Unexpected end of JSON input'\n );\n }\n const token = parseValue(state);\n state.f = token.last;\n\n yield token;\n }\n}\n\n/**\n * @param {string} s\n * @param {Integer} f\n * @param {Integer} l\n * @param {string} m Message\n * @param {Integer} r\n * @returns {Token}\n */\nfunction parserError (s, f, l, m, r = 1) {\n let c = f;\n let cc = s.charCodeAt(c);\n while (cc !== 0x0A && c > 0) {\n cc = s.charCodeAt(--c);\n }\n if (cc === 0x0A) ++c;\n const str0 = 'undefined:' + r;\n const str1 = s.slice(c, f + 1);\n let str2 = '';\n for (let i = c; i < f; ++i) str2 += ' ';\n str2 += '^';\n\n const err = new SyntaxError(str0 + '\\n' + str1 + '\\n' + str2 + '\\n\\n' + m);\n return {\n type: JSONPullParser.Error,\n value: err,\n first: f,\n last: l\n };\n}\n\n/**\n * @param {string} s\n * @param {Integer} f\n * @param {Integer} l\n * @returns {Token}\n */\nfunction parseObjectStart (s, f, l) {\n return {\n type: JSONPullParser.StartObject,\n value: '{',\n first: f,\n last: f + 1\n };\n}\n\n/**\n * @param {string} s\n * @param {Integer} f\n * @param {Integer} l\n * @returns {Token}\n */\nfunction parseObjectEnd (s, f, l) {\n return {\n type: JSONPullParser.EndObject,\n value: '}',\n first: f,\n last: f + 1\n };\n}\n/**\n * @param {string} s\n * @param {Integer} f\n * @param {Integer} l\n * @returns {Token}\n */\nfunction parseArrayStart (s, f, l) {\n return {\n type: JSONPullParser.StartArray,\n value: '[',\n first: f,\n last: f + 1\n };\n}\n\n/**\n * @param {string} s\n * @param {Integer} f\n * @param {Integer} l\n * @returns {Token}\n */\nfunction parseArrayEnd (s, f, l) {\n return {\n type: JSONPullParser.EndArray,\n value: ']',\n first: f,\n last: f + 1\n };\n}\n\n/**\n * @param {State} state\n * @returns {Token|TokenEnd}\n */\nfunction parseValue (state) {\n const {s, l} = state;\n let {f} = state;\n while (f < l) {\n state.c++;\n switch (s.charCodeAt(f)) {\n case 0x0A: // LF\n state.c = 0;\n state.r++;\n // Fallthrough\n case 0x09: // TAB\n case 0x0D: // CR\n case 0x20: // WS\n ++f; continue;\n case 0x7B: // {\n if (!(state.e & VALUE)) {\n return parserError(\n s, f, l, 'Unexpected token { in JSON at position ' + f, state.r\n );\n }\n state.e = KEY | CLOSE;\n state.x.push(OBJECT);\n return parseObjectStart(s, f, l);\n case 0x7D: // }\n if (!(state.e & CLOSE) || state.x.pop() !== OBJECT) {\n return parserError(\n s, f, l, 'Unexpected token } in JSON at position ' + f, state.r\n );\n }\n state.e = state.x.length > 0 ? COMMA | CLOSE : 0;\n return parseObjectEnd(s, f, l);\n case 0x5B: // [\n if (!(state.e & VALUE)) {\n return parserError(\n s, f, l, 'Unexpected token [ in JSON at position ' + f, state.r\n );\n }\n state.e = VALUE | CLOSE;\n state.x.push(ARRAY);\n return parseArrayStart(s, f, l);\n case 0x5D: // ]\n if (!(state.e & CLOSE) || state.x.pop() !== ARRAY) {\n return parserError(\n s, f, l, 'Unexpected token ] in JSON at position ' + f, state.r\n );\n }\n state.e = state.x.length > 0 ? COMMA | CLOSE : 0;\n return parseArrayEnd(s, f, l);\n case 0x3A: // :\n if (!(state.e & COLON)) {\n return parserError(\n s, f, l, 'Unexpected token : in JSON at position ' + f, state.r\n );\n }\n state.e = VALUE;\n ++f; continue;\n case 0x2C: // ,\n if (!(state.e & COMMA)) {\n return parserError(\n s, f, l, 'Unexpected token , in JSON at position ' + f, state.r\n );\n }\n if (state.x.length > 0 && state.x[state.x.length - 1] === OBJECT) {\n state.e = KEY;\n } else {\n state.e = VALUE;\n }\n ++f; continue;\n case 0x2D: // -\n case 0x30: // 0\n case 0x31: // 1\n case 0x32: // 2\n case 0x33: // 3\n case 0x34: // 4\n case 0x35: // 5\n case 0x36: // 6\n case 0x37: // 7\n case 0x38: // 8\n case 0x39: // 9\n if (!(state.e & VALUE)) {\n return parserError(\n s, f, l, 'Unexpected number in JSON at position ' + f, state.r\n );\n }\n state.e = state.x.length > 0 ? COMMA | CLOSE : 0;\n return parseNumber(s, f, l);\n case 0x22:\n if (state.e & KEY) {\n state.e = COLON;\n return parseString(s, f, l);\n }\n if (!(state.e & VALUE)) {\n return parserError(\n s, f, l, 'Unexpected string in JSON at position ' + f, state.r\n );\n }\n state.e = state.x.length > 0 ? COMMA | CLOSE : 0;\n return parseString(s, f, l);\n case 0x74: // t\n if (!(state.e & VALUE)) {\n return parserError(\n s, f, l, 'Unexpected token t in JSON at position ' + f, state.r\n );\n }\n state.e = state.x.length > 0 ? COMMA | CLOSE : 0;\n return parseTrue(s, f, l);\n case 0x66: // f\n if (!(state.e & VALUE)) {\n return parserError(\n s, f, l, 'Unexpected token f in JSON at position ' + f, state.r\n );\n }\n state.e = state.x.length > 0 ? COMMA | CLOSE : 0;\n return parseFalse(s, f, l);\n case 0x6E: // n\n if (!(state.e & VALUE)) {\n return parserError(\n s, f, l, 'Unexpected token n in JSON at position ' + f, state.r\n );\n }\n state.e = state.x.length > 0 ? COMMA | CLOSE : 0;\n return parseNull(s, f, l);\n default: return parserError(\n s, f, l, 'Unexpected token ' + s[f] + ' in JSON at position ' + f, state.r\n );\n }\n }\n return {\n type: JSONPullParser.EndDocument,\n first: l,\n last: l\n };\n}\n\n/**\n * @param {string} s\n * @param {Integer} f\n * @param {Integer} l\n * @returns {Token}\n */\nfunction parseNumber (s, f, l) {\n let c = f;\n\n let cc = s.charCodeAt(c++);\n\n if (cc === 0x2D /* - */) cc = s.charCodeAt(c++);\n\n if (cc !== 0x30 /* 0 */) {\n while (cc >= 0x30 /* 0 */ && cc <= 0x39 /* 9 */) {\n cc = s.charCodeAt(c++);\n }\n } else {\n cc = s.charCodeAt(c++);\n }\n\n if (cc === 0x2E /* . */) {\n cc = s.charCodeAt(c++);\n while (cc >= 0x30 && cc <= 0x39) cc = s.charCodeAt(c++);\n }\n\n if (cc === 0x65 /* e */|| cc === 0x45 /* E */) {\n cc = s.charCodeAt(c++);\n if (cc === 0x2B /* + */|| cc === 0x2D /* - */) cc = s.charCodeAt(c++);\n if (cc < 0x30 || cc > 0x39) {\n return parserError(\n s, c - 1, l,\n 'Unexpected token ' + s[c - 1] + ' in JSON at position ' + (c - 1)\n );\n }\n if (c >= l) return parserError(s, f, l, 'Unexpected end of JSON input');\n while (cc >= 0x30 /* 0 */ && cc <= 0x39 /* 9 */) cc = s.charCodeAt(c++);\n }\n\n return {\n type: JSONPullParser.Number,\n value: Number.parseFloat(\n s.slice(f, c - 1)\n ), // parseFloat seems to be faster than JSON.parse\n first: f,\n last: c - 1\n };\n}\n\n// ECMA-404 section 9\n/**\n * @param {string} s\n * @param {Integer} f\n * @param {Integer} l\n * @returns {TokenWithSource}\n */\nfunction parseString (s, f, l) {\n let c = f + 1;\n while (c < l) {\n let cc = s.charCodeAt(c++);\n if (cc === 0x22 /* \" */) break;\n else if (cc === 0x5C /* \\ */) {\n cc = s.charCodeAt(c++);\n if (cc === 0x75 /* u */) {\n c += 4;\n if (c > l) return parserError(s, l, l, 'Unexpected end of JSON input');\n }\n }\n }\n // console.log(`string: ${c}, ${f}, ${s.substring(f, c)}`);\n return {\n type: JSONPullParser.String,\n value: JSON.parse(s.slice(f, c)),\n source: s,\n first: f,\n last: c\n };\n}\n\n/**\n * @param {string} s\n * @param {Integer} f\n * @param {Integer} l\n * @param {Integer[]} ccs\n * @param {TokenWithSource} success\n * @returns {token}\n */\nfunction match (s, f, l, ccs, success) {\n if (f + ccs.length > l) {\n return parserError(s, l, l, 'Unexpected end of JSON input');\n }\n for (const cc_ of ccs) {\n const cc = s.charCodeAt(f++);\n if (cc !== cc_) {\n return parserError(\n s, f, l,\n 'Unexpected token ' + s[f - 1] + ' in JSON at position ' + (f - 1)\n );\n }\n }\n return success;\n}\n\n/**\n * @param {string} s\n * @param {Integer} f\n * @param {Integer} l\n * @returns {TokenWithSource}\n */\nfunction parseTrue (s, f, l) {\n return match(s, f, l, [0x74, 0x72, 0x75, 0x65], {\n type: JSONPullParser.TrueLiteral,\n value: true,\n source: s,\n first: f,\n last: f + 4\n });\n}\n\n/**\n * @param {string} s\n * @param {Integer} f\n * @param {Integer} l\n * @returns {TokenWithSource}\n */\nfunction parseFalse (s, f, l) {\n return match(s, f, l, [0x66, 0x61, 0x6C, 0x73, 0x65], {\n type: JSONPullParser.FalseLiteral,\n value: false,\n source: s,\n first: f,\n last: f + 5\n });\n}\n\n/**\n * @param {string} s\n * @param {Integer} f\n * @param {Integer} l\n * @returns {TokenWithSource}\n */\nfunction parseNull (s, f, l) {\n return match(s, f, l, [0x6E, 0x75, 0x6C, 0x6C], {\n type: JSONPullParser.NullLiteral,\n value: null,\n source: s,\n first: f,\n last: f + 4\n });\n}\n\nexport default JSONPullParser;\n"],"names":["ObjectBuilder","[object Object]","this","handler","ref","value","old","key","add","push","token","type","startObject","endObject","startArray","endArray","SyntaxError","message","prototype","CLOSE","JSONPullParser","text","Symbol","iterator","tokenIterator","state","s","d","f","l","length","e","c","r","x","parserError","parseValue","last","m","cc","charCodeAt","str0","str1","slice","str2","i","err","Error","first","parseObjectStart","StartObject","parseObjectEnd","EndObject","parseArrayStart","StartArray","parseArrayEnd","EndArray","KEY","pop","COMMA","VALUE","parseNumber","parseString","parseTrue","parseFalse","parseNull","EndDocument","Number","parseFloat","String","JSON","parse","source","match","ccs","success","cc_","TrueLiteral","FalseLiteral","NullLiteral","StartDocument","Whitespace","reviver","builder","handle"],"mappings":"+OAGA,MAAMA,EAIJC,cACEC,KAAKC,QAAU,CACbC,IAAKF,KACLD,IAAKI,GAAiC,OAAxBH,KAAKE,IAAIC,MAAQA,EAAcA,IAOjDJ,cACEC,KAAKC,QAAU,CACbG,IAAKJ,KAAKC,QACVI,IAAK,KACLH,IAAKF,KAAKC,QAAQK,IAAI,IACtBP,IAAKI,GAGH,OAFiB,OAAbH,KAAKK,IAAcL,KAAKK,IAAMF,GAC3BH,KAAKE,IAAIF,KAAKK,KAAOF,EAAOH,KAAKK,IAAM,MACvCF,IAQbJ,YACEC,KAAKC,QAAUD,KAAKC,QAAQG,IAM9BL,aACEC,KAAKC,QAAU,CACbG,IAAKJ,KAAKC,QACVC,IAAKF,KAAKC,QAAQK,IAAI,IACtBP,IAAKI,GAEH,OADAH,KAAKE,IAAIK,KAAKJ,GACPA,IASbJ,IAAKI,GACHH,KAAKC,QAAQK,IAAIH,GAOnBJ,OAAQS,GACN,OAAQA,EAAMC,MACd,IAAK,IACHT,KAAKU,cACL,MACF,IAAK,IACHV,KAAKW,YACL,MACF,IAAK,IACHX,KAAKY,aACL,MACF,IAAK,IACHZ,KAAKa,WACL,MACF,IAAK,SACL,IAAK,SACL,IAAK,OACL,IAAK,QACL,IAAK,OACHb,KAAKM,IAAIE,EAAML,OACf,MACF,IAAK,QACH,MAAM,IAAIW,YAAYN,EAAML,MAAMY,WAOxCjB,EAAckB,UAAUH,SAAWf,EAAckB,UAAUL,UCjD3D,MAIMM,EAAQ,GAOd,MAAMC,EAKJnB,YAAaoB,GACXnB,KAAKmB,KAAOA,EAMdpB,CAACqB,OAAOC,YACN,OAAOC,EAActB,KAAKmB,MAM5BpB,SACE,OAAOuB,EAActB,KAAKmB,OAqD9B,SAAWG,EAAeH,GACxB,MAAMI,EAAQ,CACZC,EAAGL,EACHM,GAAG,EACHC,EAAG,EACHC,EAAGR,EAAKS,OACRC,EA1FU,EA2FVC,EAAG,EACHC,EAAG,EACHC,EAAG,IAGL,OAAa,CAKX,GAAIT,EAAMG,IAAMH,EAAMI,EAAG,CACvB,IAAKJ,EAAMM,IAAMN,EAAMS,EAAEJ,OACvB,aAEIK,EACJV,EAAMC,EAAGD,EAAMI,EAAGJ,EAAMI,EAAG,gCAG/B,MAAMnB,EAAQ0B,EAAWX,GACzBA,EAAMG,EAAIlB,EAAM2B,WAEV3B,GAYV,SAASyB,EAAaT,EAAGE,EAAGC,EAAGS,EAAGL,EAAI,GACpC,IAAID,EAAIJ,EACJW,EAAKb,EAAEc,WAAWR,GACtB,KAAc,KAAPO,GAAeP,EAAI,GACxBO,EAAKb,EAAEc,aAAaR,GAEX,KAAPO,KAAeP,EACnB,MAAMS,EAAO,aAAeR,EACtBS,EAAOhB,EAAEiB,MAAMX,EAAGJ,EAAI,GAC5B,IAAIgB,EAAO,GACX,IAAK,IAAIC,EAAIb,EAAGa,EAAIjB,IAAKiB,EAAGD,GAAQ,IACpCA,GAAQ,IAER,MAAME,EAAM,IAAI9B,YAAYyB,EAAO,KAAOC,EAAO,KAAOE,EAAO,OAASN,GACxE,MAAO,CACL3B,KAAMS,EAAe2B,MACrB1C,MAAOyC,EACPE,MAAOpB,EACPS,KAAMR,GAUV,SAASoB,EAAkBvB,EAAGE,EAAGC,GAC/B,MAAO,CACLlB,KAAMS,EAAe8B,YACrB7C,MAAO,IACP2C,MAAOpB,EACPS,KAAMT,EAAI,GAUd,SAASuB,EAAgBzB,EAAGE,EAAGC,GAC7B,MAAO,CACLlB,KAAMS,EAAegC,UACrB/C,MAAO,IACP2C,MAAOpB,EACPS,KAAMT,EAAI,GASd,SAASyB,EAAiB3B,EAAGE,EAAGC,GAC9B,MAAO,CACLlB,KAAMS,EAAekC,WACrBjD,MAAO,IACP2C,MAAOpB,EACPS,KAAMT,EAAI,GAUd,SAAS2B,EAAe7B,EAAGE,EAAGC,GAC5B,MAAO,CACLlB,KAAMS,EAAeoC,SACrBnD,MAAO,IACP2C,MAAOpB,EACPS,KAAMT,EAAI,GAQd,SAASQ,EAAYX,GACnB,MAAMC,EAACA,EAACG,EAAEA,GAAKJ,EACf,IAAIG,EAACA,GAAKH,EACV,KAAOG,EAAIC,GAET,OADAJ,EAAMO,IACEN,EAAEc,WAAWZ,IACrB,KAAK,GACHH,EAAMO,EAAI,EACVP,EAAMQ,IAER,KAAK,EACL,KAAK,GACL,KAAK,KACDL,EAAG,SACP,KAAK,IACH,OAhOQ,EAgOFH,EAAMM,GAKZN,EAAMM,EAAI0B,GACVhC,EAAMS,EAAEzB,KAjOC,IAkOFwC,EAAiBvB,EAAGE,IANlBO,EACLT,EAAGE,EAAGC,EAAG,0CAA4CD,EAAGH,EAAMQ,GAMpE,KAAK,IACH,OAAMR,EAAMM,EAAIZ,GApOP,KAoOiBM,EAAMS,EAAEwB,OAKlCjC,EAAMM,EAAIN,EAAMS,EAAEJ,OAAS,EAAI6B,GAAgB,EACxCR,EAAezB,EAAGE,IALhBO,EACLT,EAAGE,EAAGC,EAAG,0CAA4CD,EAAGH,EAAMQ,GAKpE,KAAK,GACH,OAjPQ,EAiPFR,EAAMM,GAKZN,EAAMM,EAAI6B,GACVnC,EAAMS,EAAEzB,KAjPA,IAkPD4C,EAAgB3B,EAAGE,IANjBO,EACLT,EAAGE,EAAGC,EAAG,0CAA4CD,EAAGH,EAAMQ,GAMpE,KAAK,GACH,OAAMR,EAAMM,EAAIZ,GApPR,KAoPkBM,EAAMS,EAAEwB,OAKlCjC,EAAMM,EAAIN,EAAMS,EAAEJ,OAAS,EAAI6B,GAAgB,EACxCJ,EAAc7B,EAAGE,IALfO,EACLT,EAAGE,EAAGC,EAAG,0CAA4CD,EAAGH,EAAMQ,GAKpE,KAAK,GACH,KA/PQ,EA+PFR,EAAMM,GACV,OAAOI,EACLT,EAAGE,EAAGC,EAAG,0CAA4CD,EAAGH,EAAMQ,GAGlER,EAAMM,EAvQE,IAwQNH,EAAG,SACP,KAAK,GACH,KAxQQ,EAwQFH,EAAMM,GACV,OAAOI,EACLT,EAAGE,EAAGC,EAAG,0CAA4CD,EAAGH,EAAMQ,GAG9DR,EAAMS,EAAEJ,OAAS,GA1QZ,KA0QiBL,EAAMS,EAAET,EAAMS,EAAEJ,OAAS,GACjDL,EAAMM,EA/QF,EAiRJN,EAAMM,EAlRA,IAoRNH,EAAG,SACP,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACH,OAhSQ,EAgSFH,EAAMM,GAKZN,EAAMM,EAAIN,EAAMS,EAAEJ,OAAS,EAAI6B,GAAgB,EACxCE,EAAYnC,EAAGE,EAAGC,IALhBM,EACLT,EAAGE,EAAGC,EAAG,yCAA2CD,EAAGH,EAAMQ,GAKnE,KAAK,GACH,OAvSM,EAuSFR,EAAMM,GACRN,EAAMM,EAtSA,EAuSC+B,EAAYpC,EAAGE,EAAGC,IA1SnB,EA4SFJ,EAAMM,GAKZN,EAAMM,EAAIN,EAAMS,EAAEJ,OAAS,EAAI6B,GAAgB,EACxCG,EAAYpC,EAAGE,EAAGC,IALhBM,EACLT,EAAGE,EAAGC,EAAG,yCAA2CD,EAAGH,EAAMQ,GAKnE,KAAK,IACH,OApTQ,EAoTFR,EAAMM,GAKZN,EAAMM,EAAIN,EAAMS,EAAEJ,OAAS,EAAI6B,GAAgB,EACxCI,EAAUrC,EAAGE,EAAGC,IALdM,EACLT,EAAGE,EAAGC,EAAG,0CAA4CD,EAAGH,EAAMQ,GAKpE,KAAK,IACH,OA5TQ,EA4TFR,EAAMM,GAKZN,EAAMM,EAAIN,EAAMS,EAAEJ,OAAS,EAAI6B,GAAgB,EACxCK,EAAWtC,EAAGE,EAAGC,IALfM,EACLT,EAAGE,EAAGC,EAAG,0CAA4CD,EAAGH,EAAMQ,GAKpE,KAAK,IACH,OApUQ,EAoUFR,EAAMM,GAKZN,EAAMM,EAAIN,EAAMS,EAAEJ,OAAS,EAAI6B,GAAgB,EACxCM,EAAUvC,EAAGE,EAAGC,IALdM,EACLT,EAAGE,EAAGC,EAAG,0CAA4CD,EAAGH,EAAMQ,GAKpE,QAAS,OAAOE,EACdT,EAAGE,EAAGC,EAAG,oBAAsBH,EAAEE,GAAK,wBAA0BA,EAAGH,EAAMQ,GAI7E,MAAO,CACLtB,KAAMS,EAAe8C,YACrBlB,MAAOnB,EACPQ,KAAMR,GAUV,SAASgC,EAAanC,EAAGE,EAAGC,GAC1B,IAAIG,EAAIJ,EAEJW,EAAKb,EAAEc,WAAWR,KAItB,GAFW,KAAPO,IAAqBA,EAAKb,EAAEc,WAAWR,MAEhC,KAAPO,EACF,KAAOA,GAAM,IAAgBA,GAAM,IACjCA,EAAKb,EAAEc,WAAWR,UAGpBO,EAAKb,EAAEc,WAAWR,KAGpB,GAAW,KAAPO,EAEF,IADAA,EAAKb,EAAEc,WAAWR,KACXO,GAAM,IAAQA,GAAM,IAAMA,EAAKb,EAAEc,WAAWR,KAGrD,GAAW,MAAPO,GAA6B,KAAPA,EAAqB,CAG7C,GAFAA,EAAKb,EAAEc,WAAWR,KACP,KAAPO,GAA6B,KAAPA,IAAqBA,EAAKb,EAAEc,WAAWR,MAC7DO,EAAK,IAAQA,EAAK,GACpB,OAAOJ,EACLT,EAAGM,EAAI,EAAGH,EACV,oBAAsBH,EAAEM,EAAI,GAAK,yBAA2BA,EAAI,IAGpE,GAAIA,GAAKH,EAAG,OAAOM,EAAYT,EAAGE,EAAGC,EAAG,gCACxC,KAAOU,GAAM,IAAgBA,GAAM,IAAcA,EAAKb,EAAEc,WAAWR,KAGrE,MAAO,CACLrB,KAAMS,EAAe+C,OACrB9D,MAAO8D,OAAOC,WACZ1C,EAAEiB,MAAMf,EAAGI,EAAI,IAEjBgB,MAAOpB,EACPS,KAAML,EAAI,GAWd,SAAS8B,EAAapC,EAAGE,EAAGC,GAC1B,IAAIG,EAAIJ,EAAI,EACZ,KAAOI,EAAIH,GAAG,CACZ,IAAIU,EAAKb,EAAEc,WAAWR,KACtB,GAAW,KAAPO,EAAqB,MACpB,GAAW,KAAPA,IACPA,EAAKb,EAAEc,WAAWR,KACP,MAAPO,IACFP,GAAK,EACDA,EAAIH,IAAG,OAAOM,EAAYT,EAAGG,EAAGA,EAAG,gCAK7C,MAAO,CACLlB,KAAMS,EAAeiD,OACrBhE,MAAOiE,KAAKC,MAAM7C,EAAEiB,MAAMf,EAAGI,IAC7BwC,OAAQ9C,EACRsB,MAAOpB,EACPS,KAAML,GAYV,SAASyC,EAAO/C,EAAGE,EAAGC,EAAG6C,EAAKC,GAC5B,GAAI/C,EAAI8C,EAAI5C,OAASD,EACnB,OAAOM,EAAYT,EAAGG,EAAGA,EAAG,gCAE9B,IAAK,MAAM+C,KAAOF,EAAK,CAErB,GADWhD,EAAEc,WAAWZ,OACbgD,EACT,OAAOzC,EACLT,EAAGE,EAAGC,EACN,oBAAsBH,EAAEE,EAAI,GAAK,yBAA2BA,EAAI,IAItE,OAAO+C,EAST,SAASZ,EAAWrC,EAAGE,EAAGC,GACxB,OAAO4C,EAAM/C,EAAGE,EAAGC,EAAG,CAAC,IAAM,IAAM,IAAM,KAAO,CAC9ClB,KAAMS,EAAeyD,YACrBxE,OAAO,EACPmE,OAAQ9C,EACRsB,MAAOpB,EACPS,KAAMT,EAAI,IAUd,SAASoC,EAAYtC,EAAGE,EAAGC,GACzB,OAAO4C,EAAM/C,EAAGE,EAAGC,EAAG,CAAC,IAAM,GAAM,IAAM,IAAM,KAAO,CACpDlB,KAAMS,EAAe0D,aACrBzE,OAAO,EACPmE,OAAQ9C,EACRsB,MAAOpB,EACPS,KAAMT,EAAI,IAUd,SAASqC,EAAWvC,EAAGE,EAAGC,GACxB,OAAO4C,EAAM/C,EAAGE,EAAGC,EAAG,CAAC,IAAM,IAAM,IAAM,KAAO,CAC9ClB,KAAMS,EAAe2D,YACrB1E,MAAO,KACPmE,OAAQ9C,EACRsB,MAAOpB,EACPS,KAAMT,EAAI,WAjcdR,EAAe4D,cAAgB,IAC/B5D,EAAe8C,YAAc,IAC7B9C,EAAe8B,YAAc,IAC7B9B,EAAegC,UAAY,IAC3BhC,EAAekC,WAAa,IAC5BlC,EAAeoC,SAAW,IAC1BpC,EAAeiD,OAAS,SACxBjD,EAAe+C,OAAS,SACxB/C,EAAeyD,YAAc,OAC7BzD,EAAe0D,aAAe,QAC9B1D,EAAe2D,YAAc,OAC7B3D,EAAe6D,WAAa,KAC5B7D,EAAe2B,MAAQ,QAEvB3B,EAAepB,cAAgBA,EAW/BoB,EAAemD,MAAQ,SAAUlD,EAAM6D,GACjB,iBAAT7D,IAAmBA,EAAOgD,OAAOhD,IAC5C,MAAM8D,EAAU,IAAInF,EACpB,IAAK,MAAMU,KAASc,EAAcH,GAEhC8D,EAAQC,OAAO1E,GAEjB,QAA6B,IAAlByE,EAAQ9E,MACjB,MAAM,IAAIW,YAAY,gCAExB,OAAOmE,EAAQ9E"}
\ No newline at end of file
diff --git a/dist/json-pull-parser.js b/dist/json-pull-parser.js
index 7ca7cf7..448bbcd 100644
--- a/dist/json-pull-parser.js
+++ b/dist/json-pull-parser.js
@@ -1,2 +1,2 @@
-!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.JSONPullParser=t():e.JSONPullParser=t()}(this,function(){return function(e){function t(n){if(r[n])return r[n].exports;var o=r[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var r={};return t.m=e,t.c=r,t.i=function(e){return e},t.d=function(e,r,n){t.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:n})},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,"a",r),r},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=2)}([function(e,t,r){"use strict";function n(e){this.text=e}function o(e){this.s=e,this.f=0,this.l=0|e.length,this.cc=0}function a(e){var t={d:!1,s:e,f:0,l:e.length,e:v,c:0,r:1,x:[]};return{next:function(){if(t.f===t.l)return t.e||t.x.length>0?{done:!1,value:i(t.s,t.l,t.l,"Unexpected end of JSON input")}:{done:!0};var e=l(t);return t.f=e.last,{value:e,done:!1}}}}function i(e,t,r,o,a){a=a||1;for(var i=t,s=e.charCodeAt(i);10!==s&&i>0;)s=e.charCodeAt(--i);10===s&&++i;for(var u="undefined:"+a,c=e.substring(i,t+1),f="",l=i;l0?g|k:0,u(t,r,o)):i(t,r,o,"Unexpected token } in JSON at position "+r,e.r);case 91:return e.e&v?(e.e=v|k,e.x.push(J),c(t,r,o)):i(t,r,o,"Unexpected token [ in JSON at position "+r,e.r);case 93:return e.e&k&&e.x.pop()===J?(e.e=e.x.length>0?g|k:0,f(t,r,o)):i(t,r,o,"Unexpected token ] in JSON at position "+r,e.r);case 58:if(!(e.e&N))return i(t,r,o,"Unexpected token : in JSON at position "+r,e.r);e.e=v,++r;continue;case 44:if(!(e.e&g))return i(t,r,o,"Unexpected token , in JSON at position "+r,e.r);e.x.length>0&&e.x[e.x.length-1]===A?e.e=O:e.e=v,++r;continue;case 45:case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:return e.e&v?(e.e=e.x.length>0?g|k:0,p(t,r,o)):i(t,r,o,"Unexpected number in JSON at position "+r,e.r);case 34:return e.e&O?(e.e=N,d(t,r,o)):e.e&v?(e.e=e.x.length>0?g|k:0,d(t,r,o)):i(t,r,o,"Unexpected string in JSON at position "+r,e.r);case 116:return e.e&v?(e.e=e.x.length>0?g|k:0,x(t,r,o)):i(t,r,o,"Unexpected token t in JSON at position "+r,e.r);case 102:return e.e&v?(e.e=e.x.length>0?g|k:0,y(t,r,o)):i(t,r,o,"Unexpected token f in JSON at position "+r,e.r);case 110:return e.e&v?(e.e=e.x.length>0?g|k:0,b(t,r,o)):i(t,r,o,"Unexpected token n in JSON at position "+r,e.r);default:return i(t,r,o,"Unexpected token "+t[r]+" in JSON at position "+r,e.r)}return{type:n.EndDocument,first:o,last:o}}function p(e,t,r){var o=t,a=e.charCodeAt(o++);if(45===a&&(a=e.charCodeAt(o++)),48!==a)for(;a>=48&&a<=57;)a=e.charCodeAt(o++);else a=e.charCodeAt(o++);if(46===a)for(a=e.charCodeAt(o++);a>=48&&a<=57;)a=e.charCodeAt(o++);if(101===a||69===a){if(a=e.charCodeAt(o++),43!==a&&45!==a||(a=e.charCodeAt(o++)),a<48||a>57)return i(e,o-1,r,"Unexpected token "+e[o-1]+" in JSON at position "+(o-1));if(o>=r)return i(e,t,r,"Unexpected end of JSON input");for(;a>=48&&a<=57;)a=e.charCodeAt(o++)}return{type:n.Number,value:parseFloat(e.substring(t,o-1)),first:t,last:o-1}}function d(e,t,r){for(var o=t+1;or)))return i(e,r,r,"Unexpected end of JSON input")}return{type:n.String,value:JSON.parse(e.substring(t,o)),source:e,first:t,last:o}}function h(e,t,r,n,o){if(t+n.length>r)return i(e,r,r,"Unexpected end of JSON input");for(var a=0;a",n.StartObject="{",n.EndObject="}",n.StartArray="[",n.EndArray="]",n.String="string",n.Number="number",n.TrueLiteral="true",n.FalseLiteral="false",n.NullLiteral="null",n.Whitespace="ws",n.Error="error",o.prototype.next=function(){return!(this.f>=this.l)&&(this.cc=0|source.charCodeAt(this.f++),!0)},o.prototype.code=function(){return this.cc},o.prototype.expect=function(e){},n.ObjectBuilder=S,n.parse=function(e,t){"string"!=typeof e&&(e=""+e);for(var r=new S,n=a(e),o=n.next();!o.done;o=n.next()){var i=o.value;r.handle(i)}if("undefined"==typeof r.value)throw new SyntaxError("Unexpected end of JSON input");return r.value},e.exports=n},function(e,t){function r(){this.handler={ref:this,add:function(e){return this.ref.value=e,e}}}r.prototype.startObject=function(){this.handler={old:this.handler,key:null,ref:this.handler.add({}),add:function(e){return null===this.key?this.key=e:(this.ref[this.key]=e,this.key=null),e}}},r.prototype.endObject=function(){this.handler=this.handler.old},r.prototype.startArray=function(){this.handler={old:this.handler,ref:this.handler.add([]),add:function(e){return this.ref.push(e),e}}},r.prototype.endArray=r.prototype.endObject,r.prototype.add=function(e){this.handler.add(e)},r.prototype.handle=function(e){switch(e.type){case"{":this.startObject();break;case"}":this.endObject();break;case"[":this.startArray();break;case"]":this.endArray();break;case"string":case"number":case"true":case"false":case"null":this.add(e.value);break;case"error":throw new SyntaxError(e.value.message)}},e.exports=r},function(e,t,r){e.exports=r(0)}])});
-//# sourceMappingURL=json-pull-parser.js.map
\ No newline at end of file
+class e{constructor(){this.handler={ref:this,add(e){return this.ref.value=e,e}}}startObject(){this.handler={old:this.handler,key:null,ref:this.handler.add({}),add(e){return null===this.key?this.key=e:(this.ref[this.key]=e,this.key=null),e}}}endObject(){this.handler=this.handler.old}startArray(){this.handler={old:this.handler,ref:this.handler.add([]),add(e){return this.ref.push(e),e}}}add(e){this.handler.add(e)}handle(e){switch(e.type){case"{":this.startObject();break;case"}":this.endObject();break;case"[":this.startArray();break;case"]":this.endArray();break;case"string":case"number":case"true":case"false":case"null":this.add(e.value);break;case"error":throw new SyntaxError(e.value.message)}}}e.prototype.endArray=e.prototype.endObject;class t{constructor(e){this.text=e}[Symbol.iterator](){return r(this.text)}tokens(){return r(this.text)}}function*r(e){const t={s:e,d:!1,f:0,l:e.length,e:1,c:0,r:1,x:[]};for(;;){if(t.f===t.l){if(!t.e&&!t.x.length)return;yield n(t.s,t.l,t.l,"Unexpected end of JSON input")}const e=c(t);t.f=e.last,yield e}}function n(e,r,n,a,s=1){let i=r,o=e.charCodeAt(i);for(;10!==o&&i>0;)o=e.charCodeAt(--i);10===o&&++i;const c="undefined:"+s,u=e.slice(i,r+1);let l="";for(let e=i;e0?20:0,s(0,d)):n(r,d,c,"Unexpected token } in JSON at position "+d,e.r);case 91:return 1&e.e?(e.e=17,e.x.push(64),i(0,d)):n(r,d,c,"Unexpected token [ in JSON at position "+d,e.r);case 93:return 16&e.e&&64===e.x.pop()?(e.e=e.x.length>0?20:0,o(0,d)):n(r,d,c,"Unexpected token ] in JSON at position "+d,e.r);case 58:if(!(8&e.e))return n(r,d,c,"Unexpected token : in JSON at position "+d,e.r);e.e=1,++d;continue;case 44:if(!(4&e.e))return n(r,d,c,"Unexpected token , in JSON at position "+d,e.r);e.x.length>0&&32===e.x[e.x.length-1]?e.e=2:e.e=1,++d;continue;case 45:case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:return 1&e.e?(e.e=e.x.length>0?20:0,u(r,d,c)):n(r,d,c,"Unexpected number in JSON at position "+d,e.r);case 34:return 2&e.e?(e.e=8,l(r,d,c)):1&e.e?(e.e=e.x.length>0?20:0,l(r,d,c)):n(r,d,c,"Unexpected string in JSON at position "+d,e.r);case 116:return 1&e.e?(e.e=e.x.length>0?20:0,f(r,d,c)):n(r,d,c,"Unexpected token t in JSON at position "+d,e.r);case 102:return 1&e.e?(e.e=e.x.length>0?20:0,h(r,d,c)):n(r,d,c,"Unexpected token f in JSON at position "+d,e.r);case 110:return 1&e.e?(e.e=e.x.length>0?20:0,p(r,d,c)):n(r,d,c,"Unexpected token n in JSON at position "+d,e.r);default:return n(r,d,c,"Unexpected token "+r[d]+" in JSON at position "+d,e.r)}return{type:t.EndDocument,first:c,last:c}}function u(e,r,a){let s=r,i=e.charCodeAt(s++);if(45===i&&(i=e.charCodeAt(s++)),48!==i)for(;i>=48&&i<=57;)i=e.charCodeAt(s++);else i=e.charCodeAt(s++);if(46===i)for(i=e.charCodeAt(s++);i>=48&&i<=57;)i=e.charCodeAt(s++);if(101===i||69===i){if(i=e.charCodeAt(s++),43!==i&&45!==i||(i=e.charCodeAt(s++)),i<48||i>57)return n(e,s-1,a,"Unexpected token "+e[s-1]+" in JSON at position "+(s-1));if(s>=a)return n(e,r,a,"Unexpected end of JSON input");for(;i>=48&&i<=57;)i=e.charCodeAt(s++)}return{type:t.Number,value:Number.parseFloat(e.slice(r,s-1)),first:r,last:s-1}}function l(e,r,a){let s=r+1;for(;sa)))return n(e,a,a,"Unexpected end of JSON input")}return{type:t.String,value:JSON.parse(e.slice(r,s)),source:e,first:r,last:s}}function d(e,t,r,a,s){if(t+a.length>r)return n(e,r,r,"Unexpected end of JSON input");for(const s of a){if(e.charCodeAt(t++)!==s)return n(e,t,r,"Unexpected token "+e[t-1]+" in JSON at position "+(t-1))}return s}function f(e,r,n){return d(e,r,n,[116,114,117,101],{type:t.TrueLiteral,value:!0,source:e,first:r,last:r+4})}function h(e,r,n){return d(e,r,n,[102,97,108,115,101],{type:t.FalseLiteral,value:!1,source:e,first:r,last:r+5})}function p(e,r,n){return d(e,r,n,[110,117,108,108],{type:t.NullLiteral,value:null,source:e,first:r,last:r+4})}t.StartDocument="<",t.EndDocument=">",t.StartObject="{",t.EndObject="}",t.StartArray="[",t.EndArray="]",t.String="string",t.Number="number",t.TrueLiteral="true",t.FalseLiteral="false",t.NullLiteral="null",t.Whitespace="ws",t.Error="error",t.ObjectBuilder=e,t.parse=function(t,n){"string"!=typeof t&&(t=String(t));const a=new e;for(const e of r(t))a.handle(e);if(void 0===a.value)throw new SyntaxError("Unexpected end of JSON input");return a.value};export default t;
+//# sourceMappingURL=json-pull-parser.js.map
diff --git a/dist/json-pull-parser.js.map b/dist/json-pull-parser.js.map
index 6118b93..8c0bf2d 100644
--- a/dist/json-pull-parser.js.map
+++ b/dist/json-pull-parser.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///dist/json-pull-parser.js","webpack:///webpack/bootstrap fadce7542f432126fdff","webpack:///./src/parser.js","webpack:///./src/builder.js","webpack:///./index.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","i","l","call","m","c","value","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","JSONPullParser","text","CodePointIterator","source","f","length","cc","TokenIterator","state","e","VALUE","r","x","next","done","ParserError","token","parseValue","last","charCodeAt","str0","str1","substring","str2","err","SyntaxError","type","Error","first","parseObjectStart","StartObject","parseObjectEnd","EndObject","parseArrayStart","StartArray","parseArrayEnd","EndArray","KEY","CLOSE","push","OBJECT","pop","COMMA","ARRAY","COLON","parseNumber","parseString","parseTrue","parseFalse","parseNull","EndDocument","Number","parseFloat","String","JSON","parse","match","ccs","success","TrueLiteral","FalseLiteral","NullLiteral","ObjectBuilder","Symbol","iterator","tokens","StartDocument","Whitespace","code","expect","reviever","builder","it","step","handle","handler","ref","add","startObject","old","key","endObject","startArray","endArray","message"],"mappings":"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","file":"dist/json-pull-parser.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"JSONPullParser\"] = factory();\n\telse\n\t\troot[\"JSONPullParser\"] = factory();\n})(this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"JSONPullParser\"] = factory();\n\telse\n\t\troot[\"JSONPullParser\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// identity function for calling harmony imports with the correct context\n/******/ \t__webpack_require__.i = function(value) { return value; };\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 2);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar ObjectBuilder = __webpack_require__(1);\n\nvar VALUE = 1;\nvar KEY = 2;\nvar COMMA = 4;\nvar COLON = 8;\nvar CLOSE = 16;\nvar OBJECT = 32;\nvar ARRAY = 64;\n\nfunction JSONPullParser(text)\n{\n this.text = text;\n}\n\nJSONPullParser.prototype[Symbol.iterator] = function()\n{\n return TokenIterator(this.text);\n}\n\nJSONPullParser.prototype.tokens = function()\n{\n return TokenIterator(this.text);\n}\n\nif (typeof Symbol === 'object' && Symbol.iterator) {\n JSONPullParser.prototype[Symbol.iterator] = JSONPullParser.prototype.tokens;\n}\n\nJSONPullParser.StartDocument = '<';\nJSONPullParser.EndDocument = '>';\nJSONPullParser.StartObject = '{';\nJSONPullParser.EndObject = '}';\nJSONPullParser.StartArray = '[';\nJSONPullParser.EndArray = ']';\nJSONPullParser.String = 'string';\nJSONPullParser.Number = 'number';\nJSONPullParser.TrueLiteral = 'true';\nJSONPullParser.FalseLiteral = 'false';\nJSONPullParser.NullLiteral = 'null';\nJSONPullParser.Whitespace = 'ws';\nJSONPullParser.Error = 'error';\n\nfunction CodePointIterator(source)\n{\n this.s = source;\n this.f = 0;\n this.l = source.length | 0;\n this.cc = 0;\n}\n\nCodePointIterator.prototype.next = function ()\n{\n if (this.f >= this.l) return false;\n this.cc = source.charCodeAt(this.f++) | 0;\n return true;\n}\n\nCodePointIterator.prototype.code = function ()\n{\n return this.cc;\n}\n\nCodePointIterator.prototype.expect = function (code)\n{\n}\n\nJSONPullParser.ObjectBuilder = ObjectBuilder;\n\nJSONPullParser.parse = function(text, reviever)\n{\n if (typeof text !== 'string') text = '' + text;\n var builder = new ObjectBuilder();\n var it = TokenIterator(text);\n for (var step = it.next();!step.done; step = it.next()) {\n var token = step.value;\n // console.log(\"token: \" + token.type);\n builder.handle(token);\n }\n if (typeof builder.value === 'undefined') throw new SyntaxError('Unexpected end of JSON input');\n return builder.value;\n}\n\nfunction TokenIterator(text)\n{\n var state = {\n d: false, // done\n s: text,\n f: 0, // position\n l: text.length, // length\n e: VALUE, // expect\n c: 0, // column\n r: 1, // row\n x: []\n };\n return {\n next: function () {\n // console.log(`next: ${state.f}, ${state.l}, ${text.charCodeAt(state.f).toString(16)}`)\n if (state.f === state.l) {\n return (state.e || state.x.length > 0)\n ? { done: false, value: ParserError(state.s, state.l, state.l, 'Unexpected end of JSON input') }\n : { done: true };\n }\n var token = parseValue(state);\n state.f = token.last;\n return { value: token, done: false };\n }\n };\n}\n\nfunction ParserError(s, f, l, m, r)\n{\n r = r || 1;\n var c = f;\n var cc = s.charCodeAt(c);\n while (cc !== 0x0a && c > 0) {\n cc = s.charCodeAt(--c);\n }\n if (cc === 0x0a) ++c;\n var str0 = 'undefined:' + r;\n var str1 = s.substring(c, f+1);\n var str2 = '';\n for (var i = c;i < f;++i) str2 += ' ';\n str2 += '^';\n\n var err = new SyntaxError(str0 + \"\\n\" + str1 + \"\\n\" + str2 + \"\\n\\n\" + m);\n return {\n type: JSONPullParser.Error,\n value: err,\n first: f,\n last: l\n };\n}\n\nfunction parseObjectStart(s, f, l)\n{\n return {\n type: JSONPullParser.StartObject,\n value: '{',\n first: f,\n last: f+1\n };\n}\n\nfunction parseObjectEnd(s, f, l)\n{\n return {\n type: JSONPullParser.EndObject,\n value: '}',\n first: f,\n last: f+1\n };\n}\nfunction parseArrayStart(s, f, l)\n{\n return {\n type: JSONPullParser.StartArray,\n value: '[',\n first: f,\n last: f+1\n };\n}\n\nfunction parseArrayEnd(s, f, l)\n{\n return {\n type: JSONPullParser.EndArray,\n value: ']',\n first: f,\n last: f+1\n };\n}\n\nfunction parseValue(state)\n{\n var s = state.s;\n var f = state.f;\n var l = state.l;\n while (f < l) {\n state.c++;\n switch (s.charCodeAt(f)) {\n case 0x0a: // LF\n state.c = 0;\n state.r++;\n case 0x09: // TAB\n case 0x0d: // CR\n case 0x20: // WS\n ++f; continue;\n case 0x7b: // {\n if (!(state.e & VALUE)) return ParserError(s, f, l, 'Unexpected token { in JSON at position ' + f, state.r);\n state.e = KEY | CLOSE;\n state.x.push(OBJECT);\n return parseObjectStart(s, f, l);\n case 0x7d: // }\n if (!(state.e & CLOSE) || state.x.pop() !== OBJECT) return ParserError(s, f, l, 'Unexpected token } in JSON at position ' + f, state.r);\n state.e = state.x.length > 0 ? COMMA | CLOSE : 0;\n return parseObjectEnd(s, f, l);\n case 0x5b: // [\n if (!(state.e & VALUE)) return ParserError(s, f, l, 'Unexpected token [ in JSON at position ' + f, state.r);\n state.e = VALUE | CLOSE;\n state.x.push(ARRAY);\n return parseArrayStart(s, f, l);\n case 0x5d: // ]\n if (!(state.e & CLOSE) || state.x.pop() !== ARRAY) return ParserError(s, f, l, 'Unexpected token ] in JSON at position ' + f, state.r);\n state.e = state.x.length > 0 ? COMMA | CLOSE : 0;\n return parseArrayEnd(s, f, l);\n case 0x3a: // :\n if (!(state.e & COLON)) return ParserError(s, f, l, 'Unexpected token : in JSON at position ' + f, state.r);\n state.e = VALUE;\n ++f; continue;\n case 0x2c: // ,\n if (!(state.e & COMMA)) return ParserError(s, f, l, 'Unexpected token , in JSON at position ' + f, state.r);\n if (state.x.length > 0 && state.x[state.x.length-1] === OBJECT) state.e = KEY;\n else state.e = VALUE;\n ++f; continue;\n case 0x2d: // -\n case 0x30: // 0\n case 0x31: // 1\n case 0x32: // 2\n case 0x33: // 3\n case 0x34: // 4\n case 0x35: // 5\n case 0x36: // 6\n case 0x37: // 7\n case 0x38: // 8\n case 0x39: // 9\n if (!(state.e & VALUE)) return ParserError(s, f, l, 'Unexpected number in JSON at position ' + f, state.r);\n state.e = state.x.length > 0 ? COMMA | CLOSE : 0;\n return parseNumber(s, f, l);\n case 0x22:\n if (state.e & KEY) {\n state.e = COLON;\n return parseString(s, f, l);\n }\n if (!(state.e & VALUE)) return ParserError(s, f, l, 'Unexpected string in JSON at position ' + f, state.r);\n state.e = state.x.length > 0 ? COMMA | CLOSE : 0;\n return parseString(s, f, l);\n case 0x74: // t\n if (!(state.e & VALUE)) return ParserError(s, f, l, 'Unexpected token t in JSON at position ' + f, state.r);\n state.e = state.x.length > 0 ? COMMA | CLOSE : 0;\n return parseTrue(s, f, l);\n case 0x66: // f\n if (!(state.e & VALUE)) return ParserError(s, f, l, 'Unexpected token f in JSON at position ' + f, state.r);\n state.e = state.x.length > 0 ? COMMA | CLOSE : 0;\n return parseFalse(s, f, l);\n case 0x6e: // n\n if (!(state.e & VALUE)) return ParserError(s, f, l, 'Unexpected token n in JSON at position ' + f, state.r);\n state.e = state.x.length > 0 ? COMMA | CLOSE : 0;\n return parseNull(s, f, l);\n default: return ParserError(s, f, l, 'Unexpected token ' + s[f] + ' in JSON at position ' + f, state.r);\n }\n }\n return {\n type: JSONPullParser.EndDocument,\n first: l,\n last: l,\n };\n}\n\nfunction parseNumber(s, f, l)\n{\n var c = f;\n\n var cc = s.charCodeAt(c++);\n\n if (cc === 0x2d /* - */) cc = s.charCodeAt(c++);\n\n if (cc !== 0x30 /* 0 */) {\n while (cc >= 0x30 /* 0 */ && cc <= 0x39 /* 9 */) {\n cc = s.charCodeAt(c++);\n }\n }\n else {\n cc = s.charCodeAt(c++);\n }\n\n if (cc === 0x2e /* . */) {\n cc = s.charCodeAt(c++);\n while (cc >= 0x30 && cc <= 0x39) cc = s.charCodeAt(c++);\n }\n\n if (cc === 0x65 /* e */|| cc === 0x45 /* E */) {\n cc = s.charCodeAt(c++);\n if (cc === 0x2b /* + */|| cc === 0x2d /* - */) cc = s.charCodeAt(c++);\n if (cc < 0x30 || cc > 0x39) return ParserError(s, c-1, l, 'Unexpected token ' + s[c-1] + ' in JSON at position ' + (c-1));\n if (c >= l) return ParserError(s, f, l, 'Unexpected end of JSON input');\n while (cc >= 0x30 /* 0 */ && cc <= 0x39 /* 9 */) cc = s.charCodeAt(c++);\n\n }\n\n return {\n type: JSONPullParser.Number,\n value: parseFloat(s.substring(f, c-1)), // parseFloat seems to be faster than JSON.parse\n first: f,\n last: c-1\n };\n\n}\n\n// ECMA-404 section 9\nfunction parseString(s, f, l)\n{\n var c = f+1;\n while (c < l) {\n var cc = s.charCodeAt(c++);\n if (cc === 0x22 /* \" */) break;\n else if (cc === 0x5c /* \\ */) {\n cc = s.charCodeAt(c++);\n if (cc === 0x75 /* u */) {\n c += 4;\n if (c > l) return ParserError(s, l, l, 'Unexpected end of JSON input');\n }\n }\n }\n // console.log(`string: ${c}, ${f}, ${s.substring(f, c)}`);\n return {\n type: JSONPullParser.String,\n value: JSON.parse(s.substring(f, c)),\n source: s,\n first: f,\n last: c\n };\n}\n\nfunction match(s, f, l, ccs, success)\n{\n if (f + ccs.length > l) return ParserError(s, l, l, 'Unexpected end of JSON input');\n for (var i = 0;i < ccs.length; ++i) {\n var cc = s.charCodeAt(f++);\n if (cc !== ccs[i]) return ParserError(s, f, l, 'Unexpected token ' + s[f-1] + ' in JSON at position ' + (f-1));\n }\n return success;\n}\n\nfunction parseTrue(s, f, l)\n{\n return match(s, f, l, [0x74, 0x72, 0x75, 0x65], {\n type: JSONPullParser.TrueLiteral,\n value: true,\n source: s,\n first: f,\n last: f+4\n });\n}\n\nfunction parseFalse(s, f, l)\n{\n return match(s, f, l, [0x66, 0x61, 0x6c, 0x73, 0x65], {\n type: JSONPullParser.FalseLiteral,\n value: false,\n source: s,\n first: f,\n last: f+5\n });\n}\n\nfunction parseNull(s, f, l)\n{\n return match(s, f, l, [0x6e, 0x75, 0x6c, 0x6c], {\n type: JSONPullParser.NullLiteral,\n value: null,\n source: s,\n first: f,\n last: f+4\n });\n}\n\nmodule.exports = JSONPullParser;\n\n\n/***/ },\n/* 1 */\n/***/ function(module, exports) {\n\nfunction ObjectBuilder() {\n this.handler = {\n ref: this,\n add: function (value) { this.ref.value = value; return value; },\n };\n}\n\nObjectBuilder.prototype.startObject = function () {\n this.handler = {\n old: this.handler,\n key: null,\n ref: this.handler.add({}),\n add: function (value) {\n if (this.key === null) this.key = value;\n else { this.ref[this.key] = value; this.key = null; }\n return value;\n },\n };\n}\n\nObjectBuilder.prototype.endObject = function () {\n this.handler = this.handler.old;\n}\n\nObjectBuilder.prototype.startArray = function () {\n this.handler = {\n old: this.handler,\n ref: this.handler.add([]),\n add: function (value) {\n this.ref.push(value);\n return value;\n },\n };\n}\n\nObjectBuilder.prototype.endArray = ObjectBuilder.prototype.endObject;\n\nObjectBuilder.prototype.add = function (value) {\n this.handler.add(value);\n}\n\nObjectBuilder.prototype.handle = function (token) {\n switch (token.type) {\n case '{':\n this.startObject();\n break;\n case '}':\n this.endObject();\n break;\n case '[':\n this.startArray();\n break;\n case ']':\n this.endArray();\n break;\n case 'string':\n case 'number':\n case 'true':\n case 'false':\n case 'null':\n this.add(token.value);\n break;\n case 'error':\n throw new SyntaxError(token.value.message);\n }\n}\n\nmodule.exports = ObjectBuilder;\n\n/***/ },\n/* 2 */\n/***/ function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(0);\n\n// function printStatus(fn) {\n// switch(%GetOptimizationStatus(fn)) {\n// case 1: console.log(\"Function is optimized\"); break;\n// case 2: console.log(\"Function is not optimized\"); break;\n// case 3: console.log(\"Function is always optimized\"); break;\n// case 4: console.log(\"Function is never optimized\"); break;\n// case 6: console.log(\"Function is maybe deoptimized\"); break;\n// case 7: console.log(\"Function is optimized by TurboFan\"); break;\n// default: console.log(\"Unknown optimization status\"); break;\n// }\n// }\n\n// const N = 1e6;\n\n// var o = true;\n// // for (let i = 0;i < N;++i) {\n// // o.push(null);\n// // o.push(true);\n// // o.push(false);\n// // // o.push(((Math.random() - 0.5) * 1e12));\n// // // o.push(((Math.random() - 0.5) * 1e12).toString(36));\n// // // o[ ((Math.random() - 0.5) * 1e12).toString(36) ] = ((Math.random() - 0.5) * 1e12);\n// // }\n\n// var s = JSON.stringify(o, null, 2);\n\n// JSONPullParser.parse(s);\n// JSONPullParser.parse(s);\n// JSONPullParser.parse(s);\n\n\n// // %OptimizeFunctionOnNextCall(JSONPullParser.parse);\n// %OptimizeFunctionOnNextCall(parseTrue);\n// %OptimizeFunctionOnNextCall(parseFalse);\n// %OptimizeFunctionOnNextCall(parseNull);\n// %OptimizeFunctionOnNextCall(match);\n\n// JSONPullParser.parse(s);\n// JSONPullParser.parse(s);\n\n// printStatus(JSONPullParser.parse);\n// printStatus(parseNumber);\n// printStatus(parseString);\n// printStatus(parseTrue);\n// printStatus(parseFalse);\n// printStatus(parseNull);\n// printStatus(match);\n\n\n// // console.time('1');\n// // var o1 = JSON.parse(s);\n// // console.timeEnd('1');\n// // var s1 = JSON.stringify(o1);\n\n// console.time('2');\n// var o2 = JSONPullParser.parse(s);\n// console.timeEnd('2');\n// // var s2 = JSON.stringify(o2);\n\n// console.time('1');\n// var o1 = JSON.parse(s);\n// console.timeEnd('1');\n// var s1 = JSON.stringify(o1);\n\n\n// // console.log(s1 === s2);\n\n// // for (let i = 0;i < N;++i) {\n// // if (o1[i] !== o2[i]) {\n// // console.log(i, o[i], o1[i], o2[i]);\n// // break;\n// // }\n// // }\n\n// JSON.parse('[\"Comma after the close\"],');\n\n// JSONPullParser.parse('25');\n\n\n/***/ }\n/******/ ]);\n});\n\n\n// WEBPACK FOOTER //\n// dist/json-pull-parser.js"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// identity function for calling harmony imports with the correct context\n \t__webpack_require__.i = function(value) { return value; };\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 2);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap fadce7542f432126fdff","'use strict';\n\nvar ObjectBuilder = require('./builder');\n\nvar VALUE = 1;\nvar KEY = 2;\nvar COMMA = 4;\nvar COLON = 8;\nvar CLOSE = 16;\nvar OBJECT = 32;\nvar ARRAY = 64;\n\nfunction JSONPullParser(text)\n{\n this.text = text;\n}\n\nJSONPullParser.prototype[Symbol.iterator] = function()\n{\n return TokenIterator(this.text);\n}\n\nJSONPullParser.prototype.tokens = function()\n{\n return TokenIterator(this.text);\n}\n\nif (typeof Symbol === 'object' && Symbol.iterator) {\n JSONPullParser.prototype[Symbol.iterator] = JSONPullParser.prototype.tokens;\n}\n\nJSONPullParser.StartDocument = '<';\nJSONPullParser.EndDocument = '>';\nJSONPullParser.StartObject = '{';\nJSONPullParser.EndObject = '}';\nJSONPullParser.StartArray = '[';\nJSONPullParser.EndArray = ']';\nJSONPullParser.String = 'string';\nJSONPullParser.Number = 'number';\nJSONPullParser.TrueLiteral = 'true';\nJSONPullParser.FalseLiteral = 'false';\nJSONPullParser.NullLiteral = 'null';\nJSONPullParser.Whitespace = 'ws';\nJSONPullParser.Error = 'error';\n\nfunction CodePointIterator(source)\n{\n this.s = source;\n this.f = 0;\n this.l = source.length | 0;\n this.cc = 0;\n}\n\nCodePointIterator.prototype.next = function ()\n{\n if (this.f >= this.l) return false;\n this.cc = source.charCodeAt(this.f++) | 0;\n return true;\n}\n\nCodePointIterator.prototype.code = function ()\n{\n return this.cc;\n}\n\nCodePointIterator.prototype.expect = function (code)\n{\n}\n\nJSONPullParser.ObjectBuilder = ObjectBuilder;\n\nJSONPullParser.parse = function(text, reviever)\n{\n if (typeof text !== 'string') text = '' + text;\n var builder = new ObjectBuilder();\n var it = TokenIterator(text);\n for (var step = it.next();!step.done; step = it.next()) {\n var token = step.value;\n // console.log(\"token: \" + token.type);\n builder.handle(token);\n }\n if (typeof builder.value === 'undefined') throw new SyntaxError('Unexpected end of JSON input');\n return builder.value;\n}\n\nfunction TokenIterator(text)\n{\n var state = {\n d: false, // done\n s: text,\n f: 0, // position\n l: text.length, // length\n e: VALUE, // expect\n c: 0, // column\n r: 1, // row\n x: []\n };\n return {\n next: function () {\n // console.log(`next: ${state.f}, ${state.l}, ${text.charCodeAt(state.f).toString(16)}`)\n if (state.f === state.l) {\n return (state.e || state.x.length > 0)\n ? { done: false, value: ParserError(state.s, state.l, state.l, 'Unexpected end of JSON input') }\n : { done: true };\n }\n var token = parseValue(state);\n state.f = token.last;\n return { value: token, done: false };\n }\n };\n}\n\nfunction ParserError(s, f, l, m, r)\n{\n r = r || 1;\n var c = f;\n var cc = s.charCodeAt(c);\n while (cc !== 0x0a && c > 0) {\n cc = s.charCodeAt(--c);\n }\n if (cc === 0x0a) ++c;\n var str0 = 'undefined:' + r;\n var str1 = s.substring(c, f+1);\n var str2 = '';\n for (var i = c;i < f;++i) str2 += ' ';\n str2 += '^';\n\n var err = new SyntaxError(str0 + \"\\n\" + str1 + \"\\n\" + str2 + \"\\n\\n\" + m);\n return {\n type: JSONPullParser.Error,\n value: err,\n first: f,\n last: l\n };\n}\n\nfunction parseObjectStart(s, f, l)\n{\n return {\n type: JSONPullParser.StartObject,\n value: '{',\n first: f,\n last: f+1\n };\n}\n\nfunction parseObjectEnd(s, f, l)\n{\n return {\n type: JSONPullParser.EndObject,\n value: '}',\n first: f,\n last: f+1\n };\n}\nfunction parseArrayStart(s, f, l)\n{\n return {\n type: JSONPullParser.StartArray,\n value: '[',\n first: f,\n last: f+1\n };\n}\n\nfunction parseArrayEnd(s, f, l)\n{\n return {\n type: JSONPullParser.EndArray,\n value: ']',\n first: f,\n last: f+1\n };\n}\n\nfunction parseValue(state)\n{\n var s = state.s;\n var f = state.f;\n var l = state.l;\n while (f < l) {\n state.c++;\n switch (s.charCodeAt(f)) {\n case 0x0a: // LF\n state.c = 0;\n state.r++;\n case 0x09: // TAB\n case 0x0d: // CR\n case 0x20: // WS\n ++f; continue;\n case 0x7b: // {\n if (!(state.e & VALUE)) return ParserError(s, f, l, 'Unexpected token { in JSON at position ' + f, state.r);\n state.e = KEY | CLOSE;\n state.x.push(OBJECT);\n return parseObjectStart(s, f, l);\n case 0x7d: // }\n if (!(state.e & CLOSE) || state.x.pop() !== OBJECT) return ParserError(s, f, l, 'Unexpected token } in JSON at position ' + f, state.r);\n state.e = state.x.length > 0 ? COMMA | CLOSE : 0;\n return parseObjectEnd(s, f, l);\n case 0x5b: // [\n if (!(state.e & VALUE)) return ParserError(s, f, l, 'Unexpected token [ in JSON at position ' + f, state.r);\n state.e = VALUE | CLOSE;\n state.x.push(ARRAY);\n return parseArrayStart(s, f, l);\n case 0x5d: // ]\n if (!(state.e & CLOSE) || state.x.pop() !== ARRAY) return ParserError(s, f, l, 'Unexpected token ] in JSON at position ' + f, state.r);\n state.e = state.x.length > 0 ? COMMA | CLOSE : 0;\n return parseArrayEnd(s, f, l);\n case 0x3a: // :\n if (!(state.e & COLON)) return ParserError(s, f, l, 'Unexpected token : in JSON at position ' + f, state.r);\n state.e = VALUE;\n ++f; continue;\n case 0x2c: // ,\n if (!(state.e & COMMA)) return ParserError(s, f, l, 'Unexpected token , in JSON at position ' + f, state.r);\n if (state.x.length > 0 && state.x[state.x.length-1] === OBJECT) state.e = KEY;\n else state.e = VALUE;\n ++f; continue;\n case 0x2d: // -\n case 0x30: // 0\n case 0x31: // 1\n case 0x32: // 2\n case 0x33: // 3\n case 0x34: // 4\n case 0x35: // 5\n case 0x36: // 6\n case 0x37: // 7\n case 0x38: // 8\n case 0x39: // 9\n if (!(state.e & VALUE)) return ParserError(s, f, l, 'Unexpected number in JSON at position ' + f, state.r);\n state.e = state.x.length > 0 ? COMMA | CLOSE : 0;\n return parseNumber(s, f, l);\n case 0x22:\n if (state.e & KEY) {\n state.e = COLON;\n return parseString(s, f, l);\n }\n if (!(state.e & VALUE)) return ParserError(s, f, l, 'Unexpected string in JSON at position ' + f, state.r);\n state.e = state.x.length > 0 ? COMMA | CLOSE : 0;\n return parseString(s, f, l);\n case 0x74: // t\n if (!(state.e & VALUE)) return ParserError(s, f, l, 'Unexpected token t in JSON at position ' + f, state.r);\n state.e = state.x.length > 0 ? COMMA | CLOSE : 0;\n return parseTrue(s, f, l);\n case 0x66: // f\n if (!(state.e & VALUE)) return ParserError(s, f, l, 'Unexpected token f in JSON at position ' + f, state.r);\n state.e = state.x.length > 0 ? COMMA | CLOSE : 0;\n return parseFalse(s, f, l);\n case 0x6e: // n\n if (!(state.e & VALUE)) return ParserError(s, f, l, 'Unexpected token n in JSON at position ' + f, state.r);\n state.e = state.x.length > 0 ? COMMA | CLOSE : 0;\n return parseNull(s, f, l);\n default: return ParserError(s, f, l, 'Unexpected token ' + s[f] + ' in JSON at position ' + f, state.r);\n }\n }\n return {\n type: JSONPullParser.EndDocument,\n first: l,\n last: l,\n };\n}\n\nfunction parseNumber(s, f, l)\n{\n var c = f;\n\n var cc = s.charCodeAt(c++);\n\n if (cc === 0x2d /* - */) cc = s.charCodeAt(c++);\n\n if (cc !== 0x30 /* 0 */) {\n while (cc >= 0x30 /* 0 */ && cc <= 0x39 /* 9 */) {\n cc = s.charCodeAt(c++);\n }\n }\n else {\n cc = s.charCodeAt(c++);\n }\n\n if (cc === 0x2e /* . */) {\n cc = s.charCodeAt(c++);\n while (cc >= 0x30 && cc <= 0x39) cc = s.charCodeAt(c++);\n }\n\n if (cc === 0x65 /* e */|| cc === 0x45 /* E */) {\n cc = s.charCodeAt(c++);\n if (cc === 0x2b /* + */|| cc === 0x2d /* - */) cc = s.charCodeAt(c++);\n if (cc < 0x30 || cc > 0x39) return ParserError(s, c-1, l, 'Unexpected token ' + s[c-1] + ' in JSON at position ' + (c-1));\n if (c >= l) return ParserError(s, f, l, 'Unexpected end of JSON input');\n while (cc >= 0x30 /* 0 */ && cc <= 0x39 /* 9 */) cc = s.charCodeAt(c++);\n\n }\n\n return {\n type: JSONPullParser.Number,\n value: parseFloat(s.substring(f, c-1)), // parseFloat seems to be faster than JSON.parse\n first: f,\n last: c-1\n };\n\n}\n\n// ECMA-404 section 9\nfunction parseString(s, f, l)\n{\n var c = f+1;\n while (c < l) {\n var cc = s.charCodeAt(c++);\n if (cc === 0x22 /* \" */) break;\n else if (cc === 0x5c /* \\ */) {\n cc = s.charCodeAt(c++);\n if (cc === 0x75 /* u */) {\n c += 4;\n if (c > l) return ParserError(s, l, l, 'Unexpected end of JSON input');\n }\n }\n }\n // console.log(`string: ${c}, ${f}, ${s.substring(f, c)}`);\n return {\n type: JSONPullParser.String,\n value: JSON.parse(s.substring(f, c)),\n source: s,\n first: f,\n last: c\n };\n}\n\nfunction match(s, f, l, ccs, success)\n{\n if (f + ccs.length > l) return ParserError(s, l, l, 'Unexpected end of JSON input');\n for (var i = 0;i < ccs.length; ++i) {\n var cc = s.charCodeAt(f++);\n if (cc !== ccs[i]) return ParserError(s, f, l, 'Unexpected token ' + s[f-1] + ' in JSON at position ' + (f-1));\n }\n return success;\n}\n\nfunction parseTrue(s, f, l)\n{\n return match(s, f, l, [0x74, 0x72, 0x75, 0x65], {\n type: JSONPullParser.TrueLiteral,\n value: true,\n source: s,\n first: f,\n last: f+4\n });\n}\n\nfunction parseFalse(s, f, l)\n{\n return match(s, f, l, [0x66, 0x61, 0x6c, 0x73, 0x65], {\n type: JSONPullParser.FalseLiteral,\n value: false,\n source: s,\n first: f,\n last: f+5\n });\n}\n\nfunction parseNull(s, f, l)\n{\n return match(s, f, l, [0x6e, 0x75, 0x6c, 0x6c], {\n type: JSONPullParser.NullLiteral,\n value: null,\n source: s,\n first: f,\n last: f+4\n });\n}\n\nmodule.exports = JSONPullParser;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/parser.js\n// module id = 0\n// module chunks = 0","function ObjectBuilder() {\n this.handler = {\n ref: this,\n add: function (value) { this.ref.value = value; return value; },\n };\n}\n\nObjectBuilder.prototype.startObject = function () {\n this.handler = {\n old: this.handler,\n key: null,\n ref: this.handler.add({}),\n add: function (value) {\n if (this.key === null) this.key = value;\n else { this.ref[this.key] = value; this.key = null; }\n return value;\n },\n };\n}\n\nObjectBuilder.prototype.endObject = function () {\n this.handler = this.handler.old;\n}\n\nObjectBuilder.prototype.startArray = function () {\n this.handler = {\n old: this.handler,\n ref: this.handler.add([]),\n add: function (value) {\n this.ref.push(value);\n return value;\n },\n };\n}\n\nObjectBuilder.prototype.endArray = ObjectBuilder.prototype.endObject;\n\nObjectBuilder.prototype.add = function (value) {\n this.handler.add(value);\n}\n\nObjectBuilder.prototype.handle = function (token) {\n switch (token.type) {\n case '{':\n this.startObject();\n break;\n case '}':\n this.endObject();\n break;\n case '[':\n this.startArray();\n break;\n case ']':\n this.endArray();\n break;\n case 'string':\n case 'number':\n case 'true':\n case 'false':\n case 'null':\n this.add(token.value);\n break;\n case 'error':\n throw new SyntaxError(token.value.message);\n }\n}\n\nmodule.exports = ObjectBuilder;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/builder.js\n// module id = 1\n// module chunks = 0","module.exports = require('./src/parser.js');\n\n// function printStatus(fn) {\n// switch(%GetOptimizationStatus(fn)) {\n// case 1: console.log(\"Function is optimized\"); break;\n// case 2: console.log(\"Function is not optimized\"); break;\n// case 3: console.log(\"Function is always optimized\"); break;\n// case 4: console.log(\"Function is never optimized\"); break;\n// case 6: console.log(\"Function is maybe deoptimized\"); break;\n// case 7: console.log(\"Function is optimized by TurboFan\"); break;\n// default: console.log(\"Unknown optimization status\"); break;\n// }\n// }\n\n// const N = 1e6;\n\n// var o = true;\n// // for (let i = 0;i < N;++i) {\n// // o.push(null);\n// // o.push(true);\n// // o.push(false);\n// // // o.push(((Math.random() - 0.5) * 1e12));\n// // // o.push(((Math.random() - 0.5) * 1e12).toString(36));\n// // // o[ ((Math.random() - 0.5) * 1e12).toString(36) ] = ((Math.random() - 0.5) * 1e12);\n// // }\n\n// var s = JSON.stringify(o, null, 2);\n\n// JSONPullParser.parse(s);\n// JSONPullParser.parse(s);\n// JSONPullParser.parse(s);\n\n\n// // %OptimizeFunctionOnNextCall(JSONPullParser.parse);\n// %OptimizeFunctionOnNextCall(parseTrue);\n// %OptimizeFunctionOnNextCall(parseFalse);\n// %OptimizeFunctionOnNextCall(parseNull);\n// %OptimizeFunctionOnNextCall(match);\n\n// JSONPullParser.parse(s);\n// JSONPullParser.parse(s);\n\n// printStatus(JSONPullParser.parse);\n// printStatus(parseNumber);\n// printStatus(parseString);\n// printStatus(parseTrue);\n// printStatus(parseFalse);\n// printStatus(parseNull);\n// printStatus(match);\n\n\n// // console.time('1');\n// // var o1 = JSON.parse(s);\n// // console.timeEnd('1');\n// // var s1 = JSON.stringify(o1);\n\n// console.time('2');\n// var o2 = JSONPullParser.parse(s);\n// console.timeEnd('2');\n// // var s2 = JSON.stringify(o2);\n\n// console.time('1');\n// var o1 = JSON.parse(s);\n// console.timeEnd('1');\n// var s1 = JSON.stringify(o1);\n\n\n// // console.log(s1 === s2);\n\n// // for (let i = 0;i < N;++i) {\n// // if (o1[i] !== o2[i]) {\n// // console.log(i, o[i], o1[i], o2[i]);\n// // break;\n// // }\n// // }\n\n// JSON.parse('[\"Comma after the close\"],');\n\n// JSONPullParser.parse('25');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./index.js\n// module id = 2\n// module chunks = 0"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"file":"json-pull-parser.js","sources":["../src/builder.js","../src/parser.js"],"sourcesContent":["/**\n *\n */\nclass ObjectBuilder {\n /**\n *\n */\n constructor () {\n this.handler = {\n ref: this,\n add (value) { this.ref.value = value; return value; }\n };\n }\n\n /**\n * @returns {void}\n */\n startObject () {\n this.handler = {\n old: this.handler,\n key: null,\n ref: this.handler.add({}),\n add (value) {\n if (this.key === null) this.key = value;\n else { this.ref[this.key] = value; this.key = null; }\n return value;\n }\n };\n }\n\n /**\n * @returns {void}\n */\n endObject () {\n this.handler = this.handler.old;\n }\n\n /**\n * @returns {void}\n */\n startArray () {\n this.handler = {\n old: this.handler,\n ref: this.handler.add([]),\n add (value) {\n this.ref.push(value);\n return value;\n }\n };\n }\n\n /**\n * @param {JSONValueOrError} value\n * @returns {void}\n */\n add (value) {\n this.handler.add(value);\n }\n\n /**\n * @param {Token|TokenEnd} token\n * @returns {void}\n */\n handle (token) {\n switch (token.type) {\n case '{':\n this.startObject();\n break;\n case '}':\n this.endObject();\n break;\n case '[':\n this.startArray();\n break;\n case ']':\n this.endArray();\n break;\n case 'string':\n case 'number':\n case 'true':\n case 'false':\n case 'null':\n this.add(token.value);\n break;\n case 'error':\n throw new SyntaxError(token.value.message);\n default:\n break;\n }\n }\n}\n\nObjectBuilder.prototype.endArray = ObjectBuilder.prototype.endObject;\n\nexport default ObjectBuilder;\n","import ObjectBuilder from './builder.js';\n\n/**\n * @typedef {PlainObject} State\n * @property {string} s Text\n * @property {boolean} [d=false] Done\n * @property {Integer} [f=0] Position\n * @property {Integer} [l] Defaults to text length\n * @property {Integer} [e=VALUE] Expect\n * @property {Integer} [c=0] Column\n * @property {Integer} [r=1] Row\n * @property {Integer[]} [x=[]]\n*/\n\n/**\n* @typedef {string} Type\n*/\n\n/**\n * @typedef {PlainObject} TokenPlain\n * @property {Type} type\n * @property {Integer} first\n * @property {Integer} last\n*/\n\n/**\n * @typedef {TokenPlain} TokenEnd\n */\n\n/**\n * @typedef {SyntaxError|string|Float|boolean|null} JSONValueOrError\n */\n\n/**\n * @typedef {TokenPlain} Token\n * @property {JSONValueOrError} value\n */\n\n/**\n * @typedef {Token} TokenWithSource\n * @property {string} source\n */\n\nconst VALUE = 1;\nconst KEY = 2;\nconst COMMA = 4;\nconst COLON = 8;\nconst CLOSE = 16;\nconst OBJECT = 32;\nconst ARRAY = 64;\n\n/**\n *\n */\nclass JSONPullParser {\n /**\n * @param {string} text\n * @returns {void}\n */\n constructor (text) {\n this.text = text;\n }\n\n /**\n * @returns {Iterator}\n */\n [Symbol.iterator] () {\n return tokenIterator(this.text);\n }\n\n /**\n * @returns {Iterator}\n */\n tokens () {\n return tokenIterator(this.text);\n }\n}\n\n/*\nif (typeof Symbol === 'object' && Symbol.iterator) {\n JSONPullParser.prototype[Symbol.iterator] = JSONPullParser.prototype.tokens;\n}\n*/\n\nJSONPullParser.StartDocument = '<';\nJSONPullParser.EndDocument = '>';\nJSONPullParser.StartObject = '{';\nJSONPullParser.EndObject = '}';\nJSONPullParser.StartArray = '[';\nJSONPullParser.EndArray = ']';\nJSONPullParser.String = 'string';\nJSONPullParser.Number = 'number';\nJSONPullParser.TrueLiteral = 'true';\nJSONPullParser.FalseLiteral = 'false';\nJSONPullParser.NullLiteral = 'null';\nJSONPullParser.Whitespace = 'ws';\nJSONPullParser.Error = 'error';\n\nJSONPullParser.ObjectBuilder = ObjectBuilder;\n\n/**\n* @callback ReviverFunction\n* @returns {JSON}\n*/\n\n/**\n* @param {string} text\n* @param {ReviverFunction} reviver\n*/\nJSONPullParser.parse = function (text, reviver) {\n if (typeof text !== 'string') text = String(text);\n const builder = new ObjectBuilder();\n for (const token of tokenIterator(text)) {\n // console.log(\"token: \" + token.type);\n builder.handle(token);\n }\n if (typeof builder.value === 'undefined') {\n throw new SyntaxError('Unexpected end of JSON input');\n }\n return builder.value;\n};\n\n/**\n * @param {string} text\n * @yields {Token|TokenEnd}\n * @returns {void}\n */\nfunction * tokenIterator (text) {\n const state = {\n s: text,\n d: false, // done\n f: 0, // position\n l: text.length, // length\n e: VALUE, // expect\n c: 0, // column\n r: 1, // row\n x: []\n };\n\n while (true) {\n // console.log(\n // `next: ${state.f}, ${state.l}, ` +\n // `${text.charCodeAt(state.f).toString(16)}`\n // );\n if (state.f === state.l) {\n if (!state.e && !state.x.length) {\n return;\n }\n yield parserError(\n state.s, state.l, state.l, 'Unexpected end of JSON input'\n );\n }\n const token = parseValue(state);\n state.f = token.last;\n\n yield token;\n }\n}\n\n/**\n * @param {string} s\n * @param {Integer} f\n * @param {Integer} l\n * @param {string} m Message\n * @param {Integer} r\n * @returns {Token}\n */\nfunction parserError (s, f, l, m, r = 1) {\n let c = f;\n let cc = s.charCodeAt(c);\n while (cc !== 0x0A && c > 0) {\n cc = s.charCodeAt(--c);\n }\n if (cc === 0x0A) ++c;\n const str0 = 'undefined:' + r;\n const str1 = s.slice(c, f + 1);\n let str2 = '';\n for (let i = c; i < f; ++i) str2 += ' ';\n str2 += '^';\n\n const err = new SyntaxError(str0 + '\\n' + str1 + '\\n' + str2 + '\\n\\n' + m);\n return {\n type: JSONPullParser.Error,\n value: err,\n first: f,\n last: l\n };\n}\n\n/**\n * @param {string} s\n * @param {Integer} f\n * @param {Integer} l\n * @returns {Token}\n */\nfunction parseObjectStart (s, f, l) {\n return {\n type: JSONPullParser.StartObject,\n value: '{',\n first: f,\n last: f + 1\n };\n}\n\n/**\n * @param {string} s\n * @param {Integer} f\n * @param {Integer} l\n * @returns {Token}\n */\nfunction parseObjectEnd (s, f, l) {\n return {\n type: JSONPullParser.EndObject,\n value: '}',\n first: f,\n last: f + 1\n };\n}\n/**\n * @param {string} s\n * @param {Integer} f\n * @param {Integer} l\n * @returns {Token}\n */\nfunction parseArrayStart (s, f, l) {\n return {\n type: JSONPullParser.StartArray,\n value: '[',\n first: f,\n last: f + 1\n };\n}\n\n/**\n * @param {string} s\n * @param {Integer} f\n * @param {Integer} l\n * @returns {Token}\n */\nfunction parseArrayEnd (s, f, l) {\n return {\n type: JSONPullParser.EndArray,\n value: ']',\n first: f,\n last: f + 1\n };\n}\n\n/**\n * @param {State} state\n * @returns {Token|TokenEnd}\n */\nfunction parseValue (state) {\n const {s, l} = state;\n let {f} = state;\n while (f < l) {\n state.c++;\n switch (s.charCodeAt(f)) {\n case 0x0A: // LF\n state.c = 0;\n state.r++;\n // Fallthrough\n case 0x09: // TAB\n case 0x0D: // CR\n case 0x20: // WS\n ++f; continue;\n case 0x7B: // {\n if (!(state.e & VALUE)) {\n return parserError(\n s, f, l, 'Unexpected token { in JSON at position ' + f, state.r\n );\n }\n state.e = KEY | CLOSE;\n state.x.push(OBJECT);\n return parseObjectStart(s, f, l);\n case 0x7D: // }\n if (!(state.e & CLOSE) || state.x.pop() !== OBJECT) {\n return parserError(\n s, f, l, 'Unexpected token } in JSON at position ' + f, state.r\n );\n }\n state.e = state.x.length > 0 ? COMMA | CLOSE : 0;\n return parseObjectEnd(s, f, l);\n case 0x5B: // [\n if (!(state.e & VALUE)) {\n return parserError(\n s, f, l, 'Unexpected token [ in JSON at position ' + f, state.r\n );\n }\n state.e = VALUE | CLOSE;\n state.x.push(ARRAY);\n return parseArrayStart(s, f, l);\n case 0x5D: // ]\n if (!(state.e & CLOSE) || state.x.pop() !== ARRAY) {\n return parserError(\n s, f, l, 'Unexpected token ] in JSON at position ' + f, state.r\n );\n }\n state.e = state.x.length > 0 ? COMMA | CLOSE : 0;\n return parseArrayEnd(s, f, l);\n case 0x3A: // :\n if (!(state.e & COLON)) {\n return parserError(\n s, f, l, 'Unexpected token : in JSON at position ' + f, state.r\n );\n }\n state.e = VALUE;\n ++f; continue;\n case 0x2C: // ,\n if (!(state.e & COMMA)) {\n return parserError(\n s, f, l, 'Unexpected token , in JSON at position ' + f, state.r\n );\n }\n if (state.x.length > 0 && state.x[state.x.length - 1] === OBJECT) {\n state.e = KEY;\n } else {\n state.e = VALUE;\n }\n ++f; continue;\n case 0x2D: // -\n case 0x30: // 0\n case 0x31: // 1\n case 0x32: // 2\n case 0x33: // 3\n case 0x34: // 4\n case 0x35: // 5\n case 0x36: // 6\n case 0x37: // 7\n case 0x38: // 8\n case 0x39: // 9\n if (!(state.e & VALUE)) {\n return parserError(\n s, f, l, 'Unexpected number in JSON at position ' + f, state.r\n );\n }\n state.e = state.x.length > 0 ? COMMA | CLOSE : 0;\n return parseNumber(s, f, l);\n case 0x22:\n if (state.e & KEY) {\n state.e = COLON;\n return parseString(s, f, l);\n }\n if (!(state.e & VALUE)) {\n return parserError(\n s, f, l, 'Unexpected string in JSON at position ' + f, state.r\n );\n }\n state.e = state.x.length > 0 ? COMMA | CLOSE : 0;\n return parseString(s, f, l);\n case 0x74: // t\n if (!(state.e & VALUE)) {\n return parserError(\n s, f, l, 'Unexpected token t in JSON at position ' + f, state.r\n );\n }\n state.e = state.x.length > 0 ? COMMA | CLOSE : 0;\n return parseTrue(s, f, l);\n case 0x66: // f\n if (!(state.e & VALUE)) {\n return parserError(\n s, f, l, 'Unexpected token f in JSON at position ' + f, state.r\n );\n }\n state.e = state.x.length > 0 ? COMMA | CLOSE : 0;\n return parseFalse(s, f, l);\n case 0x6E: // n\n if (!(state.e & VALUE)) {\n return parserError(\n s, f, l, 'Unexpected token n in JSON at position ' + f, state.r\n );\n }\n state.e = state.x.length > 0 ? COMMA | CLOSE : 0;\n return parseNull(s, f, l);\n default: return parserError(\n s, f, l, 'Unexpected token ' + s[f] + ' in JSON at position ' + f, state.r\n );\n }\n }\n return {\n type: JSONPullParser.EndDocument,\n first: l,\n last: l\n };\n}\n\n/**\n * @param {string} s\n * @param {Integer} f\n * @param {Integer} l\n * @returns {Token}\n */\nfunction parseNumber (s, f, l) {\n let c = f;\n\n let cc = s.charCodeAt(c++);\n\n if (cc === 0x2D /* - */) cc = s.charCodeAt(c++);\n\n if (cc !== 0x30 /* 0 */) {\n while (cc >= 0x30 /* 0 */ && cc <= 0x39 /* 9 */) {\n cc = s.charCodeAt(c++);\n }\n } else {\n cc = s.charCodeAt(c++);\n }\n\n if (cc === 0x2E /* . */) {\n cc = s.charCodeAt(c++);\n while (cc >= 0x30 && cc <= 0x39) cc = s.charCodeAt(c++);\n }\n\n if (cc === 0x65 /* e */|| cc === 0x45 /* E */) {\n cc = s.charCodeAt(c++);\n if (cc === 0x2B /* + */|| cc === 0x2D /* - */) cc = s.charCodeAt(c++);\n if (cc < 0x30 || cc > 0x39) {\n return parserError(\n s, c - 1, l,\n 'Unexpected token ' + s[c - 1] + ' in JSON at position ' + (c - 1)\n );\n }\n if (c >= l) return parserError(s, f, l, 'Unexpected end of JSON input');\n while (cc >= 0x30 /* 0 */ && cc <= 0x39 /* 9 */) cc = s.charCodeAt(c++);\n }\n\n return {\n type: JSONPullParser.Number,\n value: Number.parseFloat(\n s.slice(f, c - 1)\n ), // parseFloat seems to be faster than JSON.parse\n first: f,\n last: c - 1\n };\n}\n\n// ECMA-404 section 9\n/**\n * @param {string} s\n * @param {Integer} f\n * @param {Integer} l\n * @returns {TokenWithSource}\n */\nfunction parseString (s, f, l) {\n let c = f + 1;\n while (c < l) {\n let cc = s.charCodeAt(c++);\n if (cc === 0x22 /* \" */) break;\n else if (cc === 0x5C /* \\ */) {\n cc = s.charCodeAt(c++);\n if (cc === 0x75 /* u */) {\n c += 4;\n if (c > l) return parserError(s, l, l, 'Unexpected end of JSON input');\n }\n }\n }\n // console.log(`string: ${c}, ${f}, ${s.substring(f, c)}`);\n return {\n type: JSONPullParser.String,\n value: JSON.parse(s.slice(f, c)),\n source: s,\n first: f,\n last: c\n };\n}\n\n/**\n * @param {string} s\n * @param {Integer} f\n * @param {Integer} l\n * @param {Integer[]} ccs\n * @param {TokenWithSource} success\n * @returns {token}\n */\nfunction match (s, f, l, ccs, success) {\n if (f + ccs.length > l) {\n return parserError(s, l, l, 'Unexpected end of JSON input');\n }\n for (const cc_ of ccs) {\n const cc = s.charCodeAt(f++);\n if (cc !== cc_) {\n return parserError(\n s, f, l,\n 'Unexpected token ' + s[f - 1] + ' in JSON at position ' + (f - 1)\n );\n }\n }\n return success;\n}\n\n/**\n * @param {string} s\n * @param {Integer} f\n * @param {Integer} l\n * @returns {TokenWithSource}\n */\nfunction parseTrue (s, f, l) {\n return match(s, f, l, [0x74, 0x72, 0x75, 0x65], {\n type: JSONPullParser.TrueLiteral,\n value: true,\n source: s,\n first: f,\n last: f + 4\n });\n}\n\n/**\n * @param {string} s\n * @param {Integer} f\n * @param {Integer} l\n * @returns {TokenWithSource}\n */\nfunction parseFalse (s, f, l) {\n return match(s, f, l, [0x66, 0x61, 0x6C, 0x73, 0x65], {\n type: JSONPullParser.FalseLiteral,\n value: false,\n source: s,\n first: f,\n last: f + 5\n });\n}\n\n/**\n * @param {string} s\n * @param {Integer} f\n * @param {Integer} l\n * @returns {TokenWithSource}\n */\nfunction parseNull (s, f, l) {\n return match(s, f, l, [0x6E, 0x75, 0x6C, 0x6C], {\n type: JSONPullParser.NullLiteral,\n value: null,\n source: s,\n first: f,\n last: f + 4\n });\n}\n\nexport default JSONPullParser;\n"],"names":["ObjectBuilder","[object Object]","this","handler","ref","value","old","key","add","push","token","type","startObject","endObject","startArray","endArray","SyntaxError","message","prototype","JSONPullParser","text","Symbol","iterator","tokenIterator","state","s","d","f","l","length","e","c","r","x","parserError","parseValue","last","m","cc","charCodeAt","str0","str1","slice","str2","i","err","Error","first","parseObjectStart","StartObject","parseObjectEnd","EndObject","parseArrayStart","StartArray","parseArrayEnd","EndArray","KEY","pop","COMMA","VALUE","parseNumber","parseString","parseTrue","parseFalse","parseNull","EndDocument","Number","parseFloat","String","JSON","parse","source","match","ccs","success","cc_","TrueLiteral","FalseLiteral","NullLiteral","StartDocument","Whitespace","reviver","builder","handle"],"mappings":"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"}
\ No newline at end of file
diff --git a/docs/demo.html b/docs/demo.html
index 8db8e1c..ff1c07e 100644
--- a/docs/demo.html
+++ b/docs/demo.html
@@ -26,119 +26,139 @@
Please wait, benchmarking!