Skip to content

Commit 5aa5aff

Browse files
authored
Fix combining interfaces (#29)
1 parent 8371a5e commit 5aa5aff

File tree

3 files changed

+21
-17
lines changed

3 files changed

+21
-17
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "DerivableInterfaces"
22
uuid = "6c5e35bf-e59e-4898-b73c-732dcc4ba65f"
33
authors = ["ITensor developers <[email protected]> and contributors"]
4-
version = "0.3.15"
4+
version = "0.3.16"
55

66
[deps]
77
Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e"

src/abstractinterface.jl

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,31 @@
22
interface(x) = interface(typeof(x))
33
# TODO: Define as `DefaultInterface()`.
44
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)
610

711
# Adapted from `Base.Broadcast.combine_styles`.
812
# 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)
1120
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
1422

1523
# Rules for combining interfaces.
1624
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
2028
end
2129
# 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

src/derive_macro.jl

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -165,9 +165,7 @@ function derive_func_from_types(types::Expr, func::Expr)
165165
end
166166
return argname(i)
167167
end
168-
interface = globalref_derive(
169-
:(DerivableInterfaces.combine_interfaces($(active_argnames...)))
170-
)
168+
interface = globalref_derive(:(DerivableInterfaces.interface($(active_argnames...))))
171169
return derive_interface_func(interface, new_func)
172170
end
173171

0 commit comments

Comments
 (0)