1import { get, set } from './get-set';
2import { setMonth } from '../units/month';
3import { createDuration } from '../duration/create';
4import { deprecateSimple } from '../utils/deprecate';
5import { hooks } from '../utils/hooks';
6import absRound from '../utils/abs-round';
7
8// TODO: remove 'name' arg after deprecation is removed
9function createAdder(direction, name) {
10 return function (val, period) {
11 var dur, tmp;
12 //invert the arguments, but complain about it
13 if (period !== null && !isNaN(+period)) {
14 deprecateSimple(
15 name,
16 'moment().' +
17 name +
18 '(period, number) is deprecated. Please use moment().' +
19 name +
20 '(number, period). ' +
21 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.'
22 );
23 tmp = val;
24 val = period;
25 period = tmp;
26 }
27
28 dur = createDuration(val, period);
29 addSubtract(this, dur, direction);
30 return this;
31 };
32}
33
34export function addSubtract(mom, duration, isAdding, updateOffset) {
35 var milliseconds = duration._milliseconds,
36 days = absRound(duration._days),
37 months = absRound(duration._months);
38
39 if (!mom.isValid()) {
40 // No op
41 return;
42 }
43
44 updateOffset = updateOffset == null ? true : updateOffset;
45
46 if (months) {
47 setMonth(mom, get(mom, 'Month') + months * isAdding);
48 }
49 if (days) {
50 set(mom, 'Date', get(mom, 'Date') + days * isAdding);
51 }
52 if (milliseconds) {
53 mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);
54 }
55 if (updateOffset) {
56 hooks.updateOffset(mom, days || months);
57 }
58}
59
60export var add = createAdder(1, 'add'),
61 subtract = createAdder(-1, 'subtract');