Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/morganconrad/f-readline

Thin layer over node's readline module to provide functional support: map, reduce, filter, forEach()
https://github.com/morganconrad/f-readline

async filter foreach functional-programming map node-readline readline reduce

Last synced: about 1 month ago
JSON representation

Thin layer over node's readline module to provide functional support: map, reduce, filter, forEach()

Awesome Lists containing this project

README

        

[![Build Status](https://secure.travis-ci.org/MorganConrad/f-readline.png)](http://travis-ci.org/MorganConrad/f-readline)
[![License](http://img.shields.io/badge/license-MIT-A31F34.svg)](https://github.com/MorganConrad/f-readline)
[![NPM Downloads](http://img.shields.io/npm/dm/f-readline.svg)](https://www.npmjs.org/package/f-readline)
[![Known Vulnerabilities](https://snyk.io/test/github/morganconrad/f-readline/badge.svg)](https://snyk.io/test/github/morganconrad/f-readline)
[![Coverage Status](https://coveralls.io/repos/github/MorganConrad/f-readline/badge.svg)](https://coveralls.io/github/MorganConrad/f-readline)

# f-readline

For a long time, Node had no "easy" way to read a stream line by line. Until v11.4, when [readline](https://nodejs.org/api/readline.html) added [support for async iteration](https://github.com/nodejs/node/pull/23916).

This module is a thin layer over readline to provide functional programming constructs: `filter(), forEach(), map(), reduce()`. It also provides a convenient `getAllLines()`.

## Basic API

**Note:** Other than the constructor, all methods are **async**.

### constructor(readable, interfaceOptions) constructor
- readable is the stream to be read
- interfaceOptions (optional, default = {}) will be passed to [readline.createInterface(interfaceOptions)](https://nodejs.org/api/readline.html#readline_readline_createinterface_options)
- crlfDelay defaults to 999999
- input is set to the `readable` argument

### async getAllLines()
Convenience method to just provide an array of all the lines. Obviously it must all fit in memory!

## Functional API
The "functional" methods below accept a user function (or "predicate") **fn** as their first argument. This method is usually called with three arguments:

- the line
- the line count (starting at 0)
- the instance of f-readline. Generally useless but see notes at end

### async filter(fn)
Returns an array of all lines passing the predicate `fn(line, index, this)`

### async forEach(fn)
Calls `fn(line, index, this)` for each line.

### async map(fn)
Returns an array obtained by calling `fn(line, index, this)` for each line

### async reduce(fn, acc)
Reduces using `fn(acc, line, index, this)`

### Notes, Todos, and Caveats

#### Since readline is clever on memory (?), this may save on memory
- if you are just counting lines or characters
- if you are filtering just a small subset of the input

#### What good is the 3rd argument to `fn()`?
- The interfaceOptions are available in `.interfaceOptions`
- The created interface is available in `.rl`
- If you want to pass other client specific info to **fn**, just add it to the FReadLine instance, _e.g._

```js
let frl = new FReadLine(readable, interfaceOptions);
frl.clientData = { your data here };

// then, during the call to fn(), you could access those

fn(line, index, frl) {
do something with frl.clientData
}
```

#### This module has nothing to do with prompting the user, pausing the input, etc. Just reading a stream line by line.

### Alternatives

All of these do their own twiddly buffering and eol parsing, instead of relying on a "robust" built-in library.

#### [file-readline](https://www.npmjs.com/package/file-readline)
- non-functional
- only reads a **file**, not any stream

#### [n-readlines](https://www.npmjs.com/package/n-readlines)
- non-functional
- synchronous

#### [readlines-ng](https://www.npmjs.com/package/readlines-ng)
- non-functional
- looks pretty good otherwise and claims to be fast.