Skip to content

Commit 9cd03b9

Browse files
authored
Initial value in minimum/maximum (#222)
1 parent 633dac8 commit 9cd03b9

File tree

2 files changed

+17
-8
lines changed

2 files changed

+17
-8
lines changed

src/cumsum.jl

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -72,16 +72,21 @@ function Base.issorted(a::RangeCumsum{<:Any,<:AbstractUnitRange{<:Integer}})
7272
length(r2) <= 1 + (last(r) >= 0)
7373
end
7474

75-
function Base.minimum(a::RangeCumsum{<:Any, <:OneTo})
76-
isempty(a) && throw(ArgumentError("RangeCumsum must be non-empty"))
75+
struct _InitialValue end
76+
77+
_reduce_empty(init) = init
78+
_reduce_empty(::_InitialValue) = throw(ArgumentError("RangeCumsum must be non-empty"))
79+
80+
function Base.minimum(a::RangeCumsum{<:Any, <:OneTo}; init = _InitialValue())
81+
isempty(a) && return _reduce_empty(init)
7782
first(a)
7883
end
79-
function Base.maximum(a::RangeCumsum{<:Any, <:OneTo})
80-
isempty(a) && throw(ArgumentError("RangeCumsum must be non-empty"))
84+
function Base.maximum(a::RangeCumsum{<:Any, <:OneTo}; init = _InitialValue())
85+
isempty(a) && return _reduce_empty(init)
8186
last(a)
8287
end
83-
function Base.maximum(a::RangeCumsum{<:Any, <:AbstractUnitRange{<:Integer}})
84-
isempty(a) && throw(ArgumentError("RangeCumsum must be non-empty"))
88+
function Base.maximum(a::RangeCumsum{<:Any, <:AbstractUnitRange{<:Integer}}; init = _InitialValue())
89+
isempty(a) && return _reduce_empty(init)
8590
r = parent(a)
8691
if -first(r) in r
8792
r2 = r[searchsortedfirst(r, -first(r)+1):end]
@@ -90,8 +95,8 @@ function Base.maximum(a::RangeCumsum{<:Any, <:AbstractUnitRange{<:Integer}})
9095
max(first(r), sum(r))
9196
end
9297
end
93-
function Base.minimum(a::RangeCumsum{<:Any, <:AbstractUnitRange{<:Integer}})
94-
isempty(a) && throw(ArgumentError("RangeCumsum must be non-empty"))
98+
function Base.minimum(a::RangeCumsum{<:Any, <:AbstractUnitRange{<:Integer}}; init = _InitialValue())
99+
isempty(a) && return _reduce_empty(init)
95100
r = parent(a)
96101
if zero(eltype(r)) in r
97102
r2 = r[firstindex(r):searchsortedlast(r, zero(eltype(r)))]

test/test_cumsum.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,13 +107,17 @@ cmpop(p) = isinteger(real(first(p))) && isinteger(real(step(p))) ? (==) : (≈)
107107
a = RangeCumsum(2:1)
108108
@test_throws ArgumentError minimum(a)
109109
@test_throws ArgumentError maximum(a)
110+
@test minimum(a, init=10) == 10
111+
@test maximum(a, init=0) == 0
110112

111113
a = RangeCumsum(Base.OneTo(4))
112114
@test maximum(a) == 10
113115
@test minimum(a) == 1
114116
a = RangeCumsum(Base.OneTo(0))
115117
@test_throws ArgumentError minimum(a)
116118
@test_throws ArgumentError maximum(a)
119+
@test minimum(a, init=10) == 10
120+
@test maximum(a, init=0) == 0
117121

118122
@testset "infinite" begin
119123
r = RangeCumsum(-5:ℵ₀)

0 commit comments

Comments
 (0)