Ecosyste.ms: Awesome

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

Awesome Lists | Featured Topics | Projects

https://github.com/erikras/callbag-types

Types for 👜 Callbags
https://github.com/erikras/callbag-types

callbag callbags flow observable types typescript

Last synced: about 1 month ago
JSON representation

Types for 👜 Callbags

Awesome Lists containing this project

README

        

/**
* *****************************************************************
* *****************************************************************
* ⚠️ DO NOT USE! ⚠️
* From what I can tell, Flow does not allow enough fine control
* over polymorphism to realistically tame the possible typings
* of callbags. If someone can figure it out, PRs very, very welcome.
* *****************************************************************
* *****************************************************************
*
* This library provides types for 👜 Callbags according to the spec.
*
* Spec: https://github.com/callbag/callbag
* Original Typing work: http://blog.krawaller.se/posts/explaining-callbags-via-typescript-definitions/
*
* Installation
*
* npm install --save-dev callbag-types
*
* Usage
*
* import type { START, SourceInitiator } from 'callbag-types'
*
* @flow
*/

export type START = 0
export type DATA = 1
export type END = 2

/**
* Quoth the spec:
*
* "A callbag is terminated when the first argument is 2 and the second
* argument is either undefined (signalling termination due to success)
* or any truthy value (signalling termination due to failure)."
*/
export type SourceTalkback = ((DATA, T) => void) &
((END, error?: any) => void)

export type SinkTalkback = ((
START,
SourceTalkback | SourceInitiator
) => void) &
SourceTalkback

/**
* Quoth the spec:
*
* "When a source is greeted and given a sink as payload, the sink MUST
* be greeted back with a callbag payload that is either the source
* itself or another callbag (known as the 'talkback'). In other
* words, greets are mutual. Reciprocal greeting is called a handshake."
*/
export type SourceInitiator = (START, SinkTalkback) => void

export type SinkConnector = (
source: SourceInitiator
) => ?SourceInitiator

export type SourceFactory = (...args: any[]) => SourceInitiator

export type Operator = (...args: any[]) => SinkConnector

export type Callbag =
| SourceTalkback<*>
| SinkTalkback<*>
| SourceFactory<*>
| SourceInitiator<*>
| SinkConnector<*>