https://github.com/0xlet/later
Thin Swift-NIO Async Layer Using Dispatch
https://github.com/0xlet/later
swift swift-nio
Last synced: 5 months ago
JSON representation
Thin Swift-NIO Async Layer Using Dispatch
- Host: GitHub
- URL: https://github.com/0xlet/later
- Owner: 0xLet
- License: mit
- Created: 2020-08-03T15:43:02.000Z (almost 5 years ago)
- Default Branch: main
- Last Pushed: 2020-10-03T01:10:26.000Z (over 4 years ago)
- Last Synced: 2024-12-12T17:12:53.876Z (5 months ago)
- Topics: swift, swift-nio
- Language: Swift
- Homepage:
- Size: 114 KB
- Stars: 5
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Later
Promise and do work later.
## [Swift-NIO EventLoops](https://github.com/apple/swift-nio#eventloops-and-eventloopgroups)
## typealiases
```swift
public typealias LaterValue = EventLoopFuture
public typealias LaterPromise = EventLoopPromise
public typealias RepeatedScheduledTask = RepeatedTask
public typealias ScheduledTask = Scheduled
```## Later.Methods
#### promise
```swift
promise(work: @escaping (LaterPromise) -> Void) -> LaterValue
promise(work: @escaping (LaterPromise) -> Void) -> LaterValue
```#### do
```swift
do(withDelay delay: UInt32 = 0,
work: @escaping () throws -> T) -> LaterValuedo(withDelay delay: UInt32 = 0,
work: @escaping () throws -> Void) -> LaterValue
```#### schedule
```swift
scheduleRepeatedTask(initialDelay: TimeAmount = TimeAmount.seconds(0),
delay: TimeAmount = TimeAmount.seconds(0),
work: @escaping (RepeatedScheduledTask) -> Void) -> RepeatedScheduledTask
scheduleTask(in time: TimeAmount = TimeAmount.seconds(0),
work: @escaping () -> Void) -> ScheduledTask
```#### main
```swift
main(withDelay delay: UInt32 = 0,
work: @escaping () throws -> Void) -> LaterValue
```#### fetch
```swift
fetch(url: URL) -> LaterValue<(Data?, URLResponse?, Error?)>fetch(url: URL,
work: @escaping (Data?, URLResponse?, Error?) -> Void) -> LaterValuefetch(url: URL,
errorHandler: ((Error) -> Void)? = nil,
responseHandler: ((URLResponse) -> Void)? = nil,
dataHandler: ((Data) -> Void)? = nil) -> LaterValue
```#### post
```swift
/// ["Content-Type": "application/json; charset=utf-8"]
post(url: URL, withData data: () -> Data) -> LaterValue<(Data?, URLResponse?, Error?)>
```## LaterValue
```swift
and: Later.Type { Later.self }
when(value: @escaping (LaterValue) -> Void) -> Later.Type
```## Contract
```swift
public class Contract {
public init(initialValue: Value? = nil,
onResignHandler: ((Value?) -> Void)? = nil,
onChangeHandler: ((Value?) -> Void)? = nil) {
onResign = onResignHandler
onChange = onChangeHandler
value = initialValue
start()
promise?.succeed(value)
}
}
```****
## Examples
#### promise
```swift
let promise = Later.promise { (promise) in
sleep(10)
promise.succeed(())
}promise.whenSuccess { page in
print("Page received")
}promise.whenFailure { error in
print("Error: \(error)")
}
```#### do
```swift
Later.do(withDelay: 2) {
work()
}
```#### schedule
```swift
let task = Later.scheduleRepeatedTask(initialDelay: .seconds(0),
delay: .seconds(1)) { (task) in
work()
}Later.scheduleTask(in: .seconds(3)) {
task.cancel()
}
```#### main
```swift
Later.main {
// Update UI
self.value = "Fetching Again..."
}
```#### fetch
```swift
Later.fetch(url: URL(string: "https://jsonplaceholder.typicode.com/todos/1")!)
.whenSuccess { (data, response, error) in
guard let data = data else {
return
}
self.value = String(data: data, encoding: .utf8) ?? "-1"
}
```#### post
```swift
Later.post(url: URL(string: "https://postman-echo.com/post")!) {
"Some Data".data(using: .utf8)!
}
.when { event in
event
.whenSuccess { (data, reponse, _) in
print(String(data: data!, encoding: .utf8) ?? "-1")
print(reponse)
}
}
```#### and
```swift
Later
.do { print("Do Something") }
.and
.do { print("Do Something Else") }
```#### when
```swift
Later
.do { print("Do Something") }
.when { event in
event
.whenComplete { _ in
print("Do Last")
}
}
.do { print("Do Something Else") }
```### Contract
```swift
let textContract = Contract()
let label = Label("❗️👀")
textContract
.onChange { value in
Later.main { [weak self] in
self?.label.text = value
}
}
.onResign { lastValue in
Later.main { [weak self] in
self?.label.text = "Contract was Resigned\nLast Value: \(lastValue ?? "-1")"
}
}textContract.value = "Hello, World!"
```### promise + fetch
```swift
private lazy var futureImage: LaterValue = Later.promise { (promise) in
URL(string: self.imageURL).map { url in
Later.fetch(url: url) { data in
guard let image = UIImage(data: data) else {
promise.succeed(nil)
return
}
promise.succeed(image)
}
}
}
```