import { Stream } from '@motorcycle/types';
/**
* Especially useful when keeping local state that also needs to be updated
* from a source.
* @name state(f: (acc: A, value: B) => A, seed$: Stream, values$: Stream): Stream
* @example
* import { Stream } from '@motorcycle/types'
* import { query, dragOverEvent, dragStartEvent, dropEvent } from '@motorcycle/dom'
* import { sample, map, state, mapList } from '@motorcycle/stream'
* import { move } from '@typed/prelude'
*
* export function ReorderableList(sources) {
* const { list$, dom } = sources
* const listItemSource = query(listItemCssSelector, dom)
* const dragOver$ = dragOverEvent(listItemSource)
* const dragStart$ = dragStartEvent(listItemSource)
* const drop$ = dropEvent(listItemSource)
* const reducer$: Stream<(list: Array) => Array> =
* sample((to, from) => move(from, to), map(elementDataKey, drop$), map(elementDataKey, dragStart$))
* const reorderedList$ = state((x, f) => f(x), list$, reducer$)
* // Create all list items.
* const listItemViews$ = mapList(listItem, reorderedList$)
* // Pass the list items to the view
* const view$ = map(view, listItemViews$)
*
* return {
* view$,
* preventDefault$: dragOver$,
* }
* }
*/
export declare const state: State;
export interface State {
(f: (accumulator: A, value: B) => A, seed$: Stream, values$: Stream): Stream;
(f: (accumulator: A, value: B) => A, seed$: Stream): (values$: Stream) => Stream;
(f: (accumulator: A, value: B) => A): {
(seed$: Stream, values$: Stream): Stream;
(seed$: Stream): (values$: Stream) => Stream;
};
}