1 | import { DateWithZone } from './datewithzone';
|
2 | import { iter } from './iter/index';
|
3 | import dateutil from './dateutil';
|
4 | export function iterSet(iterResult, _rrule, _exrule, _rdate, _exdate, tzid) {
|
5 | var _exdateHash = {};
|
6 | var _accept = iterResult.accept;
|
7 | function evalExdate(after, before) {
|
8 | _exrule.forEach(function (rrule) {
|
9 | rrule.between(after, before, true).forEach(function (date) {
|
10 | _exdateHash[Number(date)] = true;
|
11 | });
|
12 | });
|
13 | }
|
14 | _exdate.forEach(function (date) {
|
15 | var zonedDate = new DateWithZone(date, tzid).rezonedDate();
|
16 | _exdateHash[Number(zonedDate)] = true;
|
17 | });
|
18 | iterResult.accept = function (date) {
|
19 | var dt = Number(date);
|
20 | if (isNaN(dt))
|
21 | return _accept.call(this, date);
|
22 | if (!_exdateHash[dt]) {
|
23 | evalExdate(new Date(dt - 1), new Date(dt + 1));
|
24 | if (!_exdateHash[dt]) {
|
25 | _exdateHash[dt] = true;
|
26 | return _accept.call(this, date);
|
27 | }
|
28 | }
|
29 | return true;
|
30 | };
|
31 | if (iterResult.method === 'between') {
|
32 | evalExdate(iterResult.args.after, iterResult.args.before);
|
33 | iterResult.accept = function (date) {
|
34 | var dt = Number(date);
|
35 | if (!_exdateHash[dt]) {
|
36 | _exdateHash[dt] = true;
|
37 | return _accept.call(this, date);
|
38 | }
|
39 | return true;
|
40 | };
|
41 | }
|
42 | for (var i = 0; i < _rdate.length; i++) {
|
43 | var zonedDate = new DateWithZone(_rdate[i], tzid).rezonedDate();
|
44 | if (!iterResult.accept(new Date(zonedDate.getTime())))
|
45 | break;
|
46 | }
|
47 | _rrule.forEach(function (rrule) {
|
48 | iter(iterResult, rrule.options);
|
49 | });
|
50 | var res = iterResult._result;
|
51 | dateutil.sort(res);
|
52 | switch (iterResult.method) {
|
53 | case 'all':
|
54 | case 'between':
|
55 | return res;
|
56 | case 'before':
|
57 | return ((res.length && res[res.length - 1]) || null);
|
58 | case 'after':
|
59 | default:
|
60 | return ((res.length && res[0]) || null);
|
61 | }
|
62 | }
|
63 |
|
\ | No newline at end of file |