2.0.1 • Published 5 years ago

input-reader v2.0.1

Weekly downloads
2
License
MIT
Repository
github
Last release
5 years ago

input-reader

JavaScript library for reading whitespace-separated data, which is a common input data format for tasks in many algorithmic competitions.

Quick Start

Installation

npm install --save input-reader

Example usage

const reader = require('input-reader')
const data = `
    4 2
    9 1 2 3
`
const pattern = `
    a b
    c ...arr
`
reader(data, pattern) // { a: 4, b: 2, c: 9, arr: [1, 2, 3] }

API

Module exports single function, which takes three parameters:

reader(data, pattern, options)

Parameters:

  • data - string containing input data.
  • pattern - string describing how data should be mapped to the returned object.
  • options - object specifying additional behaviour. Optional.

Return value:

  • Object containing input data placed in properties sepecified by pattern parameter.

Pattern syntax

Single-line mapping

const data = '1 2'
const pattern = 'foo bar'
reader(data, pattern) // { foo: 1, bar: 2 }

Multi-line mapping

const data = `
    1 2
    3 4 5
`
const pattern = `
    foo bar
    a b c
`
reader(data, pattern) // { foo: 1, bar: 2, a: 3, b: 4, c: 5 }

Rest operator Rest operator collects all the remaining elements of the line into an array. It must be used as the last symbol of the line.

const data = `
    1 2 3 4
`
const pattern = `
    foo ...bar
`
reader(data, pattern) // { foo: 1, bar: [2, 3, 4] }

Multi-line rest operator Multi-line rest operator collects all the remaining lines into an array. It can be only used in the last line of a pattern string.

const data = `
    9
    8 7
    6 5
`
const pattern = `
    foo
    ...bar[a b]
`
reader(data, pattern) // { foo: 9, bar: [{ a: 8, b: 7 }, { a: 6, b: 5 }] }

Empty multi-line rest operator If you don't specify the structure of each line, all the values will be collected directly into arrays.

const data = `
    9
    8 7
    6 5
`
const pattern = `
    foo
    ...bar[]
`
reader(data, pattern) // { foo: 9, bar: [[8, 7], [6, 5]] }

Nested rest operator

const data = `
    9
    1 2 3 4
    5 6 7 8
`
const pattern = `
    foo
    ...bar[a ...b]
`
reader(data, pattern) // { foo: 9, bar: [{ a: 1, b: [2, 3, 4] }, { a: 5, b: [6, 7, 8] }] }

Convert to numbers

const data = '1 hello'
const pattern = 'foo bar'
reader(data, pattern, { convertToNumbers: true }) // { foo: 1, bar: 'hello' }
reader(data, pattern, { convertToNumbers: false }) // { foo: '1', bar: 'hello' }

Options

Property NameTypeDefault ValueDescription
convertToNumbersbooleantrueIf true, all elements will be converted to Number type. If conversion results in NaN value, then the original type and value will be left.