-
-
Notifications
You must be signed in to change notification settings - Fork 59
/
interval.ts
86 lines (65 loc) · 2.29 KB
/
interval.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
namespace $ {
export type $mol_time_interval_config = string | {
start? : $mol_time_moment_config
end? : $mol_time_moment_config
duration? : $mol_time_duration_config
}
/**
* Small, simple, powerful, and fast TypeScript/JavaScript library for proper date/time/duration/interval arithmetic.
*
* Immutable iso8601 time interval representation.
* @see http://localhost:9080/mol/app/docs/-/test.html#!demo=mol_time_demo
*/
export class $mol_time_interval extends $mol_time_base {
constructor( config : $mol_time_interval_config ) {
super()
if( typeof config === 'string' ) {
var chunks = config.split( '/' )
if( chunks[0] ) {
if( chunks[0][0].toUpperCase() === 'P' ) {
this._duration = new $mol_time_duration( chunks[0] )
} else {
this._start = new $mol_time_moment( chunks[0] )
}
} else {
this._start = new $mol_time_moment()
}
if( chunks[1] ) {
if( chunks[1][0].toUpperCase() === 'P' ) {
this._duration = new $mol_time_duration( chunks[1] )
} else {
this._end = new $mol_time_moment( chunks[1] )
}
} else {
this._end = new $mol_time_moment()
}
return
}
if( config.start !== undefined ) this._start = new $mol_time_moment( config.start )
if( config.end !== undefined ) this._end = new $mol_time_moment( config.end )
if( config.duration !== undefined ) this._duration = new $mol_time_duration( config.duration )
}
private _start : $mol_time_moment | undefined
get start() {
if( this._start ) return this._start
return this._start = this._end!.shift( this._duration!.mult( -1 ) )
}
private _end : $mol_time_moment | undefined
get end() {
if( this._end ) return this._end
return this._end = this._start!.shift( this._duration! )
}
private _duration : $mol_time_duration | undefined
get duration() {
if( this._duration ) return this._duration
return this._duration = new $mol_time_duration( this._end!.valueOf() - this._start!.valueOf() )
}
toJSON() { return this.toString() }
toString( ) {
return ( this._start || this._duration || '' ).toString() + '/' + ( this._end || this._duration || '' ).toString()
}
[ Symbol.toPrimitive ]( mode: 'default' | 'number' | 'string' ) {
return this.toString()
}
}
}