File tree Expand file tree Collapse file tree 3 files changed +60
-0
lines changed Expand file tree Collapse file tree 3 files changed +60
-0
lines changed Original file line number Diff line number Diff line change @@ -94,6 +94,23 @@ information is adequately contained in the type for standard tools to work. In
94
94
these cases, ` restructure ` gives a way to convert for example an ` Array ` into
95
95
a matching ` ArrayPartition ` .
96
96
97
+ ## known_first(::Type{T})
98
+
99
+ If ` first ` of instances of type ` T ` are known at compile time, return that first
100
+ element. Otherwise, return ` nothing ` . For example, ` known_first(Base.OneTo{Int}) `
101
+ returns ` one(Int) ` .
102
+
103
+ ## known_last(::Type{T})
104
+
105
+ If ` last ` of instances of type ` T ` are known at compile time, return that
106
+ last element. Otherwise, return ` nothing ` .
107
+
108
+ ## known_step(::Type{T})
109
+
110
+ If ` step ` of instances of type ` T ` are known at compile time, return that step.
111
+ Otherwise, returns ` nothing ` . For example, ` known_step(UnitRange{Int}) ` returns
112
+ ` one(Int) ` .
113
+
97
114
# List of things to add
98
115
99
116
- https://github.com/JuliaLang/julia/issues/22216
Original file line number Diff line number Diff line change @@ -491,6 +491,38 @@ function restructure(x::Array,y)
491
491
reshape (convert (Array,y),size (x)... )
492
492
end
493
493
494
+ """
495
+ known_first(::Type{T})
496
+
497
+ If `first` of an instance of type `T` is known at compile time, return it.
498
+ Otherwise, return `nothing`.
499
+
500
+ @test isnothing(known_first(typeof(1:4)))
501
+ @test isone(known_first(typeof(Base.OneTo(4))))
502
+ """
503
+ known_first (:: Any ) = nothing
504
+ known_first (:: Type{Base.OneTo{T}} ) where {T} = one (T)
505
+ """
506
+ known_last(::Type{T})
507
+
508
+ If `last` of an instance of type `T` is known at compile time, return it.
509
+ Otherwise, return `nothing`.
510
+
511
+ @test isnothing(known_last(typeof(1:4)))
512
+ """
513
+ known_last (:: Any ) = nothing
514
+ """
515
+ known_step(::Type{T})
516
+
517
+ If `step` of an instance of type `T` is known at compile time, return it.
518
+ Otherwise, return `nothing`.
519
+
520
+ @test isnothing(known_step(typeof(1:0.2:4)))
521
+ @test isone(known_step(typeof(1:4)))
522
+ """
523
+ known_step (:: Any ) = nothing
524
+ known_step (:: Type{<:AbstractUnitRange{T}} ) where {T} = one (T)
525
+
494
526
function __init__ ()
495
527
496
528
@require SuiteSparse= " 4607b0f0-06f3-5cda-b6b1-a6196a1729e9" begin
Original file line number Diff line number Diff line change @@ -172,3 +172,14 @@ using ArrayInterface: parent_type
172
172
@test parent_type (Symmetric (x)) <: typeof (x)
173
173
@test parent_type (UpperTriangular (x)) <: typeof (x)
174
174
end
175
+
176
+ @testset " Range Interface" begin
177
+ @test isnothing (ArrayInterface. known_first (typeof (1 : 4 )))
178
+ @test isone (ArrayInterface. known_first (typeof (Base. OneTo (4 ))))
179
+
180
+ @test isnothing (ArrayInterface. known_last (typeof (1 : 4 )))
181
+
182
+ @test isnothing (ArrayInterface. known_step (typeof (1 : 0.2 : 4 )))
183
+ @test isone (ArrayInterface. known_step (typeof (1 : 4 )))
184
+ end
185
+
You can’t perform that action at this time.
0 commit comments