Skip to content

Provides time-based regulation operators like Debounce and Throttle. 100% based on Swift concurrency.

License

Notifications You must be signed in to change notification settings

sideeffect-io/Regulate

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Regulate

Regulate is a lightweight library that brings the following time-based regulation operations for things that can emit values over times (and are not using reactive programming or AsyncSequence).

  • Debounce (Outputs elements only after a specified time interval elapses between events)
  • Throttle (Outputs either the most-recent or first element pushed by a producer in the specified time interval)

Regulate is entirely backed by Swift concurrency and limits the number of created Tasks to the minimum.

let regulator = Task.debounce(dueTime: .milliseconds(200)) { (value: Int) in
  print(value)
}

// the created `regulator` can be used across `Tasks` and each call to `regulator.push(x)`
// will feed the regulation system

// the execution of the provided closure will be debounced and executed 200ms after the last call to `push(x)`

Regulate also provides SwiftUI helpers to regulate buttons and bindings out of the box. You can give a look at the Sample app.

For a Button, it is as simple as:

Button {
  print("I've been hit (throttled)!")
} label: {
  Text("Hit me")
}
.throttle(dueTime: .seconds(1))

For a Binding, there is a tiny bit of extra work:

@State private var text = ""
@StateObject private var debouncer = Debouncer<String>(dueTime: .seconds(1))
...
TextField(
  text: self
    .$text
    .perform(regulator: debouncer) { text in
      print("regulated text \(text)") // you can perform any side effect here!
    }
) {
  Text("prompt")
}

Demo

Demo Application

Adding Regulate as a Dependency

To use the Regulate library in a SwiftPM project, add the following line to the dependencies in your Package.swift file:

.package(url: "https://github.com/sideeffect-io/Regulate"),

Include "Regulate" as a dependency for your executable target:

.target(name: "<target>", dependencies: ["Regulate"]),

Finally, add import Regulate to your source code.

About

Provides time-based regulation operators like Debounce and Throttle. 100% based on Swift concurrency.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages