nix-playgraound/notes/047-haskell-seq-queues.md

61 lines
1.3 KiB
Markdown

# Haskell Seq Queues
This note covers `44-haskell-seq-queues/`, which uses `Data.Sequence` as a queue for retry work.
---
## 1. Why `Seq` Instead of a Plain List
Lists are excellent for recursive processing, but queues want efficient work at both ends:
- append new retries to the back, and
- take the next retry from the front.
`Data.Sequence` provides those operations directly, so the example can talk about queue behavior without building a custom data structure first.
---
## 2. What the Example Demonstrates
The queue starts with four retries, then appends one more with `enqueueRetry`.
After that, `takeBatch` removes the next `n` items in FIFO order and returns:
- the batch to execute now, and
- the remaining queue for later.
That keeps the example focused on the queue contract, not on concurrency or backoff policy.
---
## 3. Why the Test Uses Rendered Queue State
The test checks:
- `api#2, worker#1` as the next batch, and
- `billing#3, search#1, auth#1` as the remaining queue.
That is enough to prove both important properties:
- newly enqueued work goes to the back, and
- batch selection keeps the original front-to-back order.
---
## 4. Commands to Try
```bash
cd 44-haskell-seq-queues
nix develop
cabal run
cabal run -- 3
cabal test
nix build
./result/bin/mini-seq-queues 3
nix run . -- 3
nix flake check
```