date-fns-lost
v2.3.0
Published
Lost tools for moment including domain specific language for time manipulations and schedule operations.
Downloads
26
Readme
Date Fns Lost
Lost tools for moment including domain specific language for time manipulations and schedule operations.
import momentRange from 'moment-range'
import momentTz from 'moment-timezone'
const moment = momentRange.extendMoment(momentTz)
import lost from 'date-fns-lost'
const {
chrono,
spanner,
schedule,
dsl,
iso8601
} = lost(moment)
const content = `
//
// A date constant is either an iso8601 string or a reference
// to another constant. Constants can optionally be followed
// immediately by spanner operations.
//
// day_in_june: 2018-06-15T10:00:00Z
// start_of_june: day_in_june/M
//
//
// An interval is a repeating pattern and can be specified as:
//
// interval(anchor, duration, repeat)
//
// Where:
// anchor - A reference to a constant optionally followed
// by spanner operations.
// duration - A spanner operation to calculate the duration
// of each iteration.
// repeat - A number followed by the name or short code
// of a unit to jump forward and backwards from
// anchor to create the pattern.
//
//
// A range is all time between a start and an end
//
// range(start, end)
//
// Where:
// start - A reference to a constant optionally followed
// by spanner operations. Inclusive in the range.
// end - A reference to a constant optionally followed
// by spanner operations. Inclusive in the range.
//
//
// Both interval and range cannot accept iso8601 parameters,
// these can be defined as constants and referenced.
//
//
// Spanner operations are executed sequentially against a
// constant or if not supplied will default to the current time.
//
// (timezone) - Changes all following operations to be
// executed in the supplied timezone.
// http://momentjs.com/timezone/
// +5days - Add or substract a multiple of a time unit.
// +5d4h - Can use short codes and multiple units.
// /M - Jump to the start of time unit.
//
start: now/M
end: now+4M/M
result:
+ interval(now/M, +7d, 1M)
* interval(/isoWeek+1d, +1d, 1w)
`
const parsed = dsl.parse(content)
console.log(parsed.schedules)
const clip = moment.range(parsed.constants.start, parsed.constants.end)
const segments = schedule.between(parsed.schedules, parsed.schedules.result, clip)
for (let segment of segments)
console.log(segment.start.format(iso8601), '—', segment.end.format(iso8601))