@@ -72,16 +72,21 @@ function Base.issorted(a::RangeCumsum{<:Any,<:AbstractUnitRange{<:Integer}})
72
72
length (r2) <= 1 + (last (r) >= 0 )
73
73
end
74
74
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)
77
82
first (a)
78
83
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 )
81
86
last (a)
82
87
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 )
85
90
r = parent (a)
86
91
if - first (r) in r
87
92
r2 = r[searchsortedfirst (r, - first (r)+ 1 ): end ]
@@ -90,8 +95,8 @@ function Base.maximum(a::RangeCumsum{<:Any, <:AbstractUnitRange{<:Integer}})
90
95
max (first (r), sum (r))
91
96
end
92
97
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 )
95
100
r = parent (a)
96
101
if zero (eltype (r)) in r
97
102
r2 = r[firstindex (r): searchsortedlast (r, zero (eltype (r)))]
0 commit comments