Swiftpack.co -  Package - 0xLet/Observation
Swiftpack.co is a collection of thousands of indexed Swift packages. Search packages.
0xLet/Observation
🔭 Observable variable project using E.num and Chain
.package(url: "https://github.com/0xLet/Observation.git", from: "0.0.2")

Observation

What is this

This is a work in progress project to experiment with Chain and E.num in useful ways.

Dependencies

E.num

Variable

public enum Variable: Hashable {
    case void
    case bool(Bool)
    case int(Int)
    case float(Float)
    case double(Double)
    case string(String)
    case set(Set<Variable>)
    case array([Variable])
    case dictionary([Variable: Variable])
}

Function

public enum Function {
    case void(() -> ())
    case `in`((Variable) -> ())
    case out(() -> Variable)
    case `inout`((Variable) -> Variable)
}

Chain

public indirect enum Chain {
    case end
    case complete(E.Function?)
    case link(E.Function, Chain)
    case background(E.Function, Chain)
    case multi([Chain])
}

Example Code

let observedValue: ObservedValue<Int> = ObservedValue()

observedValue.didChangeHandler = .complete(
    .void {
        sleep(1)
        print("Done!")
        XCTAssertNotNil(observedValue.value)
    }
)

observedValue.update(value: 5)
observedValue.update(value: 15)
observedValue.update(value: 25)

Property Wrapper

@Observed var index = 4

_index.didChangeHandler = .link(
    .void {
        viewModel.update(value: values[index])
    },
    .complete(
        .void {
            updateUI()
        }
    )
)

guard values.count < index && index >= 0 else {
    return
}

index += 1

GitHub

link
Stars: 2
Last commit: 4 weeks ago

Related Packages

Release Notes

0.0.2
4 weeks ago

Modifiable callChain

public class ObservedValue<T> {
    private(set) public var value: T?
    
    public var callChain: Chain = .end
    public var didChangeHandler: Chain?
    
    public init(value: T? = nil) {
        self.value = value
        self.callChain = .complete(
            .out { [weak self] in
                self?.didChangeHandler?.run(name: "ObservedValue<\(T.self)>.didChangeHandler") ?? .void
            }
        )
    }

    @discardableResult
    public func update(value: T) -> Variable {
        self.value = value
        
        return callChain.run(name: "ObservedValue<\(T.self)>.callChain")
    }
}

Swiftpack is being maintained by Petr Pavlik | @ptrpavlik | @swiftpackco