Home

Awesome

<img src="https://ptsochantaris.github.io/trailer/SemalotLogo.webp" alt="Logo" width=256 align="right">

Semalot

πŸ‘¨ "Semalot!" πŸ‘¨β€πŸ¦± "Semalot!!" πŸ‘΄ "Semalot!!!" πŸ€¦β€β™€οΈ "It's only a counter…" πŸ‘¨πŸ‘¨β€πŸ¦±πŸ‘΄ "Shh!!!!"

An elementary counting semaphore for async tasks in Swift, which I use a lot in my code so I thought I should turn it into a package!

Currently used in

Detailed docs can be found here

Overview

Does what it says on the tin. It's simple and efficient, does not use any dispatch locks, and does not cause any Task queue congestion.

let maxConcurrentOperations = Semalot(tickets: 3)

try await withThrowingTaskGroup { group in
    for request in lotsOfRequests {
        await maxConcurrentOperations.takeTicket()
        group.addTask {
            let data = try await urlSession.data(for: request).0
            await doThings(with: data)
            maxConcurrentOperations.returnTicket()
        }
    }
}

License

Copyright (c) 2023 Paul Tsochantaris. Licensed under the MIT License, see LICENSE for details.