Function std.datetime.Interval.bwdRange
Returns a range which iterates backwards over the interval, starting
at
, using end
func
to generate each successive time
point.
The range's front
is the interval's
. end
func
is
used to generate the next front
when popFront
is called. If
popFirst
is
, then PopFirst.yes
popFront
is called
before the range is returned (so that front
is a time point which
func
would generate).
If func
ever generates a time point greater than or equal to
the current front
of the range, then a DateTimeException
will
be thrown. The range will be empty
and iteration complete when
func
generates a time point equal to or less than the
of the interval.
begin
There are helper functions in this module which generate common
delegates to pass to
. Their documentation starts with
"Range-generating function," making them easily searchable.
bwdRange
Prototype
IntervalRange!(TP,Direction.bwd) bwdRange( TP delegate(in TP) func, PopFirst popFirst = PopFirst.no ) const;
Parameters
Name | Description |
---|---|
func | The function used to generate the time points of the range over the interval. |
popFirst | Whether popFront should be called on the range
before returning it. |
Throws
DateTimeException
if this interval is empty
.
Warning
func
must be logically pure. Ideally, func
would be a function pointer to a pure function, but forcing
func
to be pure is far too restrictive to be useful, and
in order to have the ease of use of having functions which generate
functions to pass to
, fwdRange
func
must be a
delegate.
If func
retains state which changes as it is called, then
some algorithms will not work correctly, because the range's
save
will have failed to have really saved the range's state.
To avoid such bugs, don't pass a delegate which is
not logically pure to
. If fwdRange
func
is given the
same time point with two different calls, it must return the same
result both times.
Of course, none of the functions in this module have this problem, so it's only relevant for custom delegates.
Examples
auto interval = Interval!Date(Date(2010, 9, 1), Date(2010, 9, 9)); auto func = (in Date date) //For iterating over even-numbered days. { if((date.day & 1) == 0) return date - dur!"days"(2); return date - dur!"days"(1); }; auto range = interval.bwdRange(func); //An odd day. Using PopFirst.yes would have made this Date(2010, 9, 8). assert(range.front == Date(2010, 9, 9)); range.popFront(); assert(range.front == Date(2010, 9, 8)); range.popFront(); assert(range.front == Date(2010, 9, 6)); range.popFront(); assert(range.front == Date(2010, 9, 4)); range.popFront(); assert(range.front == Date(2010, 9, 2)); range.popFront(); assert(range.empty);
Authors
Jonathan M Davis and Kato Shoichi