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

leseq

v1.12.2

Published

Lazy list with high tree-shaking affinity and easy customization.

Downloads

1,097

Readme

npm version

Lazy list(lazy list) with high tree-shaking affinity and easy customization.

Features

  • 🎁 Lazy Collection: The collections are only enumerated to the minimum necessary. Infinite sequences are supported.
  • 🎄 Tree-Shakeable: Only the features you use will be bundled.
  • 👻 Async Iterator Support: Iterable can also be seamlessly treated as Async Iterator.
  • 📎 Easy-Customization: You can easily create the functions you need by yourself. In this way.
  • 🗂 Rxjs-like Syntax: To achieve tree-shaking, we use an rxjs-like syntax.
  • Simple Equality Strategy: It uses a simple Equality Strategy.
  • 💯 All Typed: The whole thing is written in TypeScript, which also provides completion for type conversion between operators.
  • 💨 No dependencies
import {from, map, take} from 'leseq';

const result1 = from([1,2,3,4,5]).pipe(
  map(i => i * i),
  take(3)
).toArray();

//result1: [1,4,9]

This is the result of bundle visualizer in the example above (1.21KB gzipped).

Resource

Advanced

Getting Started

npm install leseq

If you are using Async Iterable and "target " in tsconfig.json is smaller than "es2018", you must add "ES2018.AsyncGenerator " and "ES2018.AsyncIterable " in tsconfig.json/lib or the type will not display properly.

{
  "compilerOptions": {
    "target": "es6",
    "lib": ["DOM", "ES6", "ES2018.AsyncGenerator", "ES2018.AsyncIterable"]
  }
}

Iterable

import {from, map, take, find, range, reverse, filter} from 'leseq';

const result1 = from([1,2,3,4,5]).pipe(
  map(i => i * i),
  take(3)
)

for (const one of result1) {
  console.log(one)
}

//result: 1
//result: 4
//result: 9

const result2 = from([1,2,3,4,5]).pipe(
  filter(i => i % 2 == 0)
).value(
  find(i => i > 2)
);

//result2: 4

//lazy
const result3 = range(1, 10000000).pipe(
  take(3),
  reverse(),
  map((i) => i * i)
).toArray();

//result3: [9,4,1]

Async Iterable

import {from, mapAsync, filterAsync, fromAsAsync, findAsync, asyncSeq} from 'leseq';

const sleep = (milliseconds: number) => new Promise(resolve => setTimeout(resolve,milliseconds));

//from iterable to async iterable.
const result1 = await from([1,2,3,4,5]).to(asyncSeq()).pipe(
  mapAsync(async i => {
    await sleep(1000);
    return i * i;
  }),
  filterAsync(async i => i % 2 == 0)
).toArrayAsync();

//5 seconds later... result1: [4,16]

const result2 = await fromAsAsync([1,2,3,4,5]).pipe(
  mapAsync(async i => {
    await sleep(1000);
    return i * i;
  }),
  filterAsync(async i => i % 2 == 0)
).valueAsync(findAsync());

//2 seconds later... result2: 4

const result3 = await fromConcatAsAsync([1,2],[3,4]).pipe(
  mapAsync(async i => {
    await sleep(1000);
    return i * i;
  }),
);

for await (const one of result3) {
  console.log(one);
}

//1 seconds later... result: 1
//2 seconds later... result: 4
//3 seconds later... result: 9
//4 seconds later... result: 16

Usage

It is possible to generate sequences (Seq<T>/AsyncSeq<T> object) with Generator, convert them to sequences with different characteristics with To, perform operations such as value conversion and filtering with any number of Operators, and convert them to a single value with Value.

// sync iterator
SyncSource = 
  Generators(ex: from, fromConcat, ..etc) | 
  SyncSource.to(To(ex: share, async))
  SyncSource.pipe(
    ...SyncOperators(ex: map, filter, ...etc)
  );

value = SyncSource.value(SyncValues(ex: find,some, ...etc));

// async iterator
AsyncSource = 
  AsyncGenerators(ex: fromAsAsync, fromConcatAsAsync, ...etc) |
  SyncSource.to(asyncSeq()) | // iterable to async iterable. |
  AsyncSource.to(To(ex: shareAsync)) |
  AsyncSource.pipe(
    ...AsyncOperators(ex: mapAsync, filterAsync, ...etc)
  );

value = await AsyncSource.valueAsync(AsyncValues(ex: findAsync,someAsync, ...etc));

Because it is a lazy list, it does not execute processing when pipe()/to() is called, but only when value(valueAsync), toArray(toArrayAsync)/toMutableArray(toMutableArrayAsync), or forEach(forEachAsync) is called.

Changes from "Iterable" or Seq<T> to "Async Iterable" can be made at any time with .to(asyncSeq()). but Once the chain is changed to "Async Iterable" by .to(asyncSeq()) or other means, only the asynchronous version of Operator/Value can be used in the same chain thereafter. This is because, in principle, it is impossible to change from an "Async Iterable" to "Iterable".

The predefined Generators/Operators/To/Values are as follows. And all of them have asynchronous versions(xxxAsAsync or xxxAsync).

If the function you want to use does not exist, you can also define your own Operator/Value function in this way.

Predefined Generators

| Generator | Description | | --- | --- | | defer | Generates a sequence that delays the generation of sources until the actual enumeration is performed. (async version: deferAsAsync ) | | | deferFromPromise | [Async Only] Generates a sequence whose values are the result of sequential execution of a single Promise or multiple Promises; Promise execution is delayed until the sequence is enumerated. | | | deferValue | Generates a sequence that delays the generation of the source until the actual enumeration is performed. the source in deferValue consists of a single value. (async version: deferValueAsAsync ) | | | from | Generates a sequence from an iterable object. (async version: fromAsAsync ) | | | fromConcat | Generates a concatenated sequence of multiple iterable objects. (async version: fromConcatAsAsync ) | | | fromValue | Generates a sequence from a single value. (async version: fromValueAsAsync ) | | | range | Generates a sequential number sequence. (async version: rangeAsAsync ) | | | zip | Generates a sequence of arrays made by concatenating the elements of multiple sequences one at a time. (async version: zipAsAsync ) | |

Predefined To

| To | Description | | --- | --- | | async | Converts the current sequence to AsyncSeq<T> and returns it. | | | share | Converts the current sequence to SharedSeq<T> and returns it; in a SharedSeq<T>, iterator is share until close method is called. (async version: shareAsync ) | |

Predefined Operators

It is used within the pipe method of the Seq<T> object. Any number of operators can be connected.

| Operator | Description | | --- | --- | | catchError | If the original iterable sequence raises an exception, the specified action is performed, terminating the enumeration or enumerating an alternate sequence. (async version: catchErrorAsync ) | | | chunk | Returns a sequence divided into array of the specified size. (async version: chunkAsync ) | | | chunkByAccumulation | Returns a sequence divided into arrays based on an accumulation function and a threshold condition. (async version: chunkByAccumulationAsync ) | | | concat | Returns a sequence in which the current sequence and the specified sequence are concatenated. (async version: concatAsync ) | | | concatValue | Returns the sequence to which the specified value is added. (async version: concatValueAsync ) | | | difference | Returns the sequence that is the difference set between the current sequence and the specified sequence. (async version: differenceAsync ) | | | filter | Returns a sequence that has been filtered by the specified condition. (async version: filterAsync ) | | | finalize | Invokes a specified action after the source iterable sequence terminates normally or exceptionally. (async version: finalizeAsync ) | | | flatten | Returns a flattened sequence. (async version: flattenAsync ) | | | groupBy | Returns a sequence grouped by a specified key. (async version: groupByAsync ) | | | intersect | Returns a sequence that is the product set of the current sequence and the specified sequence. (async version: intersectAsync ) | | | map | Returns the sequence in which each element has been transformed by the specified transformation function. (async version: mapAsync ) | | | orderBy | Returns a sequence sorted by a specified key. (async version: orderByAsync ) | | | repeat | Returns a sequence that repeats the source sequence a specified number of times. (async version: repeatAsync ) | | | reverse | Returns a sequence in reverse order of the current sequence. (async version: reverseAsync ) | | | scan | Returns the resulting sequence after applying the aggregate function to the elements of the current sequence. (async version: scanAsync ) | | | skip | Returns the sequence with the specified number of skips. (async version: skipAsync ) | | | skipWhile | Returns the sequence of elements skipped while matching the condition. (async version: skipWhileAsync ) | | | take | Returns a sequence that enumerates the specified number of items. (async version: takeAsync ) | | | takeWhile | Returns a sequence to be enumerated only while the condition is matched. (async version: takeWhileAsync ) | | | tap | Run side effects. (async version: tapAsync ) | | | union | Returns a sequence that is the union set of the current sequence and the specified sequence. (async version: unionAsync ) | | | uniq | Returns a deduplicated sequence. (async version: uniqAsync ) | | | zipWith | Returns a sequence of arrays consisting of the elements of the source array and the elements of the multiple sequences given as arguments, concatenated one by one. (async version: zipWithAsync ) | |

Predefined Values

Generates a value from a sequence. Used in the value method of the Seq<T> object.

| Value | Description | | --- | --- | | every | Returns whether or not all elements of a sequence meet the specified conditions. (async version: everyAsync ) | | | find | Returns the first element that satisfies the condition. If no element satisfying the condition is found, an error is thrown. (async version: findAsync ) | | | findOrDefault | Returns the first element that satisfies the condition. If no element is found that satisfies the condition, it returns the specified default value. (async version: findOrDefaultAsync ) | | | reduce | Returns the result of applying the aggregate function to the elements of the current sequence. (async version: reduceAsync ) | | | some | Returns whether or not any element of the sequence satisfies the specified condition. (async version: someAsync ) | |