Add range functions
* Documentation needed
This commit is contained in:
parent
c4c20db815
commit
b1387c08c0
1 changed files with 82 additions and 0 deletions
|
@ -47,6 +47,17 @@
|
||||||
add_date/2
|
add_date/2
|
||||||
]).
|
]).
|
||||||
|
|
||||||
|
-export([
|
||||||
|
range/4,
|
||||||
|
range_seconds/3,
|
||||||
|
range_minutes/3,
|
||||||
|
range_hours/3,
|
||||||
|
range_days/3,
|
||||||
|
range_weeks/3,
|
||||||
|
range_months/3,
|
||||||
|
range_years/3
|
||||||
|
]).
|
||||||
|
|
||||||
-export([
|
-export([
|
||||||
register_parser/2,
|
register_parser/2,
|
||||||
register_parser/1,
|
register_parser/1,
|
||||||
|
@ -460,6 +471,77 @@ fmid({Y, M, D}) when D < 1 ->
|
||||||
fmid(Date) ->
|
fmid(Date) ->
|
||||||
Date.
|
Date.
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Ranges %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
|
||||||
|
range(seconds, Interval, Start, Finish) ->
|
||||||
|
range_inner(fun add_seconds/2, Interval, Start, Finish);
|
||||||
|
range(minutes, Interval, Start, Finish) ->
|
||||||
|
range_inner(fun add_minutes/2, Interval, Start, Finish);
|
||||||
|
range(hours, Interval, Start, Finish) ->
|
||||||
|
range_inner(fun add_hours/2, Interval, Start, Finish);
|
||||||
|
range(days, Interval, Start, Finish) ->
|
||||||
|
range_inner(fun add_days/2, Interval, Start, Finish);
|
||||||
|
range(weeks, Interval, Start, Finish) ->
|
||||||
|
range_inner(fun add_weeks/2, Interval, Start, Finish);
|
||||||
|
range(months, Interval, Start, Finish) ->
|
||||||
|
range_inner(fun add_months/2, Interval, Start, Finish);
|
||||||
|
range(years, Interval, Start, Finish) ->
|
||||||
|
range_inner(fun add_years/2, Interval, Start, Finish).
|
||||||
|
|
||||||
|
range_inner(IntervalFun, Interval, Start, Finish) when Interval > 0 ->
|
||||||
|
%% If Interval>0, then we're ascending, and we want to compare start/end
|
||||||
|
%% dates normally
|
||||||
|
CompareFun = fun(S, F) -> compare(S, F) end,
|
||||||
|
range_normalizer(IntervalFun, Interval, CompareFun, Start, Finish);
|
||||||
|
range_inner(IntervalFun, Interval, Start, Finish) when Interval < 0 ->
|
||||||
|
%% If Interval<0, then we're descending, and we want to compare start/end
|
||||||
|
%% dates backwards (we want to end when the Start Date is Lower than
|
||||||
|
%% Finish)
|
||||||
|
CompareFun = fun(S, F) -> compare(F, S) end,
|
||||||
|
range_normalizer(IntervalFun, Interval, CompareFun, Start, Finish);
|
||||||
|
range_inner(_, Interval, _, _) when Interval==0 ->
|
||||||
|
throw(interval_cannot_be_zero).
|
||||||
|
|
||||||
|
range_normalizer(IntervalFun, Interval, CompareFun, Start0, Finish0) ->
|
||||||
|
%% Convert dates to unixtime for speed's sake
|
||||||
|
Start = to_unixtime(Start0),
|
||||||
|
Finish = to_unixtime(Finish0),
|
||||||
|
%% Prepare the incrementer, so we just need to pass the date to the incrementer.
|
||||||
|
Incrementer = fun(D) -> IntervalFun(Interval, D) end,
|
||||||
|
range_worker(Incrementer, CompareFun, Start, Finish).
|
||||||
|
|
||||||
|
range_worker(Incrementer, CompareFun, Start, Finish) ->
|
||||||
|
case CompareFun(Start, Finish) of
|
||||||
|
0 -> [Finish]; %% Equal, so we add our Finish value
|
||||||
|
1 -> []; %% Start is after Finish, so we add nothing
|
||||||
|
-1 -> %% Start is before Finish, so we include it, and recurse
|
||||||
|
NextDay = Incrementer(Start),
|
||||||
|
[Start | range_worker(Incrementer, CompareFun, NextDay, Finish)]
|
||||||
|
end.
|
||||||
|
|
||||||
|
range_seconds(Interval, Start, Finish) ->
|
||||||
|
range(seconds, Interval, Start, Finish).
|
||||||
|
|
||||||
|
range_minutes(Interval, Start, Finish) ->
|
||||||
|
range(minutes, Interval, Start, Finish).
|
||||||
|
|
||||||
|
range_hours(Interval, Start, Finish) ->
|
||||||
|
range(hours, Interval, Start, Finish).
|
||||||
|
|
||||||
|
range_days(Interval, Start, Finish) ->
|
||||||
|
range(days, Interval, Start, Finish).
|
||||||
|
|
||||||
|
range_weeks(Interval, Start, Finish) ->
|
||||||
|
range(weeks, Interval, Start, Finish).
|
||||||
|
|
||||||
|
range_months(Interval, Start, Finish) ->
|
||||||
|
range(months, Interval, Start, Finish).
|
||||||
|
|
||||||
|
range_years(Interval, Start, Finish) ->
|
||||||
|
range(years, Interval, Start, Finish).
|
||||||
|
|
||||||
|
|
||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Timezone Stuff %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Timezone Stuff %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue