Repository files navigation

Table of Contents

Introducing pipes/utils

The pipesjs/utils module is to web streams what highland.js is to node streams. It contains utility functions to make working with web streams a lot easier. For more about Web Streams, refer to the spec.


About

The utils module is to web streams what highland.js is to node streams. It contains utility functions to make working with web streams a lot easier. Here's more about Web Streams from the spec itself:

Large swathes of the web platform are built on streaming data: that is, data that is created, processed, and consumed in an incremental fashion, without ever reading all of it into memory. The Streams Standard provides a common set of APIs for creating and interfacing with such streaming data, embodied in readable streams, writable streams, and transform streams.

The spec is still evolving but has reached a fairly stable stage with a reference implementation as well. The API has almost been finalized and Streams are coming to the web very soon!

At it's core, the API exposes three major components:

  • ReadableStream encapsulates a source producing values and emits them.
  • TransformStream are essentially { readable, writable} pairs that take a function which can be used to transform the values flowing through it.
  • WritableStream encapsulates a sink that receives values and writes to it.

Streams are essentially data structures that handle sequential flow of values. You can split streams, merge them and connect them together in various ways. What's amazing is that, in most cases, they can handle backpressure automatically, so you don't have to mess with the underlying details.

For further information, the spec is quite informative and easy to read. Jake Archibald also wrote a great blog post on them.

Heads up: If you're coming from node land, web streams are quite a lot different from node streams and incompatible with each other.

Installing

For browsers

The library depends on @pipes/core, so make sure you include it in before including the library.

You can use either of the builds from the dist folder:

<scriptsrc="path/to/web-streams-polyfill.js"></script><scriptsrc="path/to/pipes.utils.js"></script>

And in your code, all the functions will be available on the window.Pipes.utils variable.

let{ uniq, compact }=window.Pipes.utils;

For browserify users

The library has a peer-dependency on @pipes/core, so to install it:

 npm install @pipes/core @pipes/utils

The library is split up into modules, so you can both require the whole library or only parts of it:

let{ compact }=require("@pipes/utils");letcompact=require("@pipes/utils/compact");

For ES6 and Rollup users

If you want, you can directly import the es6 modules like so:

importpipesUtilsfrom"@pipes/utils/src";import{compact}from"@pipes/utils/src";importcompactfrom"@pipes/utils/src/compact";

API Reference

The utils library only consists of the following functions:

Set up code for examples

// SetupletcreateReadable=data=>newReadableStream({start(controller){this.data=data||[1,2,3];// Kickstart streamcontroller.enqueue(this.data.pop());},pull(controller){if(!this.data.length)returncontroller.close()controller.enqueue(this.data.pop());}}),createWritable=()=>newWritableStream({write(chunk){console.log(chunk);}});

batch

This function takes an int n and returns a transform stream that batches the incoming values in arrays of lengths no more than n.

Parameters

Examples

letinput=[1,2,3,4,5],expected=[[1,2],[3,4],[5]];letreadable,writable,res=[];// Create test streamsreadable=createTestReadable(input);writable=createTestWritable(c=>res.push(c));// Connect the streamsconnect(readable,batch(2),writable);// res == expected

Returns TransformStream

compact

This function returns a transform stream that spits out only truthy values from the input stream.

Examples

letreadable,writable,count=0;// Create test streamsreadable=createTestReadable([true,false,0,"","hello",1]);writable=createTestWritable(()=>count++);// Connect the streamsconnect(readable,compact(),writable);// count == 3

Pipe

This function takes an iterable as argument and returns a readable stream that repeatedly emits values generated by the emitter.

Examples

letreadable,writable,values=[1,2,3],sum=0;// Create test streamsreadable=cycle(values);writable=createTestWritable(c=>{sum+=c});// Connect the streamsconstexpected=2*values.reduce((a,b)=>a+b);connect(readable,take(2*values.length),writable);// sum == expected

debounce

This function takes an int n and returns a transform stream that debounces the incoming values by n ms, only producing values with n ms delay between them and dropping the rest.

Parameters

  • waitnumber (optional, default 0)
  • headboolean (optional, default true)

Returns ReadableWritable

drop

This function takes an int n and returns a transform stream that drops the first n values from the input stream.

Parameters

Examples

letreadable,writable,count=0;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(()=>count++);// Connect the streamsconnect(readable,drop(3),writable);// count == 3

Returns ReadableWritable

filter

This function takes a predicate function as argument and returns a transform stream that only emits values that satisfy the predicate.

Parameters

Examples

letreadable,writable;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(c=>assert(c>3));// Connect the streamsconnect(readable,filter(a=>a>3),writable);

Returns ReadableWritable

head

This function returns a transform stream that takes the first value from the input stream and enqueues it on the output stream.

Examples

letreadable,writable,el;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(e=>{el=e;});// Connect the streamsconnect(readable,head(),writable);// el == 1

Returns ReadableWritable

intersperse

This function takes any value a and returns a transform stream that intersperses the values from the input stream with the a.

Parameters

  • valany

Examples

letreadable,writable,res=[];// Create test streamsreadable=createTestReadable([1,2,3]);writable=createTestWritable(c=>res.push(c));// Connect the streamsconnect(readable,intersperse(0),writable);// res == [1,0,2,0,3]

Returns ReadableWritable

last

This function returns a transform stream that takes the last value from the input stream and enqueues it on the output stream.

Examples

letreadable,writable,el;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(e=>{el=e;});// Connect the streamsconnect(readable,last(),writable);// el == 6

Returns ReadableWritable

pick

This function takes any number of strings as arguments and returns a transform stream that extracts the passed property names from incoming values.

Parameters

Examples

letreadable,writable,o={'a': 1,'b': 2};// Create test streamsreadable=createTestReadable([o,o,o]);writable=createTestWritable(c=>assert(c.a)&&assert(!c.b));// Connect the streamsconnect(readable,pick('a'),writable);

Returns ReadableWritable

pluck

This function takes a string as argument and returns a transform stream that extracts the passed property from incoming values.

Parameters

Examples

letreadable,writable,o={'a': 1,'b': 2};// Create test streamsreadable=createTestReadable([o,o,o]);writable=createTestWritable(c=>assert(c==1));// Connect the streamsconnect(readable,pluck('a'),writable);

Returns ReadableWritable

repeat

This function takes a value as argument and returns a readable stream that repeatedly emits that value.

Parameters

  • valueany

Examples

letreadable,writable,val=1,len=6,sum=0;// Create test streamsreadable=repeat(val);writable=createTestWritable(c=>{sum+=c});// Connect the streamsconnect(readable,take(len),writable);// sum == (val * len)

Returns ReadableWritable

scan

This function takes a reducer function and an optional init value as arguments and returns a transform stream that applies the function to the incoming values and enqueues the accumulation of the results.

If an init value is not passed, the first incoming value is treated as one.

Parameters

  • funcfunction ((T2? | T1?), T1?): T2
  • initT1?

Examples

letreadable,writable,res;// Create test streamsreadable=createTestReadable([1,2,3]);writable=createTestWritable(c=>{// Check last element is numberletn=c[c.length-1];assert(n===+n);res=c;});// Connect the streamsconnect(readable,scan(add,0),writable);// res[res.length-1], [1,2,3].reduce( add )

Returns ReadableWritable

slice

This function takes an int m and an int n and returns a transform stream that drops the first m values and takes the next (m-n) values from the input stream.

Parameters

Examples

letreadable,writable,count=0;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(()=>count++);// Connect the streamsconnect(readable,slice(2,5),writable);// count == 3

Returns ReadableWritable

take

This function takes an int n and returns a transform stream that takes the first n values from the input stream.

Parameters

Examples

letreadable,writable,count=0;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(()=>count++);// Connect the streamsconnect(readable,take(3),writable);// count == 3

Returns ReadableWritable

tap

This function takes a function as rgument and returns a transform stream that applies the function to the incoming values before re-emitting them.

Parameters

  • funcanyFn

Examples

letreadable,writable;// Create test streamsreadable=createTestReadable([1,2,3]);writable=createTestWritable(c=>assert(!Number.isNaN(c*1)));// Connect the streamsconnect(readable,tap(console.log.bind(console)),writable);

Returns ReadableWritable

throttle

This function takes an int n and returns a transform stream that throttles the incoming values by n ms, only producing values every n ms and dropping the rest.

Parameters

  • intervalnumber (optional, default 0)
  • headboolean (optional, default true)

Returns TransformStream

uniq

This function returns a transform stream that keeps only unique values from the input stream and enqueues it on the output stream.

Examples

letreadable,writable,res=[];// Create test streamsreadable=createTestReadable([1,1,2,2,3,3]);writable=createTestWritable(c=>res.push(c));// Connect the streamsconnect(readable,uniq(),writable);// res == [1,2,3]

Returns ReadableWritable

About

Bunch of utilities for working with web streams

Resources

Contributing

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Table of Contents

Introducing pipes/utils

The pipesjs/utils module is to web streams what highland.js is to node streams. It contains utility functions to make working with web streams a lot easier. For more about Web Streams, refer to the spec.


About

The utils module is to web streams what highland.js is to node streams. It contains utility functions to make working with web streams a lot easier. Here's more about Web Streams from the spec itself:

Large swathes of the web platform are built on streaming data: that is, data that is created, processed, and consumed in an incremental fashion, without ever reading all of it into memory. The Streams Standard provides a common set of APIs for creating and interfacing with such streaming data, embodied in readable streams, writable streams, and transform streams.

The spec is still evolving but has reached a fairly stable stage with a reference implementation as well. The API has almost been finalized and Streams are coming to the web very soon!

At it's core, the API exposes three major components:

  • ReadableStream encapsulates a source producing values and emits them.
  • TransformStream are essentially { readable, writable} pairs that take a function which can be used to transform the values flowing through it.
  • WritableStream encapsulates a sink that receives values and writes to it.

Streams are essentially data structures that handle sequential flow of values. You can split streams, merge them and connect them together in various ways. What's amazing is that, in most cases, they can handle backpressure automatically, so you don't have to mess with the underlying details.

For further information, the spec is quite informative and easy to read. Jake Archibald also wrote a great blog post on them.

Heads up: If you're coming from node land, web streams are quite a lot different from node streams and incompatible with each other.

Installing

For browsers

The library depends on @pipes/core, so make sure you include it in before including the library.

You can use either of the builds from the dist folder:

<scriptsrc="path/to/web-streams-polyfill.js"></script><scriptsrc="path/to/pipes.utils.js"></script>

And in your code, all the functions will be available on the window.Pipes.utils variable.

let{ uniq, compact }=window.Pipes.utils;

For browserify users

The library has a peer-dependency on @pipes/core, so to install it:

 npm install @pipes/core @pipes/utils

The library is split up into modules, so you can both require the whole library or only parts of it:

let{ compact }=require("@pipes/utils");letcompact=require("@pipes/utils/compact");

For ES6 and Rollup users

If you want, you can directly import the es6 modules like so:

importpipesUtilsfrom"@pipes/utils/src";import{compact}from"@pipes/utils/src";importcompactfrom"@pipes/utils/src/compact";

API Reference

The utils library only consists of the following functions:

Set up code for examples

// SetupletcreateReadable=data=>newReadableStream({start(controller){this.data=data||[1,2,3];// Kickstart streamcontroller.enqueue(this.data.pop());},pull(controller){if(!this.data.length)returncontroller.close()controller.enqueue(this.data.pop());}}),createWritable=()=>newWritableStream({write(chunk){console.log(chunk);}});

batch

This function takes an int n and returns a transform stream that batches the incoming values in arrays of lengths no more than n.

Parameters

Examples

letinput=[1,2,3,4,5],expected=[[1,2],[3,4],[5]];letreadable,writable,res=[];// Create test streamsreadable=createTestReadable(input);writable=createTestWritable(c=>res.push(c));// Connect the streamsconnect(readable,batch(2),writable);// res == expected

Returns TransformStream

compact

This function returns a transform stream that spits out only truthy values from the input stream.

Examples

letreadable,writable,count=0;// Create test streamsreadable=createTestReadable([true,false,0,"","hello",1]);writable=createTestWritable(()=>count++);// Connect the streamsconnect(readable,compact(),writable);// count == 3

Pipe

This function takes an iterable as argument and returns a readable stream that repeatedly emits values generated by the emitter.

Examples

letreadable,writable,values=[1,2,3],sum=0;// Create test streamsreadable=cycle(values);writable=createTestWritable(c=>{sum+=c});// Connect the streamsconstexpected=2*values.reduce((a,b)=>a+b);connect(readable,take(2*values.length),writable);// sum == expected

debounce

This function takes an int n and returns a transform stream that debounces the incoming values by n ms, only producing values with n ms delay between them and dropping the rest.

Parameters

  • waitnumber (optional, default 0)
  • headboolean (optional, default true)

Returns ReadableWritable

drop

This function takes an int n and returns a transform stream that drops the first n values from the input stream.

Parameters

Examples

letreadable,writable,count=0;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(()=>count++);// Connect the streamsconnect(readable,drop(3),writable);// count == 3

Returns ReadableWritable

filter

This function takes a predicate function as argument and returns a transform stream that only emits values that satisfy the predicate.

Parameters

Examples

letreadable,writable;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(c=>assert(c>3));// Connect the streamsconnect(readable,filter(a=>a>3),writable);

Returns ReadableWritable

head

This function returns a transform stream that takes the first value from the input stream and enqueues it on the output stream.

Examples

letreadable,writable,el;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(e=>{el=e;});// Connect the streamsconnect(readable,head(),writable);// el == 1

Returns ReadableWritable

intersperse

This function takes any value a and returns a transform stream that intersperses the values from the input stream with the a.

Parameters

  • valany

Examples

letreadable,writable,res=[];// Create test streamsreadable=createTestReadable([1,2,3]);writable=createTestWritable(c=>res.push(c));// Connect the streamsconnect(readable,intersperse(0),writable);// res == [1,0,2,0,3]

Returns ReadableWritable

last

This function returns a transform stream that takes the last value from the input stream and enqueues it on the output stream.

Examples

letreadable,writable,el;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(e=>{el=e;});// Connect the streamsconnect(readable,last(),writable);// el == 6

Returns ReadableWritable

pick

This function takes any number of strings as arguments and returns a transform stream that extracts the passed property names from incoming values.

Parameters

Examples

letreadable,writable,o={'a': 1,'b': 2};// Create test streamsreadable=createTestReadable([o,o,o]);writable=createTestWritable(c=>assert(c.a)&&assert(!c.b));// Connect the streamsconnect(readable,pick('a'),writable);

Returns ReadableWritable

pluck

This function takes a string as argument and returns a transform stream that extracts the passed property from incoming values.

Parameters

Examples

letreadable,writable,o={'a': 1,'b': 2};// Create test streamsreadable=createTestReadable([o,o,o]);writable=createTestWritable(c=>assert(c==1));// Connect the streamsconnect(readable,pluck('a'),writable);

Returns ReadableWritable

repeat

This function takes a value as argument and returns a readable stream that repeatedly emits that value.

Parameters

  • valueany

Examples

letreadable,writable,val=1,len=6,sum=0;// Create test streamsreadable=repeat(val);writable=createTestWritable(c=>{sum+=c});// Connect the streamsconnect(readable,take(len),writable);// sum == (val * len)

Returns ReadableWritable

scan

This function takes a reducer function and an optional init value as arguments and returns a transform stream that applies the function to the incoming values and enqueues the accumulation of the results.

If an init value is not passed, the first incoming value is treated as one.

Parameters

  • funcfunction ((T2? | T1?), T1?): T2
  • initT1?

Examples

letreadable,writable,res;// Create test streamsreadable=createTestReadable([1,2,3]);writable=createTestWritable(c=>{// Check last element is numberletn=c[c.length-1];assert(n===+n);res=c;});// Connect the streamsconnect(readable,scan(add,0),writable);// res[res.length-1], [1,2,3].reduce( add )

Returns ReadableWritable

slice

This function takes an int m and an int n and returns a transform stream that drops the first m values and takes the next (m-n) values from the input stream.

Parameters

Examples

letreadable,writable,count=0;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(()=>count++);// Connect the streamsconnect(readable,slice(2,5),writable);// count == 3

Returns ReadableWritable

take

This function takes an int n and returns a transform stream that takes the first n values from the input stream.

Parameters

Examples

letreadable,writable,count=0;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(()=>count++);// Connect the streamsconnect(readable,take(3),writable);// count == 3

Returns ReadableWritable

tap

This function takes a function as rgument and returns a transform stream that applies the function to the incoming values before re-emitting them.

Parameters

  • funcanyFn

Examples

letreadable,writable;// Create test streamsreadable=createTestReadable([1,2,3]);writable=createTestWritable(c=>assert(!Number.isNaN(c*1)));// Connect the streamsconnect(readable,tap(console.log.bind(console)),writable);

Returns ReadableWritable

throttle

This function takes an int n and returns a transform stream that throttles the incoming values by n ms, only producing values every n ms and dropping the rest.

Parameters

  • intervalnumber (optional, default 0)
  • headboolean (optional, default true)

Returns TransformStream

uniq

This function returns a transform stream that keeps only unique values from the input stream and enqueues it on the output stream.

Examples

letreadable,writable,res=[];// Create test streamsreadable=createTestReadable([1,1,2,2,3,3]);writable=createTestWritable(c=>res.push(c));// Connect the streamsconnect(readable,uniq(),writable);// res == [1,2,3]

Returns ReadableWritable

About

Bunch of utilities for working with web streams

Resources

Contributing

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Table of Contents

Introducing pipes/utils

The pipesjs/utils module is to web streams what highland.js is to node streams. It contains utility functions to make working with web streams a lot easier. For more about Web Streams, refer to the spec.


About

The utils module is to web streams what highland.js is to node streams. It contains utility functions to make working with web streams a lot easier. Here's more about Web Streams from the spec itself:

Large swathes of the web platform are built on streaming data: that is, data that is created, processed, and consumed in an incremental fashion, without ever reading all of it into memory. The Streams Standard provides a common set of APIs for creating and interfacing with such streaming data, embodied in readable streams, writable streams, and transform streams.

The spec is still evolving but has reached a fairly stable stage with a reference implementation as well. The API has almost been finalized and Streams are coming to the web very soon!

At it's core, the API exposes three major components:

  • ReadableStream encapsulates a source producing values and emits them.
  • TransformStream are essentially { readable, writable} pairs that take a function which can be used to transform the values flowing through it.
  • WritableStream encapsulates a sink that receives values and writes to it.

Streams are essentially data structures that handle sequential flow of values. You can split streams, merge them and connect them together in various ways. What's amazing is that, in most cases, they can handle backpressure automatically, so you don't have to mess with the underlying details.

For further information, the spec is quite informative and easy to read. Jake Archibald also wrote a great blog post on them.

Heads up: If you're coming from node land, web streams are quite a lot different from node streams and incompatible with each other.

Installing

For browsers

The library depends on @pipes/core, so make sure you include it in before including the library.

You can use either of the builds from the dist folder:

<scriptsrc="path/to/web-streams-polyfill.js"></script><scriptsrc="path/to/pipes.utils.js"></script>

And in your code, all the functions will be available on the window.Pipes.utils variable.

let{ uniq, compact }=window.Pipes.utils;

For browserify users

The library has a peer-dependency on @pipes/core, so to install it:

 npm install @pipes/core @pipes/utils

The library is split up into modules, so you can both require the whole library or only parts of it:

let{ compact }=require("@pipes/utils");letcompact=require("@pipes/utils/compact");

For ES6 and Rollup users

If you want, you can directly import the es6 modules like so:

importpipesUtilsfrom"@pipes/utils/src";import{compact}from"@pipes/utils/src";importcompactfrom"@pipes/utils/src/compact";

API Reference

The utils library only consists of the following functions:

Set up code for examples

// SetupletcreateReadable=data=>newReadableStream({start(controller){this.data=data||[1,2,3];// Kickstart streamcontroller.enqueue(this.data.pop());},pull(controller){if(!this.data.length)returncontroller.close()controller.enqueue(this.data.pop());}}),createWritable=()=>newWritableStream({write(chunk){console.log(chunk);}});

batch

This function takes an int n and returns a transform stream that batches the incoming values in arrays of lengths no more than n.

Parameters

Examples

letinput=[1,2,3,4,5],expected=[[1,2],[3,4],[5]];letreadable,writable,res=[];// Create test streamsreadable=createTestReadable(input);writable=createTestWritable(c=>res.push(c));// Connect the streamsconnect(readable,batch(2),writable);// res == expected

Returns TransformStream

compact

This function returns a transform stream that spits out only truthy values from the input stream.

Examples

letreadable,writable,count=0;// Create test streamsreadable=createTestReadable([true,false,0,"","hello",1]);writable=createTestWritable(()=>count++);// Connect the streamsconnect(readable,compact(),writable);// count == 3

Pipe

This function takes an iterable as argument and returns a readable stream that repeatedly emits values generated by the emitter.

Examples

letreadable,writable,values=[1,2,3],sum=0;// Create test streamsreadable=cycle(values);writable=createTestWritable(c=>{sum+=c});// Connect the streamsconstexpected=2*values.reduce((a,b)=>a+b);connect(readable,take(2*values.length),writable);// sum == expected

debounce

This function takes an int n and returns a transform stream that debounces the incoming values by n ms, only producing values with n ms delay between them and dropping the rest.

Parameters

  • waitnumber (optional, default 0)
  • headboolean (optional, default true)

Returns ReadableWritable

drop

This function takes an int n and returns a transform stream that drops the first n values from the input stream.

Parameters

Examples

letreadable,writable,count=0;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(()=>count++);// Connect the streamsconnect(readable,drop(3),writable);// count == 3

Returns ReadableWritable

filter

This function takes a predicate function as argument and returns a transform stream that only emits values that satisfy the predicate.

Parameters

Examples

letreadable,writable;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(c=>assert(c>3));// Connect the streamsconnect(readable,filter(a=>a>3),writable);

Returns ReadableWritable

head

This function returns a transform stream that takes the first value from the input stream and enqueues it on the output stream.

Examples

letreadable,writable,el;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(e=>{el=e;});// Connect the streamsconnect(readable,head(),writable);// el == 1

Returns ReadableWritable

intersperse

This function takes any value a and returns a transform stream that intersperses the values from the input stream with the a.

Parameters

  • valany

Examples

letreadable,writable,res=[];// Create test streamsreadable=createTestReadable([1,2,3]);writable=createTestWritable(c=>res.push(c));// Connect the streamsconnect(readable,intersperse(0),writable);// res == [1,0,2,0,3]

Returns ReadableWritable

last

This function returns a transform stream that takes the last value from the input stream and enqueues it on the output stream.

Examples

letreadable,writable,el;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(e=>{el=e;});// Connect the streamsconnect(readable,last(),writable);// el == 6

Returns ReadableWritable

pick

This function takes any number of strings as arguments and returns a transform stream that extracts the passed property names from incoming values.

Parameters

Examples

letreadable,writable,o={'a': 1,'b': 2};// Create test streamsreadable=createTestReadable([o,o,o]);writable=createTestWritable(c=>assert(c.a)&&assert(!c.b));// Connect the streamsconnect(readable,pick('a'),writable);

Returns ReadableWritable

pluck

This function takes a string as argument and returns a transform stream that extracts the passed property from incoming values.

Parameters

Examples

letreadable,writable,o={'a': 1,'b': 2};// Create test streamsreadable=createTestReadable([o,o,o]);writable=createTestWritable(c=>assert(c==1));// Connect the streamsconnect(readable,pluck('a'),writable);

Returns ReadableWritable

repeat

This function takes a value as argument and returns a readable stream that repeatedly emits that value.

Parameters

  • valueany

Examples

letreadable,writable,val=1,len=6,sum=0;// Create test streamsreadable=repeat(val);writable=createTestWritable(c=>{sum+=c});// Connect the streamsconnect(readable,take(len),writable);// sum == (val * len)

Returns ReadableWritable

scan

This function takes a reducer function and an optional init value as arguments and returns a transform stream that applies the function to the incoming values and enqueues the accumulation of the results.

If an init value is not passed, the first incoming value is treated as one.

Parameters

  • funcfunction ((T2? | T1?), T1?): T2
  • initT1?

Examples

letreadable,writable,res;// Create test streamsreadable=createTestReadable([1,2,3]);writable=createTestWritable(c=>{// Check last element is numberletn=c[c.length-1];assert(n===+n);res=c;});// Connect the streamsconnect(readable,scan(add,0),writable);// res[res.length-1], [1,2,3].reduce( add )

Returns ReadableWritable

slice

This function takes an int m and an int n and returns a transform stream that drops the first m values and takes the next (m-n) values from the input stream.

Parameters

Examples

letreadable,writable,count=0;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(()=>count++);// Connect the streamsconnect(readable,slice(2,5),writable);// count == 3

Returns ReadableWritable

take

This function takes an int n and returns a transform stream that takes the first n values from the input stream.

Parameters

Examples

letreadable,writable,count=0;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(()=>count++);// Connect the streamsconnect(readable,take(3),writable);// count == 3

Returns ReadableWritable

tap

This function takes a function as rgument and returns a transform stream that applies the function to the incoming values before re-emitting them.

Parameters

  • funcanyFn

Examples

letreadable,writable;// Create test streamsreadable=createTestReadable([1,2,3]);writable=createTestWritable(c=>assert(!Number.isNaN(c*1)));// Connect the streamsconnect(readable,tap(console.log.bind(console)),writable);

Returns ReadableWritable

throttle

This function takes an int n and returns a transform stream that throttles the incoming values by n ms, only producing values every n ms and dropping the rest.

Parameters

  • intervalnumber (optional, default 0)
  • headboolean (optional, default true)

Returns TransformStream

uniq

This function returns a transform stream that keeps only unique values from the input stream and enqueues it on the output stream.

Examples

letreadable,writable,res=[];// Create test streamsreadable=createTestReadable([1,1,2,2,3,3]);writable=createTestWritable(c=>res.push(c));// Connect the streamsconnect(readable,uniq(),writable);// res == [1,2,3]

Returns ReadableWritable

About

Bunch of utilities for working with web streams

Resources

Contributing

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Table of Contents

Introducing pipes/utils

The pipesjs/utils module is to web streams what highland.js is to node streams. It contains utility functions to make working with web streams a lot easier. For more about Web Streams, refer to the spec.


About

The utils module is to web streams what highland.js is to node streams. It contains utility functions to make working with web streams a lot easier. Here's more about Web Streams from the spec itself:

Large swathes of the web platform are built on streaming data: that is, data that is created, processed, and consumed in an incremental fashion, without ever reading all of it into memory. The Streams Standard provides a common set of APIs for creating and interfacing with such streaming data, embodied in readable streams, writable streams, and transform streams.

The spec is still evolving but has reached a fairly stable stage with a reference implementation as well. The API has almost been finalized and Streams are coming to the web very soon!

At it's core, the API exposes three major components:

  • ReadableStream encapsulates a source producing values and emits them.
  • TransformStream are essentially { readable, writable} pairs that take a function which can be used to transform the values flowing through it.
  • WritableStream encapsulates a sink that receives values and writes to it.

Streams are essentially data structures that handle sequential flow of values. You can split streams, merge them and connect them together in various ways. What's amazing is that, in most cases, they can handle backpressure automatically, so you don't have to mess with the underlying details.

For further information, the spec is quite informative and easy to read. Jake Archibald also wrote a great blog post on them.

Heads up: If you're coming from node land, web streams are quite a lot different from node streams and incompatible with each other.

Installing

For browsers

The library depends on @pipes/core, so make sure you include it in before including the library.

You can use either of the builds from the dist folder:

<scriptsrc="path/to/web-streams-polyfill.js"></script><scriptsrc="path/to/pipes.utils.js"></script>

And in your code, all the functions will be available on the window.Pipes.utils variable.

let{ uniq, compact }=window.Pipes.utils;

For browserify users

The library has a peer-dependency on @pipes/core, so to install it:

 npm install @pipes/core @pipes/utils

The library is split up into modules, so you can both require the whole library or only parts of it:

let{ compact }=require("@pipes/utils");letcompact=require("@pipes/utils/compact");

For ES6 and Rollup users

If you want, you can directly import the es6 modules like so:

importpipesUtilsfrom"@pipes/utils/src";import{compact}from"@pipes/utils/src";importcompactfrom"@pipes/utils/src/compact";

API Reference

The utils library only consists of the following functions:

Set up code for examples

// SetupletcreateReadable=data=>newReadableStream({start(controller){this.data=data||[1,2,3];// Kickstart streamcontroller.enqueue(this.data.pop());},pull(controller){if(!this.data.length)returncontroller.close()controller.enqueue(this.data.pop());}}),createWritable=()=>newWritableStream({write(chunk){console.log(chunk);}});

batch

This function takes an int n and returns a transform stream that batches the incoming values in arrays of lengths no more than n.

Parameters

Examples

letinput=[1,2,3,4,5],expected=[[1,2],[3,4],[5]];letreadable,writable,res=[];// Create test streamsreadable=createTestReadable(input);writable=createTestWritable(c=>res.push(c));// Connect the streamsconnect(readable,batch(2),writable);// res == expected

Returns TransformStream

compact

This function returns a transform stream that spits out only truthy values from the input stream.

Examples

letreadable,writable,count=0;// Create test streamsreadable=createTestReadable([true,false,0,"","hello",1]);writable=createTestWritable(()=>count++);// Connect the streamsconnect(readable,compact(),writable);// count == 3

Pipe

This function takes an iterable as argument and returns a readable stream that repeatedly emits values generated by the emitter.

Examples

letreadable,writable,values=[1,2,3],sum=0;// Create test streamsreadable=cycle(values);writable=createTestWritable(c=>{sum+=c});// Connect the streamsconstexpected=2*values.reduce((a,b)=>a+b);connect(readable,take(2*values.length),writable);// sum == expected

debounce

This function takes an int n and returns a transform stream that debounces the incoming values by n ms, only producing values with n ms delay between them and dropping the rest.

Parameters

  • waitnumber (optional, default 0)
  • headboolean (optional, default true)

Returns ReadableWritable

drop

This function takes an int n and returns a transform stream that drops the first n values from the input stream.

Parameters

Examples

letreadable,writable,count=0;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(()=>count++);// Connect the streamsconnect(readable,drop(3),writable);// count == 3

Returns ReadableWritable

filter

This function takes a predicate function as argument and returns a transform stream that only emits values that satisfy the predicate.

Parameters

Examples

letreadable,writable;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(c=>assert(c>3));// Connect the streamsconnect(readable,filter(a=>a>3),writable);

Returns ReadableWritable

head

This function returns a transform stream that takes the first value from the input stream and enqueues it on the output stream.

Examples

letreadable,writable,el;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(e=>{el=e;});// Connect the streamsconnect(readable,head(),writable);// el == 1

Returns ReadableWritable

intersperse

This function takes any value a and returns a transform stream that intersperses the values from the input stream with the a.

Parameters

  • valany

Examples

letreadable,writable,res=[];// Create test streamsreadable=createTestReadable([1,2,3]);writable=createTestWritable(c=>res.push(c));// Connect the streamsconnect(readable,intersperse(0),writable);// res == [1,0,2,0,3]

Returns ReadableWritable

last

This function returns a transform stream that takes the last value from the input stream and enqueues it on the output stream.

Examples

letreadable,writable,el;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(e=>{el=e;});// Connect the streamsconnect(readable,last(),writable);// el == 6

Returns ReadableWritable

pick

This function takes any number of strings as arguments and returns a transform stream that extracts the passed property names from incoming values.

Parameters

Examples

letreadable,writable,o={'a': 1,'b': 2};// Create test streamsreadable=createTestReadable([o,o,o]);writable=createTestWritable(c=>assert(c.a)&&assert(!c.b));// Connect the streamsconnect(readable,pick('a'),writable);

Returns ReadableWritable

pluck

This function takes a string as argument and returns a transform stream that extracts the passed property from incoming values.

Parameters

Examples

letreadable,writable,o={'a': 1,'b': 2};// Create test streamsreadable=createTestReadable([o,o,o]);writable=createTestWritable(c=>assert(c==1));// Connect the streamsconnect(readable,pluck('a'),writable);

Returns ReadableWritable

repeat

This function takes a value as argument and returns a readable stream that repeatedly emits that value.

Parameters

  • valueany

Examples

letreadable,writable,val=1,len=6,sum=0;// Create test streamsreadable=repeat(val);writable=createTestWritable(c=>{sum+=c});// Connect the streamsconnect(readable,take(len),writable);// sum == (val * len)

Returns ReadableWritable

scan

This function takes a reducer function and an optional init value as arguments and returns a transform stream that applies the function to the incoming values and enqueues the accumulation of the results.

If an init value is not passed, the first incoming value is treated as one.

Parameters

  • funcfunction ((T2? | T1?), T1?): T2
  • initT1?

Examples

letreadable,writable,res;// Create test streamsreadable=createTestReadable([1,2,3]);writable=createTestWritable(c=>{// Check last element is numberletn=c[c.length-1];assert(n===+n);res=c;});// Connect the streamsconnect(readable,scan(add,0),writable);// res[res.length-1], [1,2,3].reduce( add )

Returns ReadableWritable

slice

This function takes an int m and an int n and returns a transform stream that drops the first m values and takes the next (m-n) values from the input stream.

Parameters

Examples

letreadable,writable,count=0;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(()=>count++);// Connect the streamsconnect(readable,slice(2,5),writable);// count == 3

Returns ReadableWritable

take

This function takes an int n and returns a transform stream that takes the first n values from the input stream.

Parameters

Examples

letreadable,writable,count=0;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(()=>count++);// Connect the streamsconnect(readable,take(3),writable);// count == 3

Returns ReadableWritable

tap

This function takes a function as rgument and returns a transform stream that applies the function to the incoming values before re-emitting them.

Parameters

  • funcanyFn

Examples

letreadable,writable;// Create test streamsreadable=createTestReadable([1,2,3]);writable=createTestWritable(c=>assert(!Number.isNaN(c*1)));// Connect the streamsconnect(readable,tap(console.log.bind(console)),writable);

Returns ReadableWritable

throttle

This function takes an int n and returns a transform stream that throttles the incoming values by n ms, only producing values every n ms and dropping the rest.

Parameters

  • intervalnumber (optional, default 0)
  • headboolean (optional, default true)

Returns TransformStream

uniq

This function returns a transform stream that keeps only unique values from the input stream and enqueues it on the output stream.

Examples

letreadable,writable,res=[];// Create test streamsreadable=createTestReadable([1,1,2,2,3,3]);writable=createTestWritable(c=>res.push(c));// Connect the streamsconnect(readable,uniq(),writable);// res == [1,2,3]

Returns ReadableWritable

About

Bunch of utilities for working with web streams

Resources

Contributing

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Table of Contents

Introducing pipes/utils

The pipesjs/utils module is to web streams what highland.js is to node streams. It contains utility functions to make working with web streams a lot easier. For more about Web Streams, refer to the spec.


About

The utils module is to web streams what highland.js is to node streams. It contains utility functions to make working with web streams a lot easier. Here's more about Web Streams from the spec itself:

Large swathes of the web platform are built on streaming data: that is, data that is created, processed, and consumed in an incremental fashion, without ever reading all of it into memory. The Streams Standard provides a common set of APIs for creating and interfacing with such streaming data, embodied in readable streams, writable streams, and transform streams.

The spec is still evolving but has reached a fairly stable stage with a reference implementation as well. The API has almost been finalized and Streams are coming to the web very soon!

At it's core, the API exposes three major components:

  • ReadableStream encapsulates a source producing values and emits them.
  • TransformStream are essentially { readable, writable} pairs that take a function which can be used to transform the values flowing through it.
  • WritableStream encapsulates a sink that receives values and writes to it.

Streams are essentially data structures that handle sequential flow of values. You can split streams, merge them and connect them together in various ways. What's amazing is that, in most cases, they can handle backpressure automatically, so you don't have to mess with the underlying details.

For further information, the spec is quite informative and easy to read. Jake Archibald also wrote a great blog post on them.

Heads up: If you're coming from node land, web streams are quite a lot different from node streams and incompatible with each other.

Installing

For browsers

The library depends on @pipes/core, so make sure you include it in before including the library.

You can use either of the builds from the dist folder:

<scriptsrc="path/to/web-streams-polyfill.js"></script><scriptsrc="path/to/pipes.utils.js"></script>

And in your code, all the functions will be available on the window.Pipes.utils variable.

let{ uniq, compact }=window.Pipes.utils;

For browserify users

The library has a peer-dependency on @pipes/core, so to install it:

 npm install @pipes/core @pipes/utils

The library is split up into modules, so you can both require the whole library or only parts of it:

let{ compact }=require("@pipes/utils");letcompact=require("@pipes/utils/compact");

For ES6 and Rollup users

If you want, you can directly import the es6 modules like so:

importpipesUtilsfrom"@pipes/utils/src";import{compact}from"@pipes/utils/src";importcompactfrom"@pipes/utils/src/compact";

API Reference

The utils library only consists of the following functions:

Set up code for examples

// SetupletcreateReadable=data=>newReadableStream({start(controller){this.data=data||[1,2,3];// Kickstart streamcontroller.enqueue(this.data.pop());},pull(controller){if(!this.data.length)returncontroller.close()controller.enqueue(this.data.pop());}}),createWritable=()=>newWritableStream({write(chunk){console.log(chunk);}});

batch

This function takes an int n and returns a transform stream that batches the incoming values in arrays of lengths no more than n.

Parameters

Examples

letinput=[1,2,3,4,5],expected=[[1,2],[3,4],[5]];letreadable,writable,res=[];// Create test streamsreadable=createTestReadable(input);writable=createTestWritable(c=>res.push(c));// Connect the streamsconnect(readable,batch(2),writable);// res == expected

Returns TransformStream

compact

This function returns a transform stream that spits out only truthy values from the input stream.

Examples

letreadable,writable,count=0;// Create test streamsreadable=createTestReadable([true,false,0,"","hello",1]);writable=createTestWritable(()=>count++);// Connect the streamsconnect(readable,compact(),writable);// count == 3

Pipe

This function takes an iterable as argument and returns a readable stream that repeatedly emits values generated by the emitter.

Examples

letreadable,writable,values=[1,2,3],sum=0;// Create test streamsreadable=cycle(values);writable=createTestWritable(c=>{sum+=c});// Connect the streamsconstexpected=2*values.reduce((a,b)=>a+b);connect(readable,take(2*values.length),writable);// sum == expected

debounce

This function takes an int n and returns a transform stream that debounces the incoming values by n ms, only producing values with n ms delay between them and dropping the rest.

Parameters

  • waitnumber (optional, default 0)
  • headboolean (optional, default true)

Returns ReadableWritable

drop

This function takes an int n and returns a transform stream that drops the first n values from the input stream.

Parameters

Examples

letreadable,writable,count=0;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(()=>count++);// Connect the streamsconnect(readable,drop(3),writable);// count == 3

Returns ReadableWritable

filter

This function takes a predicate function as argument and returns a transform stream that only emits values that satisfy the predicate.

Parameters

Examples

letreadable,writable;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(c=>assert(c>3));// Connect the streamsconnect(readable,filter(a=>a>3),writable);

Returns ReadableWritable

head

This function returns a transform stream that takes the first value from the input stream and enqueues it on the output stream.

Examples

letreadable,writable,el;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(e=>{el=e;});// Connect the streamsconnect(readable,head(),writable);// el == 1

Returns ReadableWritable

intersperse

This function takes any value a and returns a transform stream that intersperses the values from the input stream with the a.

Parameters

  • valany

Examples

letreadable,writable,res=[];// Create test streamsreadable=createTestReadable([1,2,3]);writable=createTestWritable(c=>res.push(c));// Connect the streamsconnect(readable,intersperse(0),writable);// res == [1,0,2,0,3]

Returns ReadableWritable

last

This function returns a transform stream that takes the last value from the input stream and enqueues it on the output stream.

Examples

letreadable,writable,el;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(e=>{el=e;});// Connect the streamsconnect(readable,last(),writable);// el == 6

Returns ReadableWritable

pick

This function takes any number of strings as arguments and returns a transform stream that extracts the passed property names from incoming values.

Parameters

Examples

letreadable,writable,o={'a': 1,'b': 2};// Create test streamsreadable=createTestReadable([o,o,o]);writable=createTestWritable(c=>assert(c.a)&&assert(!c.b));// Connect the streamsconnect(readable,pick('a'),writable);

Returns ReadableWritable

pluck

This function takes a string as argument and returns a transform stream that extracts the passed property from incoming values.

Parameters

Examples

letreadable,writable,o={'a': 1,'b': 2};// Create test streamsreadable=createTestReadable([o,o,o]);writable=createTestWritable(c=>assert(c==1));// Connect the streamsconnect(readable,pluck('a'),writable);

Returns ReadableWritable

repeat

This function takes a value as argument and returns a readable stream that repeatedly emits that value.

Parameters

  • valueany

Examples

letreadable,writable,val=1,len=6,sum=0;// Create test streamsreadable=repeat(val);writable=createTestWritable(c=>{sum+=c});// Connect the streamsconnect(readable,take(len),writable);// sum == (val * len)

Returns ReadableWritable

scan

This function takes a reducer function and an optional init value as arguments and returns a transform stream that applies the function to the incoming values and enqueues the accumulation of the results.

If an init value is not passed, the first incoming value is treated as one.

Parameters

  • funcfunction ((T2? | T1?), T1?): T2
  • initT1?

Examples

letreadable,writable,res;// Create test streamsreadable=createTestReadable([1,2,3]);writable=createTestWritable(c=>{// Check last element is numberletn=c[c.length-1];assert(n===+n);res=c;});// Connect the streamsconnect(readable,scan(add,0),writable);// res[res.length-1], [1,2,3].reduce( add )

Returns ReadableWritable

slice

This function takes an int m and an int n and returns a transform stream that drops the first m values and takes the next (m-n) values from the input stream.

Parameters

Examples

letreadable,writable,count=0;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(()=>count++);// Connect the streamsconnect(readable,slice(2,5),writable);// count == 3

Returns ReadableWritable

take

This function takes an int n and returns a transform stream that takes the first n values from the input stream.

Parameters

Examples

letreadable,writable,count=0;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(()=>count++);// Connect the streamsconnect(readable,take(3),writable);// count == 3

Returns ReadableWritable

tap

This function takes a function as rgument and returns a transform stream that applies the function to the incoming values before re-emitting them.

Parameters

  • funcanyFn

Examples

letreadable,writable;// Create test streamsreadable=createTestReadable([1,2,3]);writable=createTestWritable(c=>assert(!Number.isNaN(c*1)));// Connect the streamsconnect(readable,tap(console.log.bind(console)),writable);

Returns ReadableWritable

throttle

This function takes an int n and returns a transform stream that throttles the incoming values by n ms, only producing values every n ms and dropping the rest.

Parameters

  • intervalnumber (optional, default 0)
  • headboolean (optional, default true)

Returns TransformStream

uniq

This function returns a transform stream that keeps only unique values from the input stream and enqueues it on the output stream.

Examples

letreadable,writable,res=[];// Create test streamsreadable=createTestReadable([1,1,2,2,3,3]);writable=createTestWritable(c=>res.push(c));// Connect the streamsconnect(readable,uniq(),writable);// res == [1,2,3]

Returns ReadableWritable

About

Bunch of utilities for working with web streams

Resources

Contributing

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Table of Contents

Introducing pipes/utils

The pipesjs/utils module is to web streams what highland.js is to node streams. It contains utility functions to make working with web streams a lot easier. For more about Web Streams, refer to the spec.


About

The utils module is to web streams what highland.js is to node streams. It contains utility functions to make working with web streams a lot easier. Here's more about Web Streams from the spec itself:

Large swathes of the web platform are built on streaming data: that is, data that is created, processed, and consumed in an incremental fashion, without ever reading all of it into memory. The Streams Standard provides a common set of APIs for creating and interfacing with such streaming data, embodied in readable streams, writable streams, and transform streams.

The spec is still evolving but has reached a fairly stable stage with a reference implementation as well. The API has almost been finalized and Streams are coming to the web very soon!

At it's core, the API exposes three major components:

  • ReadableStream encapsulates a source producing values and emits them.
  • TransformStream are essentially { readable, writable} pairs that take a function which can be used to transform the values flowing through it.
  • WritableStream encapsulates a sink that receives values and writes to it.

Streams are essentially data structures that handle sequential flow of values. You can split streams, merge them and connect them together in various ways. What's amazing is that, in most cases, they can handle backpressure automatically, so you don't have to mess with the underlying details.

For further information, the spec is quite informative and easy to read. Jake Archibald also wrote a great blog post on them.

Heads up: If you're coming from node land, web streams are quite a lot different from node streams and incompatible with each other.

Installing

For browsers

The library depends on @pipes/core, so make sure you include it in before including the library.

You can use either of the builds from the dist folder:

<scriptsrc="path/to/web-streams-polyfill.js"></script><scriptsrc="path/to/pipes.utils.js"></script>

And in your code, all the functions will be available on the window.Pipes.utils variable.

let{ uniq, compact }=window.Pipes.utils;

For browserify users

The library has a peer-dependency on @pipes/core, so to install it:

 npm install @pipes/core @pipes/utils

The library is split up into modules, so you can both require the whole library or only parts of it:

let{ compact }=require("@pipes/utils");letcompact=require("@pipes/utils/compact");

For ES6 and Rollup users

If you want, you can directly import the es6 modules like so:

importpipesUtilsfrom"@pipes/utils/src";import{compact}from"@pipes/utils/src";importcompactfrom"@pipes/utils/src/compact";

API Reference

The utils library only consists of the following functions:

Set up code for examples

// SetupletcreateReadable=data=>newReadableStream({start(controller){this.data=data||[1,2,3];// Kickstart streamcontroller.enqueue(this.data.pop());},pull(controller){if(!this.data.length)returncontroller.close()controller.enqueue(this.data.pop());}}),createWritable=()=>newWritableStream({write(chunk){console.log(chunk);}});

batch

This function takes an int n and returns a transform stream that batches the incoming values in arrays of lengths no more than n.

Parameters

Examples

letinput=[1,2,3,4,5],expected=[[1,2],[3,4],[5]];letreadable,writable,res=[];// Create test streamsreadable=createTestReadable(input);writable=createTestWritable(c=>res.push(c));// Connect the streamsconnect(readable,batch(2),writable);// res == expected

Returns TransformStream

compact

This function returns a transform stream that spits out only truthy values from the input stream.

Examples

letreadable,writable,count=0;// Create test streamsreadable=createTestReadable([true,false,0,"","hello",1]);writable=createTestWritable(()=>count++);// Connect the streamsconnect(readable,compact(),writable);// count == 3

Pipe

This function takes an iterable as argument and returns a readable stream that repeatedly emits values generated by the emitter.

Examples

letreadable,writable,values=[1,2,3],sum=0;// Create test streamsreadable=cycle(values);writable=createTestWritable(c=>{sum+=c});// Connect the streamsconstexpected=2*values.reduce((a,b)=>a+b);connect(readable,take(2*values.length),writable);// sum == expected

debounce

This function takes an int n and returns a transform stream that debounces the incoming values by n ms, only producing values with n ms delay between them and dropping the rest.

Parameters

  • waitnumber (optional, default 0)
  • headboolean (optional, default true)

Returns ReadableWritable

drop

This function takes an int n and returns a transform stream that drops the first n values from the input stream.

Parameters

Examples

letreadable,writable,count=0;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(()=>count++);// Connect the streamsconnect(readable,drop(3),writable);// count == 3

Returns ReadableWritable

filter

This function takes a predicate function as argument and returns a transform stream that only emits values that satisfy the predicate.

Parameters

Examples

letreadable,writable;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(c=>assert(c>3));// Connect the streamsconnect(readable,filter(a=>a>3),writable);

Returns ReadableWritable

head

This function returns a transform stream that takes the first value from the input stream and enqueues it on the output stream.

Examples

letreadable,writable,el;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(e=>{el=e;});// Connect the streamsconnect(readable,head(),writable);// el == 1

Returns ReadableWritable

intersperse

This function takes any value a and returns a transform stream that intersperses the values from the input stream with the a.

Parameters

  • valany

Examples

letreadable,writable,res=[];// Create test streamsreadable=createTestReadable([1,2,3]);writable=createTestWritable(c=>res.push(c));// Connect the streamsconnect(readable,intersperse(0),writable);// res == [1,0,2,0,3]

Returns ReadableWritable

last

This function returns a transform stream that takes the last value from the input stream and enqueues it on the output stream.

Examples

letreadable,writable,el;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(e=>{el=e;});// Connect the streamsconnect(readable,last(),writable);// el == 6

Returns ReadableWritable

pick

This function takes any number of strings as arguments and returns a transform stream that extracts the passed property names from incoming values.

Parameters

Examples

letreadable,writable,o={'a': 1,'b': 2};// Create test streamsreadable=createTestReadable([o,o,o]);writable=createTestWritable(c=>assert(c.a)&&assert(!c.b));// Connect the streamsconnect(readable,pick('a'),writable);

Returns ReadableWritable

pluck

This function takes a string as argument and returns a transform stream that extracts the passed property from incoming values.

Parameters

Examples

letreadable,writable,o={'a': 1,'b': 2};// Create test streamsreadable=createTestReadable([o,o,o]);writable=createTestWritable(c=>assert(c==1));// Connect the streamsconnect(readable,pluck('a'),writable);

Returns ReadableWritable

repeat

This function takes a value as argument and returns a readable stream that repeatedly emits that value.

Parameters

  • valueany

Examples

letreadable,writable,val=1,len=6,sum=0;// Create test streamsreadable=repeat(val);writable=createTestWritable(c=>{sum+=c});// Connect the streamsconnect(readable,take(len),writable);// sum == (val * len)

Returns ReadableWritable

scan

This function takes a reducer function and an optional init value as arguments and returns a transform stream that applies the function to the incoming values and enqueues the accumulation of the results.

If an init value is not passed, the first incoming value is treated as one.

Parameters

  • funcfunction ((T2? | T1?), T1?): T2
  • initT1?

Examples

letreadable,writable,res;// Create test streamsreadable=createTestReadable([1,2,3]);writable=createTestWritable(c=>{// Check last element is numberletn=c[c.length-1];assert(n===+n);res=c;});// Connect the streamsconnect(readable,scan(add,0),writable);// res[res.length-1], [1,2,3].reduce( add )

Returns ReadableWritable

slice

This function takes an int m and an int n and returns a transform stream that drops the first m values and takes the next (m-n) values from the input stream.

Parameters

Examples

letreadable,writable,count=0;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(()=>count++);// Connect the streamsconnect(readable,slice(2,5),writable);// count == 3

Returns ReadableWritable

take

This function takes an int n and returns a transform stream that takes the first n values from the input stream.

Parameters

Examples

letreadable,writable,count=0;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(()=>count++);// Connect the streamsconnect(readable,take(3),writable);// count == 3

Returns ReadableWritable

tap

This function takes a function as rgument and returns a transform stream that applies the function to the incoming values before re-emitting them.

Parameters

  • funcanyFn

Examples

letreadable,writable;// Create test streamsreadable=createTestReadable([1,2,3]);writable=createTestWritable(c=>assert(!Number.isNaN(c*1)));// Connect the streamsconnect(readable,tap(console.log.bind(console)),writable);

Returns ReadableWritable

throttle

This function takes an int n and returns a transform stream that throttles the incoming values by n ms, only producing values every n ms and dropping the rest.

Parameters

  • intervalnumber (optional, default 0)
  • headboolean (optional, default true)

Returns TransformStream

uniq

This function returns a transform stream that keeps only unique values from the input stream and enqueues it on the output stream.

Examples

letreadable,writable,res=[];// Create test streamsreadable=createTestReadable([1,1,2,2,3,3]);writable=createTestWritable(c=>res.push(c));// Connect the streamsconnect(readable,uniq(),writable);// res == [1,2,3]

Returns ReadableWritable

About

Bunch of utilities for working with web streams

Resources

Contributing

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Table of Contents

Introducing pipes/utils

The pipesjs/utils module is to web streams what highland.js is to node streams. It contains utility functions to make working with web streams a lot easier. For more about Web Streams, refer to the spec.


About

The utils module is to web streams what highland.js is to node streams. It contains utility functions to make working with web streams a lot easier. Here's more about Web Streams from the spec itself:

Large swathes of the web platform are built on streaming data: that is, data that is created, processed, and consumed in an incremental fashion, without ever reading all of it into memory. The Streams Standard provides a common set of APIs for creating and interfacing with such streaming data, embodied in readable streams, writable streams, and transform streams.

The spec is still evolving but has reached a fairly stable stage with a reference implementation as well. The API has almost been finalized and Streams are coming to the web very soon!

At it's core, the API exposes three major components:

  • ReadableStream encapsulates a source producing values and emits them.
  • TransformStream are essentially { readable, writable} pairs that take a function which can be used to transform the values flowing through it.
  • WritableStream encapsulates a sink that receives values and writes to it.

Streams are essentially data structures that handle sequential flow of values. You can split streams, merge them and connect them together in various ways. What's amazing is that, in most cases, they can handle backpressure automatically, so you don't have to mess with the underlying details.

For further information, the spec is quite informative and easy to read. Jake Archibald also wrote a great blog post on them.

Heads up: If you're coming from node land, web streams are quite a lot different from node streams and incompatible with each other.

Installing

For browsers

The library depends on @pipes/core, so make sure you include it in before including the library.

You can use either of the builds from the dist folder:

<scriptsrc="path/to/web-streams-polyfill.js"></script><scriptsrc="path/to/pipes.utils.js"></script>

And in your code, all the functions will be available on the window.Pipes.utils variable.

let{ uniq, compact }=window.Pipes.utils;

For browserify users

The library has a peer-dependency on @pipes/core, so to install it:

 npm install @pipes/core @pipes/utils

The library is split up into modules, so you can both require the whole library or only parts of it:

let{ compact }=require("@pipes/utils");letcompact=require("@pipes/utils/compact");

For ES6 and Rollup users

If you want, you can directly import the es6 modules like so:

importpipesUtilsfrom"@pipes/utils/src";import{compact}from"@pipes/utils/src";importcompactfrom"@pipes/utils/src/compact";

API Reference

The utils library only consists of the following functions:

Set up code for examples

// SetupletcreateReadable=data=>newReadableStream({start(controller){this.data=data||[1,2,3];// Kickstart streamcontroller.enqueue(this.data.pop());},pull(controller){if(!this.data.length)returncontroller.close()controller.enqueue(this.data.pop());}}),createWritable=()=>newWritableStream({write(chunk){console.log(chunk);}});

batch

This function takes an int n and returns a transform stream that batches the incoming values in arrays of lengths no more than n.

Parameters

Examples

letinput=[1,2,3,4,5],expected=[[1,2],[3,4],[5]];letreadable,writable,res=[];// Create test streamsreadable=createTestReadable(input);writable=createTestWritable(c=>res.push(c));// Connect the streamsconnect(readable,batch(2),writable);// res == expected

Returns TransformStream

compact

This function returns a transform stream that spits out only truthy values from the input stream.

Examples

letreadable,writable,count=0;// Create test streamsreadable=createTestReadable([true,false,0,"","hello",1]);writable=createTestWritable(()=>count++);// Connect the streamsconnect(readable,compact(),writable);// count == 3

Pipe

This function takes an iterable as argument and returns a readable stream that repeatedly emits values generated by the emitter.

Examples

letreadable,writable,values=[1,2,3],sum=0;// Create test streamsreadable=cycle(values);writable=createTestWritable(c=>{sum+=c});// Connect the streamsconstexpected=2*values.reduce((a,b)=>a+b);connect(readable,take(2*values.length),writable);// sum == expected

debounce

This function takes an int n and returns a transform stream that debounces the incoming values by n ms, only producing values with n ms delay between them and dropping the rest.

Parameters

  • waitnumber (optional, default 0)
  • headboolean (optional, default true)

Returns ReadableWritable

drop

This function takes an int n and returns a transform stream that drops the first n values from the input stream.

Parameters

Examples

letreadable,writable,count=0;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(()=>count++);// Connect the streamsconnect(readable,drop(3),writable);// count == 3

Returns ReadableWritable

filter

This function takes a predicate function as argument and returns a transform stream that only emits values that satisfy the predicate.

Parameters

Examples

letreadable,writable;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(c=>assert(c>3));// Connect the streamsconnect(readable,filter(a=>a>3),writable);

Returns ReadableWritable

head

This function returns a transform stream that takes the first value from the input stream and enqueues it on the output stream.

Examples

letreadable,writable,el;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(e=>{el=e;});// Connect the streamsconnect(readable,head(),writable);// el == 1

Returns ReadableWritable

intersperse

This function takes any value a and returns a transform stream that intersperses the values from the input stream with the a.

Parameters

  • valany

Examples

letreadable,writable,res=[];// Create test streamsreadable=createTestReadable([1,2,3]);writable=createTestWritable(c=>res.push(c));// Connect the streamsconnect(readable,intersperse(0),writable);// res == [1,0,2,0,3]

Returns ReadableWritable

last

This function returns a transform stream that takes the last value from the input stream and enqueues it on the output stream.

Examples

letreadable,writable,el;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(e=>{el=e;});// Connect the streamsconnect(readable,last(),writable);// el == 6

Returns ReadableWritable

pick

This function takes any number of strings as arguments and returns a transform stream that extracts the passed property names from incoming values.

Parameters

Examples

letreadable,writable,o={'a': 1,'b': 2};// Create test streamsreadable=createTestReadable([o,o,o]);writable=createTestWritable(c=>assert(c.a)&&assert(!c.b));// Connect the streamsconnect(readable,pick('a'),writable);

Returns ReadableWritable

pluck

This function takes a string as argument and returns a transform stream that extracts the passed property from incoming values.

Parameters

Examples

letreadable,writable,o={'a': 1,'b': 2};// Create test streamsreadable=createTestReadable([o,o,o]);writable=createTestWritable(c=>assert(c==1));// Connect the streamsconnect(readable,pluck('a'),writable);

Returns ReadableWritable

repeat

This function takes a value as argument and returns a readable stream that repeatedly emits that value.

Parameters

  • valueany

Examples

letreadable,writable,val=1,len=6,sum=0;// Create test streamsreadable=repeat(val);writable=createTestWritable(c=>{sum+=c});// Connect the streamsconnect(readable,take(len),writable);// sum == (val * len)

Returns ReadableWritable

scan

This function takes a reducer function and an optional init value as arguments and returns a transform stream that applies the function to the incoming values and enqueues the accumulation of the results.

If an init value is not passed, the first incoming value is treated as one.

Parameters

  • funcfunction ((T2? | T1?), T1?): T2
  • initT1?

Examples

letreadable,writable,res;// Create test streamsreadable=createTestReadable([1,2,3]);writable=createTestWritable(c=>{// Check last element is numberletn=c[c.length-1];assert(n===+n);res=c;});// Connect the streamsconnect(readable,scan(add,0),writable);// res[res.length-1], [1,2,3].reduce( add )

Returns ReadableWritable

slice

This function takes an int m and an int n and returns a transform stream that drops the first m values and takes the next (m-n) values from the input stream.

Parameters

Examples

letreadable,writable,count=0;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(()=>count++);// Connect the streamsconnect(readable,slice(2,5),writable);// count == 3

Returns ReadableWritable

take

This function takes an int n and returns a transform stream that takes the first n values from the input stream.

Parameters

Examples

letreadable,writable,count=0;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(()=>count++);// Connect the streamsconnect(readable,take(3),writable);// count == 3

Returns ReadableWritable

tap

This function takes a function as rgument and returns a transform stream that applies the function to the incoming values before re-emitting them.

Parameters

  • funcanyFn

Examples

letreadable,writable;// Create test streamsreadable=createTestReadable([1,2,3]);writable=createTestWritable(c=>assert(!Number.isNaN(c*1)));// Connect the streamsconnect(readable,tap(console.log.bind(console)),writable);

Returns ReadableWritable

throttle

This function takes an int n and returns a transform stream that throttles the incoming values by n ms, only producing values every n ms and dropping the rest.

Parameters

  • intervalnumber (optional, default 0)
  • headboolean (optional, default true)

Returns TransformStream

uniq

This function returns a transform stream that keeps only unique values from the input stream and enqueues it on the output stream.

Examples

letreadable,writable,res=[];// Create test streamsreadable=createTestReadable([1,1,2,2,3,3]);writable=createTestWritable(c=>res.push(c));// Connect the streamsconnect(readable,uniq(),writable);// res == [1,2,3]

Returns ReadableWritable

About

Bunch of utilities for working with web streams

Resources

Contributing

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Table of Contents

Introducing pipes/utils

The pipesjs/utils module is to web streams what highland.js is to node streams. It contains utility functions to make working with web streams a lot easier. For more about Web Streams, refer to the spec.


About

The utils module is to web streams what highland.js is to node streams. It contains utility functions to make working with web streams a lot easier. Here's more about Web Streams from the spec itself:

Large swathes of the web platform are built on streaming data: that is, data that is created, processed, and consumed in an incremental fashion, without ever reading all of it into memory. The Streams Standard provides a common set of APIs for creating and interfacing with such streaming data, embodied in readable streams, writable streams, and transform streams.

The spec is still evolving but has reached a fairly stable stage with a reference implementation as well. The API has almost been finalized and Streams are coming to the web very soon!

At it's core, the API exposes three major components:

  • ReadableStream encapsulates a source producing values and emits them.
  • TransformStream are essentially { readable, writable} pairs that take a function which can be used to transform the values flowing through it.
  • WritableStream encapsulates a sink that receives values and writes to it.

Streams are essentially data structures that handle sequential flow of values. You can split streams, merge them and connect them together in various ways. What's amazing is that, in most cases, they can handle backpressure automatically, so you don't have to mess with the underlying details.

For further information, the spec is quite informative and easy to read. Jake Archibald also wrote a great blog post on them.

Heads up: If you're coming from node land, web streams are quite a lot different from node streams and incompatible with each other.

Installing

For browsers

The library depends on @pipes/core, so make sure you include it in before including the library.

You can use either of the builds from the dist folder:

<scriptsrc="path/to/web-streams-polyfill.js"></script><scriptsrc="path/to/pipes.utils.js"></script>

And in your code, all the functions will be available on the window.Pipes.utils variable.

let{ uniq, compact }=window.Pipes.utils;

For browserify users

The library has a peer-dependency on @pipes/core, so to install it:

 npm install @pipes/core @pipes/utils

The library is split up into modules, so you can both require the whole library or only parts of it:

let{ compact }=require("@pipes/utils");letcompact=require("@pipes/utils/compact");

For ES6 and Rollup users

If you want, you can directly import the es6 modules like so:

importpipesUtilsfrom"@pipes/utils/src";import{compact}from"@pipes/utils/src";importcompactfrom"@pipes/utils/src/compact";

API Reference

The utils library only consists of the following functions:

Set up code for examples

// SetupletcreateReadable=data=>newReadableStream({start(controller){this.data=data||[1,2,3];// Kickstart streamcontroller.enqueue(this.data.pop());},pull(controller){if(!this.data.length)returncontroller.close()controller.enqueue(this.data.pop());}}),createWritable=()=>newWritableStream({write(chunk){console.log(chunk);}});

batch

This function takes an int n and returns a transform stream that batches the incoming values in arrays of lengths no more than n.

Parameters

Examples

letinput=[1,2,3,4,5],expected=[[1,2],[3,4],[5]];letreadable,writable,res=[];// Create test streamsreadable=createTestReadable(input);writable=createTestWritable(c=>res.push(c));// Connect the streamsconnect(readable,batch(2),writable);// res == expected

Returns TransformStream

compact

This function returns a transform stream that spits out only truthy values from the input stream.

Examples

letreadable,writable,count=0;// Create test streamsreadable=createTestReadable([true,false,0,"","hello",1]);writable=createTestWritable(()=>count++);// Connect the streamsconnect(readable,compact(),writable);// count == 3

Pipe

This function takes an iterable as argument and returns a readable stream that repeatedly emits values generated by the emitter.

Examples

letreadable,writable,values=[1,2,3],sum=0;// Create test streamsreadable=cycle(values);writable=createTestWritable(c=>{sum+=c});// Connect the streamsconstexpected=2*values.reduce((a,b)=>a+b);connect(readable,take(2*values.length),writable);// sum == expected

debounce

This function takes an int n and returns a transform stream that debounces the incoming values by n ms, only producing values with n ms delay between them and dropping the rest.

Parameters

  • waitnumber (optional, default 0)
  • headboolean (optional, default true)

Returns ReadableWritable

drop

This function takes an int n and returns a transform stream that drops the first n values from the input stream.

Parameters

Examples

letreadable,writable,count=0;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(()=>count++);// Connect the streamsconnect(readable,drop(3),writable);// count == 3

Returns ReadableWritable

filter

This function takes a predicate function as argument and returns a transform stream that only emits values that satisfy the predicate.

Parameters

Examples

letreadable,writable;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(c=>assert(c>3));// Connect the streamsconnect(readable,filter(a=>a>3),writable);

Returns ReadableWritable

head

This function returns a transform stream that takes the first value from the input stream and enqueues it on the output stream.

Examples

letreadable,writable,el;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(e=>{el=e;});// Connect the streamsconnect(readable,head(),writable);// el == 1

Returns ReadableWritable

intersperse

This function takes any value a and returns a transform stream that intersperses the values from the input stream with the a.

Parameters

  • valany

Examples

letreadable,writable,res=[];// Create test streamsreadable=createTestReadable([1,2,3]);writable=createTestWritable(c=>res.push(c));// Connect the streamsconnect(readable,intersperse(0),writable);// res == [1,0,2,0,3]

Returns ReadableWritable

last

This function returns a transform stream that takes the last value from the input stream and enqueues it on the output stream.

Examples

letreadable,writable,el;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(e=>{el=e;});// Connect the streamsconnect(readable,last(),writable);// el == 6

Returns ReadableWritable

pick

This function takes any number of strings as arguments and returns a transform stream that extracts the passed property names from incoming values.

Parameters

Examples

letreadable,writable,o={'a': 1,'b': 2};// Create test streamsreadable=createTestReadable([o,o,o]);writable=createTestWritable(c=>assert(c.a)&&assert(!c.b));// Connect the streamsconnect(readable,pick('a'),writable);

Returns ReadableWritable

pluck

This function takes a string as argument and returns a transform stream that extracts the passed property from incoming values.

Parameters

Examples

letreadable,writable,o={'a': 1,'b': 2};// Create test streamsreadable=createTestReadable([o,o,o]);writable=createTestWritable(c=>assert(c==1));// Connect the streamsconnect(readable,pluck('a'),writable);

Returns ReadableWritable

repeat

This function takes a value as argument and returns a readable stream that repeatedly emits that value.

Parameters

  • valueany

Examples

letreadable,writable,val=1,len=6,sum=0;// Create test streamsreadable=repeat(val);writable=createTestWritable(c=>{sum+=c});// Connect the streamsconnect(readable,take(len),writable);// sum == (val * len)

Returns ReadableWritable

scan

This function takes a reducer function and an optional init value as arguments and returns a transform stream that applies the function to the incoming values and enqueues the accumulation of the results.

If an init value is not passed, the first incoming value is treated as one.

Parameters

  • funcfunction ((T2? | T1?), T1?): T2
  • initT1?

Examples

letreadable,writable,res;// Create test streamsreadable=createTestReadable([1,2,3]);writable=createTestWritable(c=>{// Check last element is numberletn=c[c.length-1];assert(n===+n);res=c;});// Connect the streamsconnect(readable,scan(add,0),writable);// res[res.length-1], [1,2,3].reduce( add )

Returns ReadableWritable

slice

This function takes an int m and an int n and returns a transform stream that drops the first m values and takes the next (m-n) values from the input stream.

Parameters

Examples

letreadable,writable,count=0;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(()=>count++);// Connect the streamsconnect(readable,slice(2,5),writable);// count == 3

Returns ReadableWritable

take

This function takes an int n and returns a transform stream that takes the first n values from the input stream.

Parameters

Examples

letreadable,writable,count=0;// Create test streamsreadable=createTestReadable([1,2,3,4,5,6]);writable=createTestWritable(()=>count++);// Connect the streamsconnect(readable,take(3),writable);// count == 3

Returns ReadableWritable

tap

This function takes a function as rgument and returns a transform stream that applies the function to the incoming values before re-emitting them.

Parameters

  • funcanyFn

Examples

letreadable,writable;// Create test streamsreadable=createTestReadable([1,2,3]);writable=createTestWritable(c=>assert(!Number.isNaN(c*1)));// Connect the streamsconnect(readable,tap(console.log.bind(console)),writable);

Returns ReadableWritable

throttle

This function takes an int n and returns a transform stream that throttles the incoming values by n ms, only producing values every n ms and dropping the rest.

Parameters

  • intervalnumber (optional, default 0)
  • headboolean (optional, default true)

Returns TransformStream

uniq

This function returns a transform stream that keeps only unique values from the input stream and enqueues it on the output stream.

Examples

letreadable,writable,res=[];// Create test streamsreadable=createTestReadable([1,1,2,2,3,3]);writable=createTestWritable(c=>res.push(c));// Connect the streamsconnect(readable,uniq(),writable);// res == [1,2,3]

Returns ReadableWritable

About

Bunch of utilities for working with web streams

Resources

Contributing

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages