import Foundation

public final class Action<Arguments> {
    public let action: (Arguments) -> Void
    
    public init(_ action: @escaping (Arguments) -> Void) {
        self.action = action
    }
    
    public func callAsFunction(_ arguments: Arguments) {
        self.action(arguments)
    }
}

public final class ActionSlot<Arguments>: Equatable {
    private var target: ((Arguments) -> Void)?
    
    public init() {
    }
    
    public static func ==(lhs: ActionSlot<Arguments>, rhs: ActionSlot<Arguments>) -> Bool {
        return lhs === rhs
    }
    
    public func connect(_ target: @escaping (Arguments) -> Void) {
        self.target = target
    }
    
    public func invoke(_ arguments: Arguments) {
        self.target?(arguments)
    }
}