import { Iterable } from 'ix'; import { IterableLike, ObservableLike } from '../../../WebRx'; import { ListItemsViewModel } from './ListItemsViewModel'; export function flattenItems( item: T, itemsSource: (item: T) => IterableLike | undefined, ): Iterable { const items = itemsSource(item); return items == null ? Iterable.of(item) : Iterable.from(items) .flatMap(x => flattenItems(x, itemsSource)) .startWith(item); } export class TreeListItemsViewModel extends ListItemsViewModel { public static displayName = 'TreeListItemsViewModel'; constructor( source: ObservableLike>, protected readonly itemsSource: (item: T) => IterableLike | undefined, ) { super(source); } getItems() { return Iterable.from(this.getItemsSource()).flatMap(x => this.flattenItems(x), ); } getItemsForIndicies(indicies: IterableLike) { return undefined; } getIndiciesForItems(items: IterableLike) { return undefined; } protected flattenItems(item: T): Iterable { return flattenItems(item, this.itemsSource); } }