An easy yet complete to use iterable data buffer in javascript
Ideal for parsing text data or tokens.
Works with any array-like data.
Compatible with both JavaScript and TypeScript
Download from CDN or install from npm
npm install --save buffingjs
import { BufferJs } from 'buffingjs';
// Or for javascript
// const BufferJs = require('buffingjs');
const hugeText = `At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium.
voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati?
cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est
laborum et dolorum fuga.`;
const textBuffer = new BufferJs(hugeText);
const list = [1, 2, 3, 4, 5, 6];
const listBuffer = new BufferJs(list);
import { BufferJs } from 'buffingjs';
// Or for javascript
// const BufferJs = require('buffingjs');
const data = ['A', 'B', 'C', 'D', 'E'];
const buffer = new BufferJs(code);
console.log(buffer.current); // 'A'
console.log(buffer.next); // 'B'
console.log(buffer.prev); // undefined
buffer.consume(2); // Same as calling buffer.toNext() twice
console.log(buffer.current); // 'C'
console.log(buffer.next); // 'D'
console.log(buffer.prev); // 'B'
console.log(buffer.toPrev()); // 'B'
console.log(buffer.current); // 'B'
console.log(buffer.next); // 'A'
console.log(buffer.prev); // 'C'
console.log(buffer.position); // 1
buffer.seek(2);
console.log(buffer.position); // 2
console.log(buffer.current); // 'C'
console.log(buffer.next); // 'D'
console.log(buffer.prev); // 'B'
import { BufferJs } from 'buffingjs';
// Or for javascript
// const BufferJs = require('buffingjs');
const code = `1+2 - 3 * 5 / 823 + 2.501`;
const buffer = new BufferJs(code);
const regexNumbers = /[\d\.]/;
function parseNumbers() {
let readDot = false;
const value = buffer.extract(c => {
if (c === '.') {
if (readDot) {
return false;
}
readDot = true;
}
return regexNumbers.test(c);
}).join('');
return {
type: 'number',
value: parseFloat(value)
};
}
const regexOperators = /^(?:\+|\-|\*|\/|>|<|(?:>>)|(?:<<))$/;
function parseOperators() {
let value = '';
buffer.iterate(c => {
const _possibleMatch = value + c;
if (!regexOperators.test(_possibleMatch)) {
return false;
}
value = _possibleMatch;
return true;
});
return {
type: 'operator',
value
};
}
const tokens = [];
buffer.forEach(current => {
if (regexNumbers.test(current)) {
tokens.push(parseNumbers());
} else if (regexOperators.test(current)) {
tokens.push(parseOperators());
}
});
console.log(tokens);
export
class
Buffer
template
T
+ new Buffer(data
: ArrayLike‹T›): Buffer
Creates an instance of Buffer.
Parameters:
Name | Type |
---|---|
data |
ArrayLike‹T› |
Returns: Buffer
• get current(): T | undefined
The value at the current position
readonly
type
(T | undefined)
Returns: T | undefined
• get hasCurrent(): boolean
Verify if there is a value to read at the current position
readonly
Returns: boolean
• get hasNext(): boolean
Verify if there is a value to read at the next position
readonly
type
boolean
Returns: boolean
• get hasPrev(): boolean
Verify if there is a value to read at the previous position
readonly
type
boolean
Returns: boolean
• get length(): number
The length of the buffer
readonly
type
number
Returns: number
• get next(): T | undefined
The next value
readonly
type
(T | undefined)
Returns: T | undefined
• get position(): number
The current position number
readonly
type
number
Returns: number
• get prev(): T | undefined
The previous read value
readonly
type
(T | undefined)
Returns: T | undefined
▸ at(pos
: number, mode?
: "absolute" | "relative"): T | undefined
Returns the value at position [pos] If mode is 'relative' it is considered from the current position instead of 0 Negative values are accepted in the 'relative' mode In the 'absolute' mode negative values will always yield undefined
Parameters:
Name | Type |
---|---|
pos |
number |
mode? |
"absolute" | "relative" |
Returns: T | undefined
▸ consume(count?
: undefined | number): void
Consume the value at the current position and move [count] times Negative values are accepted and move backwards instead
Parameters:
Name | Type |
---|---|
count? |
undefined | number |
Returns: void
▸ drop(): void
Remove the latest saved position from the stack
Returns: void
▸ extract(filter
: function): T[]
Iterate from the current position untill [filter] return false or there is no data to process anymore Return the iterated data
Parameters:
▪ filter: function
▸ (next
: T, pos
: number): boolean
Parameters:
Name | Type |
---|---|
next |
T |
pos |
number |
Returns: T[]
▸ forEach(callback
: function): T[]
If the buffer does not change it is position inside the callback
this.consume will be called to ensure an infinite loop is not created by mistake
Parameters:
▪ callback: function
▸ (next
: T, pos
: number): void
Parameters:
Name | Type |
---|---|
next |
T |
pos |
number |
Returns: this
▸ iterate(filter
: function): this
Iterate from the current position untill [filter] return false or there is no data to process anymore
Parameters:
▪ filter: function
▸ (next
: T, pos
: number): boolean
Parameters:
Name | Type |
---|---|
next |
T |
pos |
number |
Returns: this
▸ join(sep
: string): string
Join the data into a string using the separator [sep]
Parameters:
Name | Type |
---|---|
sep |
string |
Returns: string
▸ restore(): void
Restore to the latest saved position The position is removed from the stack
Returns: void
▸ rewind(): void
Return to the starting position of the buffer
Returns: void
▸ save(): void
Save the current position for later Saved positions are stored in stack
Returns: void
▸ seek(pos?
: undefined | number): void
Change the current position number to [pos] Values bigger than the buffer legth or less than 0 will be forced to stay in the range
Parameters:
Name | Type |
---|---|
pos? |
undefined | number |
Returns: void
▸ toArray(): T[]
Returns: T[]
▸ toNext(): T | undefined
Move to the next position and then return the value
Returns: T | undefined
▸ toPrev(): T | undefined
Move to the previous position and then return the value
Returns: T | undefined
▸ toString(): string
Return the string representation of the data
Returns: string