Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/jadesrochers/fpstreamline
Tools to making working with functional programming constructs, especially arrays, easier
https://github.com/jadesrochers/fpstreamline
functional-programming javascript node
Last synced: 23 days ago
JSON representation
Tools to making working with functional programming constructs, especially arrays, easier
- Host: GitHub
- URL: https://github.com/jadesrochers/fpstreamline
- Owner: jadesrochers
- License: mit
- Created: 2019-03-15T17:55:33.000Z (almost 6 years ago)
- Default Branch: master
- Last Pushed: 2023-07-18T21:16:45.000Z (over 1 year ago)
- Last Synced: 2025-01-17T00:08:08.606Z (about 1 month ago)
- Topics: functional-programming, javascript, node
- Language: JavaScript
- Homepage:
- Size: 366 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# fpstreamline
A small library for functional programming; functions I found to be
missing elsewhere that were useful. Also shortcuts for fcns that do exist.## Whats the Use?
Whether using ramda or lodash you can get most of what is needed, but there
were some functions I wanted that were not availble or had awkward syntax.## installation
npm install @jadesrochers/fpstreamlineconst fps = require('@jadesrochers/fpstreamline')
const R = require('ramda')## Usage
## Piping async functions
Allows async functions to be piped, and also handles regular functions.
Consider it a regular piping function that is also async tolerant.
```javascript
let testprom1 = n => Promise.resolve(n-1)
let testprom2 = n => Promise.resolve(n-2)
let testprom3 = n => Promise.resolve(n-3)
let test = async () => {
let rslt = await fps.pipeAsync(
R.adjust(1)(testprom1),
R.adjust(1)(testprom2),
R.adjust(1)(testprom3),
)([0,6])
console.log('Result: ', rslt)
}
test()
// [0,0]
```## Array manipulation functions
### Append and Prepend automatically convert to array
I wanted to be able to use unknown length/type input, and these do.
They will take single values or an array and app/pre pend either way.
```javascript
R.pipe(
fps.append(2),
fps.append(3),
)(1)
// [ 1, 2, 3 ]R.pipe(
fps.prepend(2),
fps.prepend(3),
)(1)
// [ 3, 2, 1 ]
```### Append and Prepend result of fcns on specified input
Also append/prepend, but takes a function and index, and append/prepend the
result of running the function on the index.
Can take single value or array, if single value use (0) for index.
```javascript
let testfn1 = n => n+1
let testfn2 = n => n+2R.pipe(
fps.appendUseNth(1)(testfn1),
fps.appendUseNth(2)(testfn2),
)([0,1,2])
// [ 0, 1, 2, 2, 4 ]R.pipe(
fps.prependUseNth(1)(testfn1),
fps.prependUseNth(2)(testfn2),
)([0,1,2])
// [ 3, 2, 0, 1, 2 ]
```### Insert result of fcn on input array member
```javascript
R.pipe(
fps.insertUseNth(1)(1)(testfn1),
fps.insertUseNth(2)(2)(testfn2),
)([0,1,2])
// [ 0, 2, 3, 1, 2 ]
```### runN and runAll run function on some or all array members
The arity must be correct, nothing fancy going on here.
```javascript
fps.runAll(a => b => c => d => e => a+b+c+d+e)([0,1,2,3,4])
// 10
fps.runN(3)(a => b => c => a+b+c)([0,1,2,3,4])
// 9
```## Regex functions
For quickly getting correctly escaped/formatted regular expression string
when the text to be searched has special characters.### Escape all special characters and all except periods
```javascript
fps.regexEscapeAll('-/\\^$*+?.()|[]{}')
fps.regexEscapeExPer('-/\\^$*+?.()|[]{}')
```### Create regex from text passed
toRegex uses what you pass verbatim, getRegex escaped all special
characters except period.
```javascript
fps.toRegex('i')('abc*(ghi+)?')
// /abc*(ghi+)?/i
fps.getRegex('abc*+?[]()ghi')
// /abc\*\+\?\[\]\(\)ghi/i
```
### Search functions
strSearchBool performs a search of the string using a regex but returns just a boolean of whether a match was found, not how many, where, or anything else.
```javascript
fps.strSearchBool(/abc/)('filler abc filler')
// true
fps.strSearchBool(/abc/)('filler Abc filler')
// false
```## Conversions and Type testing
These are mostly just wrappers around other functions to
do testing/converting.
Supported types include object, number, boolean, string, null, array,
regexp, function, undefined### Check the type of a passed object
```javascript
fps.isTypeof('object')({})
// true
fps.isTypeof('object')({a:1, b:2})
// true
```### Check if the types of two objects match
Will match R.type rules.
```javascript
fps.typeMatch('def')('abc')
// true
fps.typeMatch({})({a:1, b:2})
// true
fps.typeMatch(null)(undefined)
// false
```### Convert string to JSON
```javascript
fps.toJSON('{"a":1,"b":[1,2,3],"c":3}')
// { a: 1, b: [ 1, 2, 3 ], c: 3 }
```### Convert string to number
Converts to number if it has just numbers.
```javascript
fps.strToNum('4620')
// Converts
fps.strToNum('34-35')
// Keeps as string
fps.strToNum('34,351')
// keeps as string
```### Convert string to Date
It follows rules of Date() object creation, so anything valid
for that should work with this.
```javascript
fps.toDate('11-05-1955')
fps.toDate('December 7, 1941')
fps.toDate('1453-05-29')
```### Convert to array accounting for various scenarios
```javascript
fps.toArray(5)
// [ 5 ]
fps.toArray('test string')
// [ 'test string' ]
fps.toArray({a: 1})
// [ {a: 1} ]
fps.toArray([1,2,3])
// [ 1, 2, 3 ]
```## Math functions
These are implemented everywhere of course, I just wanted the option
of dividing by the value passed first without R.flip. Not very useful.```javascript
R.pipe(
fps.subtract(3),
fps.divide(3),
)(12)
// 3
```