MCPcopy Create free account
hub / github.com/Effect-TS/effect / take

Function take

packages/effect/src/Sink.ts:1153–1183  ·  view source on GitHub ↗
(n: number)

Source from the content-addressed store, hash-verified

1151 * @since 2.0.0
1152 */
1153export const take = <In>(n: number): Sink<Array<In>, In, In> =>
1154 fromTransform((upstream) => {
1155 const taken: Array<In> = []
1156 if (n <= 0) {
1157 return Effect.succeed([taken] as const)
1158 }
1159 let leftover: NonEmptyReadonlyArray<In> | undefined = undefined
1160 return upstream.pipe(
1161 Effect.flatMap((arr) => {
1162 if (taken.length + arr.length <= n) {
1163 taken.push(...arr)
1164 if (taken.length === n) {
1165 return Cause.done()
1166 }
1167 return Effect.void
1168 }
1169 for (let i = 0; i < arr.length; i++) {
1170 taken.push(arr[i])
1171 if (taken.length === n) {
1172 if ((i + 1) < arr.length) {
1173 leftover = arr.slice(i + 1) as any
1174 }
1175 return Cause.done()
1176 }
1177 }
1178 return Effect.void
1179 }),
1180 Effect.forever({ disableYield: true }),
1181 Pull.catchDone(() => Effect.succeed([taken, leftover] as const))
1182 )
1183 })
1184
1185/**
1186 * Runs this sink until it yields a result, then uses that result to create

Callers 3

Array.tsFile · 0.70
Chunk.tsFile · 0.70
pollFunction · 0.50

Calls 5

pushMethod · 0.80
fromTransformFunction · 0.70
pipeMethod · 0.65
succeedMethod · 0.45
doneMethod · 0.45

Tested by

no test coverage detected