Current section

Files

Jump to
gossamer src utils iteration.ffi.mjs
Raw

src/utils/iteration.ffi.mjs

// src/utils/iteration.ffi.ts
import * as $asyncYielder from "../gossamer/async_yielder.mjs";
import * as $yielder from "../../gleam_yielder/gleam/yielder.mjs";
function jsIteratorAsYielder(jsIterator) {
return $yielder.unfold(jsIterator, (current) => {
const result = current.next();
if (result.done) return $yielder.Step$Done();
return $yielder.Step$Next(result.value, current);
});
}
function yielderAsJsIterator(yielder) {
let current = yielder;
const iter = {
next() {
const step3 = $yielder.step(current);
if ($yielder.Step$isDone(step3)) {
return { done: true, value: void 0 };
}
const value = $yielder.Step$Next$element(step3);
current = $yielder.Step$Next$accumulator(step3);
return { done: false, value };
},
[Symbol.iterator]() {
return this;
}
};
return iter;
}
function jsAsyncIteratorAsAsyncYielder(jsIterator) {
return $asyncYielder.unfold_async(jsIterator, async (current) => {
const result = await current.next();
if (result.done) return $asyncYielder.Step$Done();
return $asyncYielder.Step$Next(result.value, current);
});
}
function asyncYielderAsJsAsyncIterator(yielder) {
let current = yielder;
const iter = {
async next() {
const step3 = await $asyncYielder.step(current);
if ($asyncYielder.Step$isDone(step3)) {
return { done: true, value: void 0 };
}
const value = $asyncYielder.Step$Next$element(step3);
current = $asyncYielder.Step$Next$accumulator(
step3
);
return { done: false, value };
},
[Symbol.asyncIterator]() {
return this;
}
};
return iter;
}
export {
asyncYielderAsJsAsyncIterator,
jsAsyncIteratorAsAsyncYielder,
jsIteratorAsYielder,
yielderAsJsIterator
};