E.num/Sources/E/Function.swift

51 lines
1.0 KiB
Swift

//
// Function.swift
// E
//
// Created by Zach Eriksen on 9/29/20.
//
@dynamicCallable
public enum Function {
case void(() -> ())
case `in`((Variable) -> ())
case out(() -> Variable)
case `inout`((Variable) -> Variable)
@discardableResult
func dynamicallyCall(withArguments args: [Variable]) -> Variable? {
guard args.isEmpty else {
return run()
}
guard args.count > 1 else {
return run(args.first)
}
return run(.array(args))
}
}
public extension Function {
@discardableResult
func run(_ value: Variable? = nil) -> Variable? {
switch self {
case .void(let closure):
closure()
case .in(let closure):
if let value = value {
closure(value)
}
case .out(let closure):
return closure()
case .inout(let closure):
if let value = value {
return closure(value)
}
}
return nil
}
}