import {pointerToPrism} from '../pointerToPrism' import type {Pointer} from '../pointer' import {isPointer} from '../pointer' import Ticker from '../Ticker' import type {Prism} from './Interface' import {isPrism} from './Interface' export default function* iterateOver( pointerOrPrism: Prism | Pointer, ): Generator { let d if (isPointer(pointerOrPrism)) { d = pointerToPrism(pointerOrPrism) as Prism } else if (isPrism(pointerOrPrism)) { d = pointerOrPrism } else { throw new Error(`Only pointers and prisms are supported`) } const ticker = new Ticker() const untap = d.onChange(ticker, (v) => {}) try { while (true) { ticker.tick() yield d.getValue() } } finally { untap() } }