npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

streamlinejs

v2.5.4

Published

Type-inference capable functional programming.

Downloads

88

Readme

Streamline.js

streamlinejs는 TypeScript를 사용한 함수형 프로그래밍 라이브러리로, 타입 추론이 가능한 함수형 프로그래밍을 지향합니다. 이 라이브러리는 함수형 프로그래밍의 핵심 원칙을 구현하고, 코드의 가독성과 유지보수성을 향상시키기 위해 설계되었습니다.

Index

1.Install

2.Main Function

3.Curry

4.Lazy

5.Strict

6.License

Install

npm

npm install streamlinejs

yarn

yarn add streamlinejs

pnpm

pnpm install streamlinejs

Main Function

  • 고차 함수: 함수들을 조합하여 복잡한 로직을 단순하게 구현할 수 있습니다.
  • 커링(Currying): 다중 인수를 가진 함수를 단일 인수를 가진 함수의 체인으로 변환합니다.
  • 지연 평가(Lazy Evaluation): 계산을 나중으로 미루어 필요할 때까지 수행하지 않습니다.
  • 엄격 평가(Strict Evaluation): 즉시 계산을 수행하여 결과를 반환합니다.

Usage - Curry

atC

  • 주어진 배열에서 주어진 인덱스에 있는 요소를 반환하는 커링함수입니다.
import * as C from 'streamlinejs/curry';

const iter = [1, 2, 3, 4, 5];
const index = 2;
const result = C.atC(index)(iter);
const result2 = C.atC(index, iter);

console.log(result); // 3
console.log(result2); // 3
// atC with go

import * as _ from 'streamlinejs/strict';
import * as C from 'streamlinejs/curry';

const arr = [1, 2, 3, 4, 5];
const res = _.go<number>(arr, C.atC(-1));

console.log(res); // 5

chunkC

  • 주어진 크기로 배열을 나누어 청크를 반환하는 커링함수입니다.
import * as C from 'streamlinejs/curry';

const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];

const res = C.chunkC(2)([1, 2, 3, 4, 5, 6, 7, 8, 9]);
const res2 = C.chunkC(3, [1, 2, 3, 4, 5, 6, 7, 8, 9]);

console.log(res); // [[1, 2], [3, 4], [5, 6], [7, 8], [9]]
// chunkC with go

import * as C from 'streamlinejs/curry';
import * as _ from 'streamlinejs/strict';

const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];

const res = _.go(arr, C.chunkC(2));

console.log(res); // [[1, 2], [3, 4], [5, 6], [7, 8], [9]]

concatC

  • 두 이터러블을 받은 뒤 결합하는 커링함수입니다.
import * as C from 'streamlinejs/curry';

const iter1 = [1, 2, 3];
const iter2 = [4, 5, 6];

const result = C.concatC(iter1)(iter2);

console.log(result); // [1, 2, 3, 4, 5, 6]
import * as C from 'streamlinejs/curry';

const iter1 = [1, 2, 3];
const iter2 = [4, 5, 6];

const result = C.concatC(iter1, iter2);

console.log(result); // [1, 2, 3, 4, 5, 6]
import * as C from 'streamlinejs/curry';
import * as _ from 'streamlinejs/strict';

const result = _.go(iter2, C.concatC(iter1));

console.log(result); // [1, 2, 3, 4, 5, 6]

dropC

  • 처음 n개의 요소를 건너뛰고 나머지 요소를 반환하는 커링함수입니다.
import * as C from 'streamlinejs/curry';

const res = C.dropC(3)([1, 2, 3, 4, 5]);
const res2 = C.dropC(3, [1, 2, 3, 4, 5]);

console.log(res); // [4, 5]
console.log(res2); // [4, 5]
import * as C from 'streamlinejs/curry';

const res = C.dropC(10)([1, 2, 3, 4, 5]);
const res2 = C.dropC(10, [1, 2, 3, 4, 5]);

console.log(res); // []
console.log(res2); // []
import * as C from 'streamlinejs/curry';

const res = C.dropC(-1)([1, 2, 3, 4, 5]);
const res2 = C.dropC(-1, [1, 2, 3, 4, 5]);

console.log(res); // [1, 2, 3, 4, 5]
console.log(res2); // [1, 2, 3, 4, 5]
// dropC with go

import * as C from 'streamlinejs/curry';
import * as _ from 'streamlinejs/strict';

const arr = [1, 2, 3, 4, 5];

const res = _.go<number[]>(arr, C.dropC(3));

console.log(res); // [4, 5]

everyC

  • 이터러블의 모든 요소가 주어진 조건을 만족하는지 확인하는 커링함수입니다.
import * as C from 'streamlinejs/curry';

const isEven = (n: number) => n % 2 === 0;
const everyIsEven = C.everyC(isEven);

console.log(everyIsEven([2, 4, 6, 8])); // true
// everyC with go
import * as C from 'streamlinejs/curry';
import * as _ from 'streamlinejs/strict';

const arr = [1, 2, 3, 4, 5];
const isEven = (n: number) => n % 2 === 0;

const everyIsEven = _.go(arr, C.everyC(isEven));

console.log(everyIsEven); // false

filterC

  • 주어진 조건을 만족하는 요소만을 반환하는 커링함수입니다.
import * as C from 'streamlinejs/curry';

const arr = [1, 2, 3, 4, 5];
const res = C.filterC((x: number) => x % 2 === 0, arr);

console.log(res); // [2, 4]
// filterC with go
import * as C from 'streamlinejs/curry';
import * as _ from 'streamlinejs/strict';

const arr = [1, 2, 3, 4, 5];

_.go<number[]>(
  arr,
  C.filterC((x: number) => x % 2 === 0),
  console.log, // [2, 4]
);

findC

  • 주어진 조건을 만족하는 첫번째 요소를 반환하는 커링함수입니다.
import * as C from 'streamlinejs/curry';

const arr = [1, 2, 3, 4, 5];
const isEven = (x: number) => x % 2 === 0;

const result = C.findC(isEven, arr);
const result2 = C.findC(isEven)(arr);

console.log(result); // 2
console.log(result2); // 2
// findC with go
import * as C from 'streamlinejs/curry';
import * as _ from 'streamlinejs/strict';

const arr = [1, 2, 3, 4, 5];
const isEven = (x: number) => x % 2 === 0;

const result = _.go<number>(arr, C.findC(isEven));

console.log(result); // 2

findIndexC

  • 이터러블에서 주어진 조건을 만족하는 첫 번째 요소의 인덱스를 반환하는 커링함수입니다.
import * as C from 'streamlinejs/curry';

const arr = [1, 2, 3, 4, 5];
const result = C.findIndexC(4, arr);

console.log(result); // 3
import * as C from 'streamlinejs/curry';

const arr = [1, 2, 3, 4, 5];
const result = C.findIndexC(6, arr);

console.log(result); // -1
import * as C from 'streamlinejs/curry';
import * as _ from 'streamlinejs/strict';

const arr = [{ a: 1 }, { a: 2 }, { a: 3 }, { a: 4 }, { a: 5 }];
const result = _.go(arr, C.findIndexC({ a: 4 }));

console.log(result); // 3

joinC

  • 배열의 모든 요소를 문자열로 변환하고, 주어진 구분자를 사용하여 결합하는 커링함수입니다.
import * as C from 'streamlinejs/curry';

const result = C.joinC('-', [1, 2, 3]);

console.log(result); // '1-2-3'
// joinC with go
import * as C from 'streamlinejs/curry';
import * as _ from 'streamlinejs/strict';

const obj = { a: 1, b: 2, c: 3 };

const res = _.go<string>(
  Object.entries(obj),
  C.mapC(([k, v]: [string, number]) => `${k}=${v}`),
  C.joinC('&'),
);

console.log(res); // 'a=1&b=2&c=3'

mapC

  • 각 요소에 주어진 함수를 적용하여 새로운 배열을 반환하는 커링함수입니다.
import * as C from 'streamlinejs/curry';

const arr = [1, 2, 3, 4, 5];
const res = C.mapC((x: number) => x * 2, arr);
console.log(res); // [2, 4, 6, 8, 10]
// mapC with go
import * as C from 'streamlinejs/curry';
import * as _ from 'streamlinejs/strict';

const arr = [1, 2, 3, 4, 5];

_.go<number[]>(
  arr,
  C.mapC((a: number) => a * 2),
  console.log, // [2, 4, 6, 8, 10]
);

reduceC

  • 배열의 각 요소에 대해 주어진 함수를 적용하여 단일 누적 값을 반환하는 커링함수입니다.
import * as C from 'streamlinejs/curry';

const arr = [1, 2, 3, 4, 5];
const res = C.reduceC((acc: number, x: number) => acc + x, 0, arr);

console.log(res); // 15
// reduceC with go
import * as C from 'streamlinejs/curry';
import * as _ from 'streamlinejs/strict';

const arr = [1, 2, 3, 4, 5];

_.go<number>(
  arr,
  C.reduceC((a: number, b: number) => a + b),
  console.log, // 15
);

someC

  • 이터러블에서 적어도 하나의 요소가 주어진 조건을 만족하는지 확인하는 커링함수
import * as C from 'streamlinejs/curry';

const array = [1, 2, 3, 4, 5];

const result = C.someC((element: number) => element % 2 === 0, array);

console.log(result); // true
import * as C from 'streamlinejs/curry';

const array = [1, 2, 3, 4, 5];

const result = C.someC((element: number) => element % 2 === 0)(array);

console.log(result); // true
// someC with go
import * as C from 'streamlinejs/curry';
import * as _ from 'streamlinejs/strict';

const array = [1, 2, 3, 4, 5];

const result = _.go(
  array,
  C.someC((element: number) => element >= 5),
);

console.log(result); // true

takeC

  • 배열의 앞에서부터 지정된 개수만큼 요소를 반환하는 커링함수입니다.
import * as C from 'streamlinejs/curry';

const arr = [1, 2, 3, 4, 5];
const res = C.takeC(3, arr);

console.log(res); // [1, 2, 3]
// takeC with go
import * as C from 'streamlinejs/curry';
import * as _ from 'streamlinejs/strict';

const arr = [1, 2, 3, 4, 5];

_.go<number[]>(arr, C.takeC(3), console.log); // [1, 2, 3]

zipC

  • 동일한 위치에 있는 요소들을 묶어서 튜플로 반환하는 커링함수입니다.
import * as C from 'streamlinejs/curry';

const iter1 = [1, 2, 3];
const iter2 = ['a', 'b', 'c'];

const result = C.zipC(iter1)(iter2);

console.log(result); // [[1, 'a'], [2, 'b'], [3, 'c']]
// zipC with go
import * as C from 'streamlinejs/curry';
import * as _ from 'streamlinejs/strict';

const iter1 = [1, 2, 3];
const iter2 = ['a', 'b', 'c'];

const result = _.go(iter2, C.zipC(iter1));

console.log(result); // [[1, 'a'], [2, 'b'], [3, 'c']]

Usage - Lazy

atL

  • 지연 평가를 사용하여 인덱스가 주어진 값과 일치하는 요소를 반환합니다. 필요한 요소를 평가할 때까지 평가가 지연됩니다.
  • 이터러블/이터레이터를 반환합니다.
import * as L from 'streamlinejs/lazy';

const arr = [1, 2, 3, 4, 5];
const index = 2;

const res = L.atL(index, arr);
const iterator = res[Symbol.iterator]();

console.log([...res]); // [3]
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: undefined, done: true }
import * as L from 'streamlinejs/lazy';

const arr = [1, 2, 3, 4, 5];
const index = -1;
const result = [...L.atL(index, arr)];

console.log(result); // [5]
// atL with go
import * as _ from 'streamlinejs/strict';
import * as L from 'streamlinejs/lazy';

const arr = [1, 2, 3, 4, 5];

const res = _.go<number>(
  arr,
  arr => L.reduceL((a: number, b: number) => a + b, arr),
  arr => L.atL(-1, arr),
  _.takeAll,
);

console.log(res); // [15]

chunkL

  • 주어진 크기로 배열을 나누어 지연 평가된 청크를 반환합니다.
  • 이터러블/이터레이터를 반환합니다.
import * as L from 'streamlinejs/lazy';

const res = L.chunkL(2, [1, 2, 3, 4, 5, 6, 7, 8, 9]);

console.log([...res]); // [[1, 2], [3, 4], [5, 6], [7, 8], [9]]

dropL

  • 처음 n개의 요소를 건너뛰고 나머지 요소를 반환하는 지연 함수입니다.
import * as L from 'streamlinejs/lazy';

const res = L.dropL(2, [1, 2, 3, 4, 5]);

console.log([...res]); // [3, 4, 5]
import * as L from 'streamlinejs/lazy';

const res = L.dropL(10, [1, 2, 3, 4, 5]);

console.log([...res]); // []
import * as L from 'streamlinejs/lazy';

const res = L.dropL(-1, [1, 2, 3, 4, 5]);

console.log([...res]); // [1, 2, 3, 4, 5]
import * as L from 'streamlinejs/lazy';

const res = L.dropL(2, 'hello');

console.log([...res]); // ['l', 'l', 'o']

filterL

  • 조건을 만족하는 요소만을 지연 평가로 반환합니다.
  • 이터러블/이터레이터를 반환합니다.
import * as L from 'streamlinejs/lazy';

const arr = [1, 2, 3, 4, 5];
const res = L.filterL((x: number) => x % 2 === 0, arr);

const iterator = res[Symbol.iterator]();

console.log([...res]); // [2, 4]
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 4, done: false }
console.log(iterator.next()); // { value: undefined, done: true }
// filterL with go
import * as _ from 'streamlinejs/strict';
import * as L from 'streamlinejs/lazy';

const arr = [1, 2, 3, 4, 5];

_.go<number[]>(arr, arr => L.filterL((a: number) => a % 2 === 0, arr), _.takeAll, console.log); // [2, 4]

flatL

  • 중첩된 배열을 평탄화하여 지연 평가로 반환합니다.
  • 이터러블/이터레이터를 반환합니다.
import * as L from 'streamlinejs/lazy';

const arr = [1, [2, 3], [[4], [5, 6]]];
const res = L.flatL<number>(arr);

const iterator = res[Symbol.iterator]();

console.log([...res]); // [1, 2, 3, 4, 5, 6]
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: 4, done: false }
console.log(iterator.next()); // { value: 5, done: false }
console.log(iterator.next()); // { value: 6, done: false }
console.log(iterator.next()); // { value: undefined, done: true }

mapL

  • 각 요소에 주어진 함수를 지연 평가로 적용하여 새로운 요소를 반환합니다.
  • 이터러블/이터레이터를 반환합니다.
import * as L from 'streamlinejs/lazy';

const arr = [1, 2, 3, 4, 5];

const res = L.mapL(x => x * 2, arr);
const iterator = res[Symbol.iterator]();

console.log([...res]); // [2, 4, 6, 8, 10]
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 4, done: false }
console.log(iterator.next()); // { value: 6, done: false }
console.log(iterator.next()); // { value: 8, done: false }
console.log(iterator.next()); // { value: 10, done: false }
console.log(iterator.next()); // { value: undefined, done: true }
// mapL with go

import * as _ from 'streamlinejs/strict';
import * as L from 'streamlinejs/lazy';

const arr = [1, 2, 3, 4, 5];

_.go<number[]>(arr, arr => L.mapL((a: number) => a * 2, arr), _.takeAll, console.log); // [2, 4, 6, 8, 10]

rangeL

  • 주어진 범위의 숫자를 지연 평가로 생성하여 반환합니다.
  • 이터러블/이터레이터를 반환합니다.
import * as L from 'streamlinejs/lazy';

const res = L.rangeL(1, 5);
const iterator = res[Symbol.iterator]();

console.log([...res]); // [ 1, 2, 3, 4, 5 ]
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: 4, done: false }
console.log(iterator.next()); // { value: 5, done: false }
console.log(iterator.next()); // { value: undefined, done: true }
console.log([...L.rangeL(10)]); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
console.log([...L.rangeL(5, 2)]); // [5, 4, 3]
console.log([...L.rangeL(1, 10, 2)]); // [1, 3, 5, 7, 9]
console.log([...L.rangeL(8, 3, 2)]); // [8, 6, 4]
console.log([...L.rangeL(8, 3, -2)]); // [8, 6, 4]

reduceL

  • 배열의 각 요소에 대해 주어진 함수를 지연 평가로 적용하여 단일 누적 값을 반환합니다.
  • 이터러블/이터레이터를 반환합니다.
import * as L from 'streamlinejs/lazy';

const arr = [1, 2, 3, 4, 5];
const res = L.reduceL((acc: number, x: number) => acc + x, 0, arr);
const iterator = res[Symbol.iterator]();

console.log([...res]); // [1, 3, 6, 10, 15]
console.log([...res].at(-1)); // 15

console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: 6, done: false }
console.log(iterator.next()); // { value: 10, done: false }
console.log(iterator.next()); // { value: 15, done: false }
console.log(iterator.next()); // { value: undefined, done: true }

takeL

  • 지연 평가로 배열의 앞에서부터 지정된 개수만큼 요소를 반환합니다.
  • 이터러블/이터레이터를 반환합니다.
import * as L from 'streamlinejs/lazy';

const arr = [1, 2, 3, 4, 5];

const res = L.takeL(2, arr);
const iterator = res[Symbol.iterator]();

console.log([...res]); // [1, 2]
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: undefined, done: true }

zipL

  • 지연 평가로 동일한 위치에 있는 요소들을 묶어서 튜플로 반환합니다.
  • 이터러블/이터레이터를 반환합니다.
import * as L from 'streamlinejs/lazy';

const result = L.zipL([1, 2, 3], ['a', 'b', 'c']);
const iterator = result[Symbol.iterator]();

console.log(iterator.next()); // { value: [1, 'a'], done: false }
console.log(iterator.next()); // { value: [2, 'b'], done: false }
console.log(iterator.next()); // { value: [3, 'c'], done: false }
console.log(iterator.next()); // { value: undefined, done: true }
import * as L from 'streamlinejs/lazy';

const result = L.zipL([1, 2, 3], ['a', 'b', 'c']);

console.log([...result]); // [[1, 'a'], [2, 'b'], [3, 'c']]
import * as L from 'streamlinejs/lazy';

const result = L.zipL([1, 2, 3], ['a', 'b']);

console.log([...result]); // [[1, 'a'], [2, 'b']]

Usage - Strict

Strict 함수는 Lazy 함수를 기반으로 구현됩니다.

at

  • 주어진 배열에서 주어진 인덱스에 있는 요소를 반환합니다. 인덱스가 유효하지 않을 경우 undefined를 반환합니다.
import * as _ from 'streamlinejs/strict';

const iter = [1, 2, 3, 4, 5];
const index = 2;
const result = _.at(index, iter);

console.log(result); // 3
import * as _ from 'streamlinejs/strict';

const arr = [1, 2, 3, 4, 5];
const res = _.go<number>(arr, arr => _.at(-1, arr));

console.log(res); // 5

chunk

  • 주어진 크기로 배열을 나누어 청크를 반환합니다.
import * as _ from 'streamlinejs/strict';

const res = _.chunk(2, [1, 2, 3, 4, 5, 6, 7, 8, 9]);

console.log(res); // [[1, 2], [3, 4], [5, 6], [7, 8], [9]]

concat

  • 주어진 두 이터러블을 하나로 결합합니다.
import * as _ from 'streamlinejs/strict';

const iter1 = [1, 2, 3];
const iter2 = [4, 5, 6];

const result = _.concat(iter1, iter2);

console.log(result); // [1, 2, 3, 4, 5, 6]
import * as _ from 'streamlinejs/strict';

const iter1 = 'hello';
const iter2 = 'world';

const result = _.concat(iter1, iter2);

console.log(result); // ['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd']
import * as _ from 'streamlinejs/strict';

const iter1 = [1, 2, 3];
const iter2 = 'world';

const result = _.concat(iter1, iter2);

console.log(result); // [1, 2, 3, 'w', 'o', 'r', 'l', 'd']

curry

  • 다중 인수를 가진 함수를 단일 인수를 가진 함수의 체인으로 변환합니다.
import * as _ from 'streamlinejs/strict';

const mult = _.curry((a: number, b: number) => a * b);

const twoMult = mult(2);

console.log(twoMult(1)); // 2
console.log(twoMult(2)); // 4
console.log(twoMult(3)); // 6

drop

  • 처음 n개의 요소를 건너뛰고 나머지 요소를 반환하는 함수입니다.
import * as _ from 'streamlinejs/strict';

const res = _.drop(2, [1, 2, 3, 4, 5]);

console.log(res); // [3, 4, 5]
import * as _ from 'streamlinejs/strict';

const res = _.drop(10, [1, 2, 3, 4, 5]);

console.log(res); // []
import * as _ from 'streamlinejs/strict';

const res = _.drop(-1, [1, 2, 3, 4, 5]);

console.log(res); // [1, 2, 3 ,4 ,5]
import * as _ from 'streamlinejs/strict';

const res = _.drop(2, 'hello');

console.log(res); // ['l', 'l', 'o']

every

  • 이터러블의 모든 요소가 주어진 조건을 만족하는지 확인하는 함수
import * as _ from 'streamlinejs/strict';

const array = [1, 2, 3, 4, 5];

const result = _.every((element: number) => element % 2 !== 0, array);

console.log(result); // false
import * as _ from 'streamlinejs/strict';

const array = [1, 2, 3, 4, 5];

const result = _.every((element: number) => element <= 5, array);

console.log(result); // true

filter

  • 주어진 조건을 만족하는 요소만을 반환합니다.
import * as _ from 'streamlinejs/strict';

const arr = [1, 2, 3] as const;

const res = _.filter((a: number) => a > 1, arr);

console.log(res); // [2, 3]

find

  • 주어진 조건을 만족하는 첫번째 요소를 반환합니다.
import * as _ from 'streamlinejs/strict';

const isEven = (n: number) => n % 2 === 0;
const result = _.find(isEven, [1, 2, 3, 4, 5, 6]);

console.log(result); // 2
import * as _ from 'streamlinejs/strict';

const isVowel = (c: string) => 'aeiou'.includes(c);
const result = _.find(isVowel, 'hello');

console.log(result); // 'e'
import * as _ from 'streamlinejs/strict';

const isEven = (n: { value: number }) => n.value % 2 === 0;
const result = _.find(isEven, [{ value: 1 }, { value: 2 }, { value: 3 }]);

console.log(result); // { value: 2 }

findIndex

  • 이터러블에서 주어진 조건을 만족하는 첫 번째 요소의 인덱스를 반환하는 함수
import * as _ from 'streamlinejs/strict';

const array = [5, 12, 8, 130, 44];
const result = _.findIndex(8, array);

console.log(result); // 2
import * as _ from 'streamlinejs/strict';

const array = [5, 12, 8, 130, 44];
const result = _.findIndex(500, array);

console.log(result); // -1
import * as _ from 'streamlinejs/strict';

const string = 'banana';
const result = _.findIndex('n', string);

console.log(result); // 2
import * as _ from 'streamlinejs/strict';

const array = [{ id: 1 }, { id: 2 }, { id: 3 }];
const result = _.findIndex({ id: 2 }, array);

console.log(result); // 1

flat

  • 중첩된 배열을 평탄화하여 단일 배열로 만듭니다.
import * as _ from 'streamlinejs/strict';

const res = _.flat([[], [[]], [[], []], [[], 1], [[2], []], [[], [3]], []]);

console.log(res); // [1, 2, 3]
import * as _ from 'streamlinejs/strict';

const arr = [[1], [2, 3], [4, 5, 6]];

const res = _.go(arr, _.flat);

console.log(res); // [1, 2, 3, 4, 5, 6]

go

  • 함수들을 조합하여 복잡한 로직을 단순하게 구현할 수 있습니다.
import * as _ from 'streamlinejs/strict';

_.go<number>(
  1,
  a => a + 1,
  a => a * 2,
  console.log,
); // 4
import * as _ from 'streamlinejs/strict';

const arr = [1, 2, 3, 4, 5];

const addAndMultiply = _.go<Record<string, number>>(arr, arr =>
  _.reduce((a: Record<string, number>, b: number) => {
    if (typeof a === 'number') return { [a]: a };
    return { ...a, [b]: b };
  }, arr),
);

console.log(addAndMultiply); // { '1': 1, '3': 3, '4': 4, '5': 5 }

join

  • 배열의 모든 요소를 문자열로 변환하고, 주어진 구분자를 사용하여 결합합니다.
import * as _ from 'streamlinejs/strict';

const result = _.join('', [1, 2, 3]);

console.log(result); // '123'
import * as C from 'streamlinejs/curry';
import * as _ from 'streamlinejs/strict';

const obj = { a: 1, b: 2, c: 3 };

const res = _.go(
  Object.entries(obj),
  C.mapC(([k, v]: [string, number]) => `${k}=${v}`),
  arr => _.join('&', arr),
);

console.log(res); // 'a=1&b=2&c=3'

map

  • 배열의 각 요소에 주어진 함수를 적용하여 새로운 배열을 반환합니다.
import * as _ from 'streamlinejs/strict';

const arr = [1, 2, 3] as const;
const res = _.map((a: number) => a + 1, arr);

console.log(res); // [2, 3, 4]

pipe

  • 함수를 조합하여 체인으로 연결하고, 각 함수의 결과를 다음 함수의 입력으로 전달합니다.
import * as _ from 'streamlinejs/strict';

const f = _.pipe<number>(
  (a, b) => a + b,
  a => a + 10,
  a => a + 100,
);

console.log(f(1, 2)); // 113
import * as _ from 'streamlinejs/strict';

const f = _.pipe<number>((a: number[]) => _.reduce((a: number, b: number) => a + b, a));

console.log(f([1, 2, 3, 4, 5])); // 15

range

  • start, stop, step을 받아 숫자 배열을 생성합니다.
import * as _ from 'streamlinejs/strict';

console.log(_.range(1, 10)); // [1, 2, 3, 4, 5, 6, 7, 8, 9]
console.log(_.range(1, 10, 2)); // [1, 3, 5, 7, 9]
console.log(_.range(10, 1, -2)); // [10, 8, 6, 4, 2]

reduce

  • 배열의 각 요소에 대해 주어진 함수를 적용하여 단일 누적 값을 반환합니다.
import * as _ from 'streamlinejs/strict';

const iter = [1, 2, 3, 4, 5] as const;

const result = _.reduce((acc: number, val: number) => acc + val, 0, iter);

console.log(result); // 15
import * as _ from 'streamlinejs/strict';

const iter = [1, 2, 3, 4, 5] as const;

const result = _.reduce((acc: number, val: number) => acc + val, iter);

console.log(result); // 15

some

  • 이터러블에서 적어도 하나의 요소가 주어진 조건을 만족하는지 확인하는 함수
import * as _ from 'streamlinejs/strict';

const array = [1, 2, 3, 4, 5];
const result = _.some(element => element % 2 === 0, array);

console.log(result); // true
import * as _ from 'streamlinejs/strict';

const string = 'hello';
const result = _.some(character => 'aeiou'.includes(character), string);

console.log(result); // true
import * as _ from 'streamlinejs/strict';

const object = [{ value: 1 }, { value: 2 }, { value: 3 }, { value: 4 }, { value: 5 }];

const result = _.some(({ value }) => value > 10, object);

console.log(result); // false

st

  • strict 함수들을 chaining해서 사용할 수 있는 함수
  • st 내부에만 존재하는 to 함수 : 함수를 인자로 받아서 이터러블을 적용합니다.
import * as _ from 'streamlinejs/strict';

const res = _.st([1, 2, 3, 4, 5]).chunk(2).iter; // [[1, 2], [3, 4], [5]]
import * as _ from 'streamlinejs/strict';

const res = _.st([1, 2, 3, 4, 5]).chunk(2).iter; // [[1, 2], [3, 4], [5]]
import * as _ from 'streamlinejs/strict';

const res = _.st([1, 2, 3, 4, 5]).to(iter => [...iter]); // [1, 2, 3, 4, 5]
import * as C from 'streamlinejs/curry';
import * as _ from 'streamlinejs/strict';

const res = _.st(_.range(1, 5))
  .filter(v => v % 2 === 0)
  .map(v => v * 2)
  .to<number[]>(C.mapC((v: number) => v)); // [4, 8]
import * as C from 'streamlinejs/curry';
import * as _ from 'streamlinejs/strict';

const res = _.st(_.range(1, 5))
  .filter(v => v % 2 === 0)
  .map(v => v * 2)
  .to<number>(C.atC(-1)); // 8

take

  • 배열에서 첫 번째부터 지정된 개수만큼의 요소를 가져옵니다.
import * as _ from 'streamlinejs/strict';

_.go(_.range(1, 10), arr => _.take(5, arr), console.log); // [1, 2, 3, 4, 5]

takeAll

  • 배열의 모든 요소를 그대로 반환합니다.
import * as _ from 'streamlinejs/strict';

_.go(_.range(1, 10), arr => _.takeAll(arr), console.log); // [1, 2, 3, 4, 5, 6, 7, 8, 9]

zip

  • 동일한 위치에 있는 요소들을 묶어서 튜플로 반환합니다.
import * as _ from 'streamlinejs/strict';

const res = _.zip([1, 2, 3], ['a', 'b', 'c']);

console.log(res); // [[1, 'a'], [2, 'b'], [3, 'c']]
import * as _ from 'streamlinejs/strict';

const res = _.zip([1, 2, 3], ['a', 'b']);

console.log(res); // [[1, 'a'], [2, 'b']]

License

This project is licensed under the MIT License - see the LICENSE.md file for details.