@continuum-js/std
v1.0.0
Published
Continuum standard library — reusable FRP combinators (async, timing, streams)
Downloads
2,496
Readme
@continuum-js/std
Стандартная библиотека переиспользуемых FRP-комбинаторов Continuum — то, что
нужно каждый день: тайминг, асинхронные данные, форма потоков, хелперы для
поведений. Всё построено поверх @continuum-js/frp без доступа к внутренностям,
которых ядро не отдаёт наружу.
import { resource, debounce /* … */ } from "@continuum-js/std";Тайминг
Мост к настенным часам (setTimeout/setInterval). Каждый возвращает событие,
которое гасит свой таймер в dispose().
| | |
| ----------------- | --------------------------------------------------------------- |
| debounce(e, ms) | эмит после ms тишины, всплеск коалесится в последнее значение |
| throttle(e, ms) | пропустить первое происшествие, затем игнорировать ms |
| delay(e, ms) | сдвинуть каждое происшествие на ms позже |
| interval(ms) | источник, тикающий 1, 2, 3, … каждые ms |
Форма потоков
Производные события над графом (glitch-free, по рангам).
| | |
| ------------------------ | ----------------------------------------------- |
| filterMap(e, f) | map с отбрасыванием null/undefined |
| pairwise(e) | [prev, curr], начиная со второго происшествия |
| partition(e, pred) | разбить поток на [подходящие, остальные] |
| count(e) | State<number> — сколько раз событие случилось |
| sampleWith(trigger, b) | значение b в момент каждого trigger |
Поведения
| | |
| ------------------- | -------------------------------------------------------------- |
| previous(b, init) | поведение, отстающее на шаг (значение до последнего изменения) |
| dedupe(b, eq?) | подавляет обновления, равные текущему значению |
Асинхронные данные (HTTP)
perform — граница IO (§6.5): эффект бежит после закрытия момента, результат
возвращается в сеть как данные, ошибка завёрнута в Result, а не выброшена.
resource(trigger, fetcher): State<Async<T>>— конечный автоматidle → loading → ok | error. Запросы нумеруются, поэтому запоздавший ответ на устаревший запрос отбрасывается (last-request-wins) — декларативное решение классического бага гонки ответов.Async<T>— жизненный цикл запроса как первоклассные данные.
// внутри компонента (скоуп есть автоматически); на уровне модуля — root(() => …)
const query = debounce(input.updates, 300).filter((s) => s.length > 0);
const users = resource(query, (q) =>
fetch(`/api?q=${q}`).then((r) => r.json()),
);
// users: State<Async<User[]>> — рисуй по users.statusЖивой пример — examples/data.
