Some checks failed
Main Confidence / confidence (push) Failing after 45s
## Summary - introduce surface-aware compressed governance outcomes and reuse the shared truth/explanation seams for operator-first summaries - apply the compressed outcome hierarchy across baseline, evidence, review, review-pack, canonical review/evidence, and artifact-oriented operation-run surfaces - expand spec 214 fixtures and Pest coverage, and fix tenant-panel route assertions by generating explicit tenant-panel URLs in the affected Filament tests ## Validation - `cd apps/platform && ./vendor/bin/sail bin pint --dirty --format agent` - focused governance compression suite from `specs/214-governance-outcome-compression/quickstart.md` passed (`68` tests, `445` assertions) - `cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Feature/Filament/InventoryItemResourceTest.php tests/Feature/Filament/BackupSetUiEnforcementTest.php tests/Feature/Filament/RestoreRunUiEnforcementTest.php` passed (`18` tests, `81` assertions) Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de> Reviewed-on: #253
61 lines
2.1 KiB
Plaintext
61 lines
2.1 KiB
Plaintext
import { Observable } from '../Observable';
|
|
import { SchedulerLike } from '../types';
|
|
import { iterator as Symbol_iterator } from '../symbol/iterator';
|
|
import { isFunction } from '../util/isFunction';
|
|
import { executeSchedule } from '../util/executeSchedule';
|
|
|
|
/**
|
|
* Used in {@link scheduled} to create an observable from an Iterable.
|
|
* @param input The iterable to create an observable from
|
|
* @param scheduler The scheduler to use
|
|
*/
|
|
export function scheduleIterable<T>(input: Iterable<T>, scheduler: SchedulerLike) {
|
|
return new Observable<T>((subscriber) => {
|
|
let iterator: Iterator<T, T>;
|
|
|
|
// Schedule the initial creation of the iterator from
|
|
// the iterable. This is so the code in the iterable is
|
|
// not called until the scheduled job fires.
|
|
executeSchedule(subscriber, scheduler, () => {
|
|
// Create the iterator.
|
|
iterator = (input as any)[Symbol_iterator]();
|
|
|
|
executeSchedule(
|
|
subscriber,
|
|
scheduler,
|
|
() => {
|
|
let value: T;
|
|
let done: boolean | undefined;
|
|
try {
|
|
// Pull the value out of the iterator
|
|
({ value, done } = iterator.next());
|
|
} catch (err) {
|
|
// We got an error while pulling from the iterator
|
|
subscriber.error(err);
|
|
return;
|
|
}
|
|
|
|
if (done) {
|
|
// If it is "done" we just complete. This mimics the
|
|
// behavior of JavaScript's `for..of` consumption of
|
|
// iterables, which will not emit the value from an iterator
|
|
// result of `{ done: true: value: 'here' }`.
|
|
subscriber.complete();
|
|
} else {
|
|
// The iterable is not done, emit the value.
|
|
subscriber.next(value);
|
|
}
|
|
},
|
|
0,
|
|
true
|
|
);
|
|
});
|
|
|
|
// During finalization, if we see this iterator has a `return` method,
|
|
// then we know it is a Generator, and not just an Iterator. So we call
|
|
// the `return()` function. This will ensure that any `finally { }` blocks
|
|
// inside of the generator we can hit will be hit properly.
|
|
return () => isFunction(iterator?.return) && iterator.return();
|
|
});
|
|
}
|