Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/briancavalier/most-behave
Experimental continuous Behaviors for most.js
https://github.com/briancavalier/most-behave
functional-reactive-programming mostjs reactive-programming
Last synced: about 2 months ago
JSON representation
Experimental continuous Behaviors for most.js
- Host: GitHub
- URL: https://github.com/briancavalier/most-behave
- Owner: briancavalier
- License: mit
- Created: 2016-12-18T03:29:34.000Z (about 8 years ago)
- Default Branch: master
- Last Pushed: 2019-12-30T15:06:06.000Z (almost 5 years ago)
- Last Synced: 2024-10-20T07:45:59.464Z (2 months ago)
- Topics: functional-reactive-programming, mostjs, reactive-programming
- Language: TypeScript
- Size: 409 KB
- Stars: 32
- Watchers: 7
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Behavior
**EXPERIMENTAL** Don't use this for anything real ... yet.
Continuous time-varying values for most.js. Behaviors are the continuous complement to most.js discrete Event Streams, or, if you prefer, the "pull" complement to most.js "push" Event Streams.
## Try it
Feedback welcome via [gitter](https://gitter.im/cujojs/most), but seriously, don't use it for anything real yet.
```
npm i --save @briancavalier/most-behavior
```## Behavior
A Behavior is a continuous value. In contrast to an Event Stream which has discrete occurrences at particular instants in time, a Behavior's value is defined at all *real number* (not integer) values of time and may vary continuously (or not) over time.
Because they are defined for all real number values of time, a Behavior must be *sampled* to obtain its value at specific instants in time. To sample a Behavior, pass it an Event Stream whose occurrences define all the points in time at which the behavior's value should be sampled.
Here's a simple example. Note that because `clock` is "pull", it does no work at the instants between clicks, where it is *not* being sampled.
```js
import { time } from '@briancavalier/most-behavior'
import { click } from '@most/dom-event'// A Behavior that always represents milliseconds since the application started
const clock = time// Sample the clock each time the user clicks
const timeAtEachClick = sample(clock, click(document))
```For now, [see the examples dir](examples) for more realistic code, how to run a `@most/core` app that integrates behaviors, etc.
## API
### Creating Behaviors
#### time :: Behavior number
A behavior that represents the current time in milliseconds since the application started.
#### always :: a → Behavior a
Create a Behavior whose value is always `a`.
#### step :: a → Stream a → Behavior a
Create a Behavior that starts with an initial value and updates to each new value in the Event Stream.
### Transforming Behaviors
#### map :: (a → b) → Behavior a → Behavior b
Apply a function to a Behavior at all points in time.
#### apply :: Behavior (a → b) → Behavior a → Behavior b
Apply a (time-varying) function to a Behavior at all points in time.
#### liftA2 :: (a → b → c) → Behavior a → Behavior b → Behavior c
Apply a function to 2 Behaviors at all points in time.
### Sampling Behaviors
#### sample :: Behavior a → Stream b → Stream a
Sample a Behavior's value at every occurrence of an Event Stream.
#### snapshot :: Behavior a → Stream b → Stream [a, b]
Sample a Behavior at every occurrence of an event, and compute a new event from the (event, sample) pair.
## Potential APIs
Potentially useful APIs we could add:
### when :: Behavior bool → Stream a → Stream a
Allow events only when a Behavior's value is `true`.
### accum :: a → Stream (a → a) → Behavior a
Create a Behavior with an initial value and an Event Stream carrying update functions.
### scanB :: (a → b → a) → a → Stream b → Behavior a
Like scan, but produces a Behavior. Needs a helpful name ...
### scanB :: (a → b → Behavior a) → Behavior a → Stream b → Behavior b
Generalized scan for Behaviors. When event occurs, sample Behavior, and apply a function that creates a new Behavior. Somewhat like `switch`. Needs a helpful name ...
### count :: Stream a → Behavior number
Create a Behavior representing the number of event occurrences.
### switch :: Behavior a → Stream (Behavior a) → Behavior a
Create a Behavior that acts like an initial Behavior and switches to act like each new Behavior that occurs in the Event Stream.