11using ArrayLayouts: LayoutArray
22using BlockArrays: AbstractBlockVector, Block
3+ using FunctionImplementations: style
34using LinearAlgebra: Adjoint, Transpose
45
56# TODO : Make this more general, independent of `AbstractBlockSparseArray`.
@@ -36,17 +37,17 @@ function reblock(
3637end
3738
3839function Base. map! (f, a_dest:: AbstractArray , a_srcs:: AnyAbstractBlockSparseArray... )
39- @interface interface (a_dest, a_srcs... ) map! (f, a_dest, a_srcs... )
40+ style (a_dest, a_srcs... )( map!) (f, a_dest, a_srcs... )
4041 return a_dest
4142end
4243function Base. map! (f, a_dest:: AnyAbstractBlockSparseArray , a_srcs:: AbstractArray... )
43- @interface interface (a_dest, a_srcs... ) map! (f, a_dest, a_srcs... )
44+ style (a_dest, a_srcs... )( map!) (f, a_dest, a_srcs... )
4445 return a_dest
4546end
4647function Base. map! (
4748 f, a_dest:: AnyAbstractBlockSparseArray , a_srcs:: AnyAbstractBlockSparseArray...
4849 )
49- @interface interface (a_dest, a_srcs... ) map! (f, a_dest, a_srcs... )
50+ style (a_dest, a_srcs... )( map!) (f, a_dest, a_srcs... )
5051 return a_dest
5152end
5253
@@ -55,28 +56,40 @@ function Base.map(f, as::Vararg{AnyAbstractBlockSparseArray})
5556end
5657
5758function Base. copy! (a_dest:: AbstractArray , a_src:: AnyAbstractBlockSparseArray )
58- return @interface interface (a_src) copy! (a_dest, a_src)
59+ return style (a_src)( copy!) (a_dest, a_src)
5960end
6061
6162function Base. copyto! (a_dest:: AbstractArray , a_src:: AnyAbstractBlockSparseArray )
62- return @interface interface (a_src) copyto! (a_dest, a_src)
63+ return style (a_src)( copyto!) (a_dest, a_src)
6364end
6465
6566# Fix ambiguity error
6667function Base. copyto! (a_dest:: LayoutArray , a_src:: AnyAbstractBlockSparseArray )
67- return @interface interface (a_src) copyto! (a_dest, a_src)
68+ return style (a_src)( copyto!) (a_dest, a_src)
6869end
6970
7071function Base. copyto! (
7172 a_dest:: AbstractMatrix , a_src:: Transpose{T, <:AbstractBlockSparseMatrix{T}}
7273 ) where {T}
73- return @interface interface (a_src) copyto! (a_dest, a_src)
74+ return style (a_src)( copyto!) (a_dest, a_src)
7475end
7576
7677function Base. copyto! (
7778 a_dest:: AbstractMatrix , a_src:: Adjoint{T, <:AbstractBlockSparseMatrix{T}}
7879 ) where {T}
79- return @interface interface (a_src) copyto! (a_dest, a_src)
80+ return style (a_src)(copyto!)(a_dest, a_src)
81+ end
82+
83+ const copyto!_blocksparse = blocksparse_style (copyto!)
84+ function copyto!_blocksparse (dst:: AbstractArray , src:: AbstractArray )
85+ # return sparse_style(copyto!)(dst, src)
86+ return map! (identity, dst, src)
87+ end
88+
89+ const copy!_blocksparse = blocksparse_style (copy!)
90+ function copy!_blocksparse (dst:: AbstractArray , src:: AbstractArray )
91+ # return sparse_style(copy!)(dst, src)
92+ return copyto! (dst, src)
8093end
8194
8295# This avoids going through the generic version that calls `Base.permutedims!`,
8598# `PermutedDimsArray`).
8699# TODO : Handle slicing better in `map!` so that this can be removed.
87100function Base. permutedims (a:: AnyAbstractBlockSparseArray , perm)
88- return @interface interface (a) permutedims (a, perm)
101+ return style (a)( permutedims) (a, perm)
89102end
90103
91104# The `::AbstractBlockSparseArrayInterface` version
96109# ```
97110# TODO : Handle slicing better in `map!` so that this can be removed.
98111function Base. permutedims! (a_dest, a_src:: AnyAbstractBlockSparseArray , perm)
99- return @interface interface (a_src) permutedims! (a_dest, a_src, perm)
112+ return style (a_src)( permutedims!) (a_dest, a_src, perm)
100113end
101114
102115function Base. mapreduce (f, op, as:: AnyAbstractBlockSparseArray... ; kwargs... )
103- return @interface interface (as... ) mapreduce (f, op, as... ; kwargs... )
116+ return style (as... )( mapreduce) (f, op, as... ; kwargs... )
104117end
105118
106119function Base. iszero (a:: AnyAbstractBlockSparseArray )
107- return @interface interface (a) iszero (a)
120+ return style (a)( iszero) (a)
108121end
109122
110123function Base. isreal (a:: AnyAbstractBlockSparseArray )
111- return @interface interface (a) isreal (a)
124+ return style (a)( isreal) (a)
112125end
113126
114127# Helps with specialization of block operations by avoiding
0 commit comments