| 334 | <A>(self: TQueue.TDequeue<A>, min: number, max: number): STM.STM<Array<A>> => |
| 335 | stm.suspend(() => { |
| 336 | const takeRemainder = ( |
| 337 | min: number, |
| 338 | max: number, |
| 339 | acc: Chunk.Chunk<A> |
| 340 | ): STM.STM<Chunk.Chunk<A>> => { |
| 341 | if (max < min) { |
| 342 | return core.succeed(acc) |
| 343 | } |
| 344 | return pipe( |
| 345 | self.takeUpTo(max), |
| 346 | core.flatMap((taken) => { |
| 347 | const remaining = min - taken.length |
| 348 | if (remaining === 1) { |
| 349 | return pipe( |
| 350 | self.take, |
| 351 | core.map((a) => pipe(acc, Chunk.appendAll(Chunk.unsafeFromArray(taken)), Chunk.append(a))) |
| 352 | ) |
| 353 | } |
| 354 | if (remaining > 1) { |
| 355 | return pipe( |
| 356 | self.take, |
| 357 | core.flatMap((a) => |
| 358 | takeRemainder( |
| 359 | remaining - 1, |
| 360 | max - taken.length - 1, |
| 361 | pipe(acc, Chunk.appendAll(Chunk.unsafeFromArray(taken)), Chunk.append(a)) |
| 362 | ) |
| 363 | ) |
| 364 | ) |
| 365 | } |
| 366 | return core.succeed(pipe(acc, Chunk.appendAll(Chunk.unsafeFromArray(taken)))) |
| 367 | }) |
| 368 | ) |
| 369 | } |
| 370 | return core.map(takeRemainder(min, max, Chunk.empty<A>()), (c) => Array.from(c)) |
| 371 | }) |
| 372 | ) |