Skip to content

MIT LicenseTypeScriptnpm

Reactive programming extensions and advanced RxJS utilities for the ziegel framework. Provides enhanced operators, reactive patterns, BLoC architecture, and subscription management utilities.

Reactive Extensions: Advanced reactive programming with custom operators, BLoC patterns, and enhanced RxJS utilities for complex data streams.

🚀 Overview

@breadstone/ziegel-rx provides:

  • Enhanced RxJS Operators: Custom operators for common reactive patterns
  • BLoC Architecture: Business Logic Component pattern implementation
  • Subscription Management: Advanced subscription handling and cleanup
  • Reactive Extensions: Extensions for observables and subjects
  • Stream Utilities: Countdown, observe, and transformation utilities
  • Pattern Implementations: Reactive design patterns for enterprise applications

📦 Installation

bash
npm install @breadstone/ziegel-rx
# or
yarn add @breadstone/ziegel-rx

🧩 Features & Usage Examples

Enhanced RxJS Operators

typescript
import { notNull, empty } from '@breadstone/ziegel-rx';
import { map, filter } from 'rxjs/operators';

// Filter out null values from streams
const dataStream$ = source$.pipe(
  notNull(), // Removes null and undefined values
  map((data) => data.value),
);

// Empty operator for placeholder streams
const emptyStream$ = empty<string>();

BLoC Architecture Pattern

typescript
import { Bloc, BlocObserver, Transition } from '@breadstone/ziegel-rx';

// Define events and states
interface CounterEvent {
  type: 'increment' | 'decrement';
}

interface CounterState {
  count: number;
}

// Implement BLoC
class CounterBloc extends Bloc<CounterEvent, CounterState> {
  constructor() {
    super({ count: 0 });
  }

  mapEventToState(event: CounterEvent): CounterState {
    const currentState = this.state;
    switch (event.type) {
      case 'increment':
        return { count: currentState.count + 1 };
      case 'decrement':
        return { count: currentState.count - 1 };
      default:
        return currentState;
    }
  }
}

// Use BLoC
const counterBloc = new CounterBloc();
counterBloc.add({ type: 'increment' });

BLoC Observer

typescript
import { BlocObserver, Transition } from '@breadstone/ziegel-rx';

class AppBlocObserver extends BlocObserver {
  onTransition(transition: Transition<any, any>): void {
    console.log('State transition:', transition);
  }

  onError(error: Error): void {
    console.error('BLoC error:', error);
  }
}

// Set global observer
Bloc.observer = new AppBlocObserver();

Subscription Extensions

typescript
import { CompositeUnsubscribable, subscribeOnce, once } from '@breadstone/ziegel-rx';

// Composite subscription management
const subscriptions = new CompositeUnsubscribable();

subscriptions.add(stream1$.subscribe((value) => console.log('Stream 1:', value)));
subscriptions.add(stream2$.subscribe((value) => console.log('Stream 2:', value)));

// Unsubscribe from all at once
subscriptions.unsubscribe();

// Subscribe once to an observable
subscribeOnce(dataStream$, (value) => {
  console.log('Received once:', value);
});

// Alternative syntax
once(dataStream$, (value) => {
  console.log('Received once:', value);
});

Observable Extensions

typescript
import { observe, toBehaviorSubject, toReplaySubject, toSubject } from '@breadstone/ziegel-rx';
import { from } from 'rxjs';

// Convert arrays to observables with observe
const arrayObservable$ = observe([1, 2, 3, 4, 5]);

// Convert observables to different subject types
const source$ = from([1, 2, 3]);

const behaviorSubject = toBehaviorSubject(source$, 0); // With initial value
const replaySubject = toReplaySubject(source$, 3); // Replay last 3 values
const subject = toSubject(source$);

Countdown Utilities

typescript
import { countdown, countdown2 } from '@breadstone/ziegel-rx';

// Countdown from 10 to 0
countdown(10).subscribe((count) => {
  console.log('Countdown:', count);
});

// Advanced countdown with custom interval
countdown2(30, 1000).subscribe((count) => {
  console.log('30 second countdown:', count);
});
typescript
import { IReactiveCommand } from '@breadstone/ziegel-rx';

// Implement reactive commands for user interactions
class SaveCommand implements IReactiveCommand {
  execute() {
    // Command execution logic
  }

  canExecute() {
    // Command availability logic
  }
}

Enhanced Operators

typescript
import { customOperators } from '@breadstone/ziegel-rx';
import { of } from 'rxjs';

// Use enhanced operators for complex data transformations
const stream$ = of(1, 2, 3)
  .pipe
  // Custom operators for enterprise scenarios
  ();

Observable Patterns

typescript
import { reactivePatterns } from '@breadstone/ziegel-rx';

// Implement reactive data patterns
const dataStream$ = reactivePatterns.createDataStream();

📚 Package import points

📚 Package import points

typescript
import {
  // Subscription Management
  CompositeUnsubscribable,

  // Extensions
  countdown,
  countdown2,
  observe,
  subscribeOnce,
  once,
  toBehaviorSubject,
  toReplaySubject,
  toSubject,

  // Operators
  empty,
  notNull,

  // BLoC Pattern
  Bloc,
  BlocObserver,
  Transition,
  EventStreamClosedException,
} from '@breadstone/ziegel-rx';

📚 API Documentation

  • @breadstone/ziegel-core: Foundation utilities and reactive patterns
  • rxjs: Core reactive programming library

License

MIT

Issues

Please report bugs and feature requests in the Issue Tracker


Part of the ziegel Enterprise TypeScript Framework

Released under the MIT License.