MCPcopy Index your code
hub / github.com/JavaScriptRegenerated/yieldparser / invertInner

Function invertInner

src/index.ts:181–266  ·  view source on GitHub ↗
(
  needle: {},
  iterable: ParseGenerator<Result>,
)

Source from the content-addressed store, hash-verified

179}
180
181function invertInner<Result = void>(
182 needle: {},
183 iterable: ParseGenerator<Result>,
184): { type: 'done' | 'prefix'; components: ReadonlyArray<string> } | null {
185 let reply: unknown | undefined;
186
187 const expectedKeys = Object.keys(needle);
188 if (expectedKeys.length === 0) {
189 throw new Error("Expected object must have keys.");
190 }
191 const iterator = iterable[Symbol.iterator]();
192 const components: Array<string> = [];
193 const regexpMap = new Map<Symbol, { regexp: RegExp; index: number }>();
194
195 while (true) {
196 const next = iterator.next(reply as any);
197 if (next.done) {
198 if (next.value instanceof Error) {
199 return null;
200 }
201
202 const result = next.value;
203 if (result == null) {
204 return { type: 'prefix', components: Object.freeze(components) };
205 }
206
207 const resultKeys = new Set(Object.keys(result));
208 if (
209 expectedKeys.length === resultKeys.size &&
210 expectedKeys.every((key) => {
211 if (!resultKeys.has(key)) {
212 return false;
213 }
214
215 if (typeof result[key] === 'symbol') {
216 const entry = regexpMap.get(result[key]);
217 if (entry !== undefined) {
218 if (entry.regexp.test(needle[key])) {
219 components[entry.index] = needle[key];
220 return true;
221 }
222 }
223 }
224
225 return result[key] === needle[key];
226 })
227 ) {
228 return { type: 'done', components: Object.freeze(components) };
229 } else {
230 return null;
231 }
232 }
233
234 const yielded = next.value;
235 const choices =
236 typeof yielded !== "string" && (yielded as any)[Symbol.iterator]
237 ? (yielded as Iterable<unknown>)
238 : [yielded];

Callers 1

invertFunction · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected