(
name: string,
bodyOrOptions: Function | { readonly self: any },
defError: Error,
pipeables: Array<Function>,
addSpan: boolean,
spanOptions: Tracer.SpanOptionsNoTrace | undefined
)
| 1248 | } as any |
| 1249 | |
| 1250 | const makeFn = ( |
| 1251 | name: string, |
| 1252 | bodyOrOptions: Function | { readonly self: any }, |
| 1253 | defError: Error, |
| 1254 | pipeables: Array<Function>, |
| 1255 | addSpan: boolean, |
| 1256 | spanOptions: Tracer.SpanOptionsNoTrace | undefined |
| 1257 | ) => { |
| 1258 | const body = typeof bodyOrOptions === "function" |
| 1259 | ? bodyOrOptions |
| 1260 | : (pipeables.pop()!).bind(bodyOrOptions.self) |
| 1261 | |
| 1262 | return defineFunctionLength(body.length, function(this: any, ...args: Array<any>) { |
| 1263 | let result = suspend(() => { |
| 1264 | const iter = body.apply(this, arguments) |
| 1265 | return isEffect(iter) ? iter : fromIteratorUnsafe(iter) |
| 1266 | }) |
| 1267 | for (let i = 0; i < pipeables.length; i++) { |
| 1268 | result = pipeables[i](result, ...args) |
| 1269 | } |
| 1270 | if (!isEffect(result)) { |
| 1271 | return result |
| 1272 | } |
| 1273 | const prevLimit = getStackTraceLimit() |
| 1274 | setStackTraceLimit(2) |
| 1275 | const callError = new globalThis.Error() |
| 1276 | setStackTraceLimit(prevLimit) |
| 1277 | return updateService( |
| 1278 | addSpan ? |
| 1279 | useSpan(name, spanOptions!, (span) => provideParentSpan(result, span)) : |
| 1280 | result, |
| 1281 | CurrentStackFrame, |
| 1282 | (prev) => ({ |
| 1283 | name, |
| 1284 | stack: fnStackCleaner(() => callError.stack), |
| 1285 | parent: { |
| 1286 | name: `${name} (definition)`, |
| 1287 | stack: fnStackCleaner(() => defError.stack), |
| 1288 | parent: prev |
| 1289 | } |
| 1290 | }) |
| 1291 | ) |
| 1292 | }) |
| 1293 | } |
| 1294 | |
| 1295 | /** @internal */ |
| 1296 | export const fnUntracedEager: Effect.fn.Untraced = ( |
no test coverage detected