toSource
Convert observables or functions into state sources.
Import
typescript
import { toSource } from '@ng-angular-stack/craft';Basic Usage
typescript
import { interval } from 'rxjs';
import { map } from 'rxjs/operators';
import { state, toSource } from '@ng-angular-stack/craft';
// Convert observable to source
const tickSource = toSource(
interval(1000).pipe(map((tick) => (count: number) => count + 1)),
);
const count = state(0, {
sources: [tickSource],
});API
From Observable
typescript
// Observable that emits updater functions
const updates$ = new BehaviorSubject<(state: T) => T>(/* ... */);
const source = toSource(updates$);
const myState = state(initialValue, {
sources: [source],
});From Function
typescript
// Function that returns updater
const updater = (payload: number) => (state: number) => state + payload;
const source = toSource(updater);Examples
Button Clicks
typescript
import { fromEvent } from 'rxjs';
const button = document.querySelector('button')!;
const clicks$ = fromEvent(button, 'click');
const clickSource = toSource(
clicks$.pipe(map(() => (count: number) => count + 1)),
);
const clickCount = state(0, {
sources: [clickSource],
});Form Input
typescript
const input = document.querySelector('input')!;
const input$ = fromEvent(input, 'input');
const inputSource = toSource(
input$.pipe(
map((event) => (state: string) => (event.target as HTMLInputElement).value),
),
);
const inputValue = state('', {
sources: [inputSource],
});WebSocket Messages
typescript
import { webSocket } from 'rxjs/webSocket';
const ws$ = webSocket('ws://localhost:8080');
const messageSource = toSource(
ws$.pipe(map((message) => (state: Message[]) => [...state, message])),
);
const messages = state<Message[]>([], {
sources: [messageSource],
});See Also
- Source - Source concept
- stackedSource - Combine multiple sources
- sourceFromEvent - Create from DOM events