| 1151 | * @since 2.0.0 |
| 1152 | */ |
| 1153 | export 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 |