|
2 | 2 | interface(x) = interface(typeof(x))
|
3 | 3 | # TODO: Define as `DefaultInterface()`.
|
4 | 4 | interface(::Type) = error("Interface unknown.")
|
5 |
| -interface(x1, x_rest...) = combine_interfaces(x1, x_rest...) |
| 5 | +interface(x1, x_rest...) = combine_interfaces(interface(x1), interface.(x_rest)...) |
| 6 | + |
| 7 | +abstract type AbstractInterface end |
| 8 | + |
| 9 | +(interface::AbstractInterface)(f) = InterfaceFunction(interface, f) |
6 | 10 |
|
7 | 11 | # Adapted from `Base.Broadcast.combine_styles`.
|
8 | 12 | # Get the combined interfaces of the input objects.
|
9 |
| -function combine_interfaces(x1, x2, x_rest...) |
10 |
| - return combine_interfaces(combine_interfaces(x1, x2), x_rest...) |
| 13 | +function combine_interfaces( |
| 14 | + inter1::AbstractInterface, inter2::AbstractInterface, inter_rest::AbstractInterface... |
| 15 | +) |
| 16 | + return combine_interfaces(combine_interface_rule(inter1, inter2), inter_rest...) |
| 17 | +end |
| 18 | +function combine_interfaces(inter1::AbstractInterface, inter2::AbstractInterface) |
| 19 | + return combine_interface_rule(inter1, inter2) |
11 | 20 | end
|
12 |
| -combine_interfaces(x1, x2) = combine_interface_rule(interface(x1), interface(x2)) |
13 |
| -combine_interfaces(x) = interface(x) |
| 21 | +combine_interfaces(inter::AbstractInterface) = inter |
14 | 22 |
|
15 | 23 | # Rules for combining interfaces.
|
16 | 24 | function combine_interface_rule(
|
17 |
| - interface1::Interface, interface2::Interface |
18 |
| -) where {Interface} |
19 |
| - return interface1 |
| 25 | + inter1::Interface, inter2::Interface |
| 26 | +) where {Interface<:AbstractInterface} |
| 27 | + return inter1 |
20 | 28 | end
|
21 | 29 | # TODO: Define as `UnknownInterface()`.
|
22 |
| -combine_interface_rule(interface1, interface2) = error("No rule for combining interfaces.") |
23 |
| - |
24 |
| -abstract type AbstractInterface end |
25 |
| - |
26 |
| -(interface::AbstractInterface)(f) = InterfaceFunction(interface, f) |
| 30 | +function combine_interface_rule(inter1::AbstractInterface, inter2::AbstractInterface) |
| 31 | + return error("No rule for combining interfaces.") |
| 32 | +end |
0 commit comments