| 104 | // } |
| 105 | |
| 106 | export function naiveRateLimit( |
| 107 | n: number, |
| 108 | d: Duration.Duration |
| 109 | ) { |
| 110 | return <T>(items: Iterable<T>) => (<R, E, A, R2, E2, A2>( |
| 111 | forEachItem: (i: T) => Effect.Effect<A, E, R>, |
| 112 | forEachBatch: (a: A[]) => Effect.Effect<A2, E2, R2> |
| 113 | ) => |
| 114 | Effect.forEach( |
| 115 | Array.chunksOf(items, n), |
| 116 | (batch, i) => |
| 117 | ((i === 0) |
| 118 | ? Effect.void |
| 119 | : Effect.sleep(d)) |
| 120 | .pipe(Effect.andThen( |
| 121 | Effect |
| 122 | .forEach(batch, forEachItem, { concurrency: n }) |
| 123 | .pipe(Effect.flatMap(forEachBatch)) |
| 124 | )) |
| 125 | )) |
| 126 | } |