@@ -145,6 +145,10 @@ function assertExists<A>(arg: A): asserts arg is NonNullable<A> {
145
145
}
146
146
}
147
147
148
+ function isZero ( value : JSBI ) : boolean {
149
+ return JSBI . equal ( value , ZERO ) ;
150
+ }
151
+
148
152
function IsInteger ( value : unknown ) : value is number {
149
153
if ( typeof value !== 'number' || ! NumberIsFinite ( value ) ) return false ;
150
154
const abs = MathAbs ( value ) ;
@@ -3591,13 +3595,20 @@ export function UnbalanceDurationRelative(
3591
3595
daysParam : number ,
3592
3596
largestUnit : Temporal . DateTimeUnit ,
3593
3597
relativeToParam : ReturnType < typeof ToRelativeTemporalObject >
3594
- ) {
3595
- let years = yearsParam ;
3596
- let months = monthsParam ;
3597
- let weeks = weeksParam ;
3598
- let days = daysParam ;
3598
+ ) : {
3599
+ years : number ;
3600
+ months : number ;
3601
+ weeks : number ;
3602
+ days : number ;
3603
+ } {
3599
3604
const TemporalDuration = GetIntrinsic ( '%Temporal.Duration%' ) ;
3600
- const sign = DurationSign ( years , months , weeks , days , 0 , 0 , 0 , 0 , 0 , 0 ) ;
3605
+ const sign = DurationSign ( yearsParam , monthsParam , weeksParam , daysParam , 0 , 0 , 0 , 0 , 0 , 0 ) ;
3606
+ const signBI = JSBI . BigInt ( sign ) ;
3607
+
3608
+ let years = JSBI . BigInt ( yearsParam ) ;
3609
+ let months = JSBI . BigInt ( monthsParam ) ;
3610
+ let weeks = JSBI . BigInt ( weeksParam ) ;
3611
+ let days = JSBI . BigInt ( daysParam ) ;
3601
3612
3602
3613
let calendar ;
3603
3614
let relativeTo : Temporal . PlainDate | undefined ;
@@ -3621,76 +3632,80 @@ export function UnbalanceDurationRelative(
3621
3632
// balance years down to months
3622
3633
const dateAdd = calendar . dateAdd ;
3623
3634
const dateUntil = calendar . dateUntil ;
3624
- while ( MathAbs ( years ) > 0 ) {
3635
+ while ( ! isZero ( abs ( years ) ) ) {
3625
3636
const newRelativeTo = CalendarDateAdd ( calendar , relativeTo , oneYear , undefined , dateAdd ) ;
3626
3637
const untilOptions = ObjectCreate ( null ) ;
3627
3638
untilOptions . largestUnit = 'month' ;
3628
3639
const untilResult = CalendarDateUntil ( calendar , relativeTo , newRelativeTo , untilOptions , dateUntil ) ;
3629
- const oneYearMonths = GetSlot ( untilResult , MONTHS ) ;
3640
+ const oneYearMonths = JSBI . BigInt ( GetSlot ( untilResult , MONTHS ) ) ;
3630
3641
relativeTo = newRelativeTo ;
3631
- months += oneYearMonths ;
3632
- years -= sign ;
3642
+ months = JSBI . add ( months , oneYearMonths ) ;
3643
+ years = JSBI . subtract ( years , signBI ) ;
3633
3644
}
3634
3645
}
3635
3646
break ;
3636
- case 'week' :
3647
+ case 'week' : {
3637
3648
if ( ! calendar ) throw new RangeError ( 'a starting point is required for weeks balancing' ) ;
3638
3649
assertExists ( relativeTo ) ;
3639
3650
const dateAdd = calendar . dateAdd ;
3640
3651
// balance years down to days
3641
- while ( MathAbs ( years ) > 0 ) {
3652
+ // balance years down to days
3653
+ while ( ! isZero ( abs ( years ) ) ) {
3642
3654
let oneYearDays ;
3643
3655
( { relativeTo, days : oneYearDays } = MoveRelativeDate ( calendar , relativeTo , oneYear , dateAdd ) ) ;
3644
- days += oneYearDays ;
3645
- years -= sign ;
3656
+ days = JSBI . add ( days , JSBI . BigInt ( oneYearDays ) ) ;
3657
+ years = JSBI . subtract ( years , signBI ) ;
3646
3658
}
3647
3659
3648
3660
// balance months down to days
3649
- while ( MathAbs ( months ) > 0 ) {
3661
+ while ( ! isZero ( abs ( months ) ) ) {
3650
3662
let oneMonthDays ;
3651
3663
( { relativeTo, days : oneMonthDays } = MoveRelativeDate ( calendar , relativeTo , oneMonth , dateAdd ) ) ;
3652
- days += oneMonthDays ;
3653
- months -= sign ;
3664
+ days = JSBI . add ( days , JSBI . BigInt ( oneMonthDays ) ) ;
3665
+ months = JSBI . subtract ( months , signBI ) ;
3654
3666
}
3655
3667
break ;
3668
+ }
3656
3669
default : {
3657
3670
// balance years down to days
3658
- if ( years == 0 && months == 0 && weeks == 0 ) break ;
3671
+ if ( isZero ( years ) && isZero ( months ) && isZero ( weeks ) ) break ;
3659
3672
if ( ! calendar ) throw new RangeError ( 'a starting point is required for balancing calendar units' ) ;
3660
3673
const dateAdd = calendar . dateAdd ;
3661
- while ( MathAbs ( years ) > 0 ) {
3662
- if ( ! calendar ) throw new RangeError ( 'a starting point is required for balancing calendar units' ) ;
3674
+ while ( ! isZero ( abs ( years ) ) ) {
3663
3675
assertExists ( relativeTo ) ;
3664
3676
let oneYearDays ;
3665
3677
( { relativeTo, days : oneYearDays } = MoveRelativeDate ( calendar , relativeTo , oneYear , dateAdd ) ) ;
3666
- days += oneYearDays ;
3667
- years -= sign ;
3678
+ days = JSBI . add ( days , JSBI . BigInt ( oneYearDays ) ) ;
3679
+ years = JSBI . subtract ( years , signBI ) ;
3668
3680
}
3669
3681
3670
3682
// balance months down to days
3671
- while ( MathAbs ( months ) > 0 ) {
3672
- if ( ! calendar ) throw new RangeError ( 'a starting point is required for balancing calendar units' ) ;
3683
+ while ( ! isZero ( abs ( months ) ) ) {
3673
3684
assertExists ( relativeTo ) ;
3674
3685
let oneMonthDays ;
3675
3686
( { relativeTo, days : oneMonthDays } = MoveRelativeDate ( calendar , relativeTo , oneMonth , dateAdd ) ) ;
3676
- days += oneMonthDays ;
3677
- months -= sign ;
3687
+ days = JSBI . add ( days , JSBI . BigInt ( oneMonthDays ) ) ;
3688
+ months = JSBI . subtract ( months , signBI ) ;
3678
3689
}
3679
3690
3680
3691
// balance weeks down to days
3681
- while ( MathAbs ( weeks ) > 0 ) {
3682
- if ( ! calendar ) throw new RangeError ( 'a starting point is required for balancing calendar units' ) ;
3692
+ while ( ! isZero ( abs ( weeks ) ) ) {
3683
3693
assertExists ( relativeTo ) ;
3684
3694
let oneWeekDays ;
3685
3695
( { relativeTo, days : oneWeekDays } = MoveRelativeDate ( calendar , relativeTo , oneWeek , dateAdd ) ) ;
3686
- days += oneWeekDays ;
3687
- weeks -= sign ;
3696
+ days = JSBI . add ( days , JSBI . BigInt ( oneWeekDays ) ) ;
3697
+ weeks = JSBI . subtract ( weeks , signBI ) ;
3688
3698
}
3689
3699
break ;
3690
3700
}
3691
3701
}
3692
3702
3693
- return { years, months, weeks, days } ;
3703
+ return {
3704
+ years : JSBI . toNumber ( years ) ,
3705
+ months : JSBI . toNumber ( months ) ,
3706
+ weeks : JSBI . toNumber ( weeks ) ,
3707
+ days : JSBI . toNumber ( days )
3708
+ } ;
3694
3709
}
3695
3710
3696
3711
export function BalanceDurationRelative (
@@ -3700,14 +3715,21 @@ export function BalanceDurationRelative(
3700
3715
daysParam : number ,
3701
3716
largestUnit : Temporal . DateTimeUnit ,
3702
3717
relativeToParam : ReturnType < typeof ToRelativeTemporalObject >
3703
- ) {
3704
- let years = yearsParam ;
3705
- let months = monthsParam ;
3706
- let weeks = weeksParam ;
3707
- let days = daysParam ;
3718
+ ) : {
3719
+ years : number ;
3720
+ months : number ;
3721
+ weeks : number ;
3722
+ days : number ;
3723
+ } {
3708
3724
const TemporalDuration = GetIntrinsic ( '%Temporal.Duration%' ) ;
3709
- const sign = DurationSign ( years , months , weeks , days , 0 , 0 , 0 , 0 , 0 , 0 ) ;
3710
- if ( sign === 0 ) return { years, months, weeks, days } ;
3725
+ const sign = DurationSign ( yearsParam , monthsParam , weeksParam , daysParam , 0 , 0 , 0 , 0 , 0 , 0 ) ;
3726
+ if ( sign === 0 ) return { years : yearsParam , months : monthsParam , weeks : weeksParam , days : daysParam } ;
3727
+ const signBI = JSBI . BigInt ( sign ) ;
3728
+
3729
+ let years = JSBI . BigInt ( yearsParam ) ;
3730
+ let months = JSBI . BigInt ( monthsParam ) ;
3731
+ let weeks = JSBI . BigInt ( weeksParam ) ;
3732
+ let days = JSBI . BigInt ( daysParam ) ;
3711
3733
3712
3734
let calendar ;
3713
3735
let relativeTo : Temporal . PlainDate | undefined ;
@@ -3728,19 +3750,19 @@ export function BalanceDurationRelative(
3728
3750
// balance days up to years
3729
3751
let newRelativeTo , oneYearDays ;
3730
3752
( { relativeTo : newRelativeTo , days : oneYearDays } = MoveRelativeDate ( calendar , relativeTo , oneYear , dateAdd ) ) ;
3731
- while ( MathAbs ( days ) >= MathAbs ( oneYearDays ) ) {
3732
- days -= oneYearDays ;
3733
- years += sign ;
3753
+ while ( JSBI . greaterThanOrEqual ( abs ( days ) , JSBI . BigInt ( MathAbs ( oneYearDays ) ) ) ) {
3754
+ days = JSBI . subtract ( days , JSBI . BigInt ( oneYearDays ) ) ;
3755
+ years = JSBI . add ( years , signBI ) ;
3734
3756
relativeTo = newRelativeTo ;
3735
3757
( { relativeTo : newRelativeTo , days : oneYearDays } = MoveRelativeDate ( calendar , relativeTo , oneYear , dateAdd ) ) ;
3736
3758
}
3737
3759
3738
3760
// balance days up to months
3739
3761
let oneMonthDays ;
3740
3762
( { relativeTo : newRelativeTo , days : oneMonthDays } = MoveRelativeDate ( calendar , relativeTo , oneMonth , dateAdd ) ) ;
3741
- while ( MathAbs ( days ) >= MathAbs ( oneMonthDays ) ) {
3742
- days -= oneMonthDays ;
3743
- months += sign ;
3763
+ while ( JSBI . greaterThanOrEqual ( abs ( days ) , JSBI . BigInt ( MathAbs ( oneMonthDays ) ) ) ) {
3764
+ days = JSBI . subtract ( days , JSBI . BigInt ( oneMonthDays ) ) ;
3765
+ months = JSBI . add ( months , signBI ) ;
3744
3766
relativeTo = newRelativeTo ;
3745
3767
( { relativeTo : newRelativeTo , days : oneMonthDays } = MoveRelativeDate ( calendar , relativeTo , oneMonth , dateAdd ) ) ;
3746
3768
}
@@ -3752,9 +3774,9 @@ export function BalanceDurationRelative(
3752
3774
untilOptions . largestUnit = 'month' ;
3753
3775
let untilResult = CalendarDateUntil ( calendar , relativeTo , newRelativeTo , untilOptions , dateUntil ) ;
3754
3776
let oneYearMonths = GetSlot ( untilResult , MONTHS ) ;
3755
- while ( MathAbs ( months ) >= MathAbs ( oneYearMonths ) ) {
3756
- months -= oneYearMonths ;
3757
- years += sign ;
3777
+ while ( JSBI . greaterThanOrEqual ( abs ( months ) , JSBI . BigInt ( MathAbs ( oneYearMonths ) ) ) ) {
3778
+ months = JSBI . subtract ( months , JSBI . BigInt ( oneYearMonths ) ) ;
3779
+ years = JSBI . add ( years , signBI ) ;
3758
3780
relativeTo = newRelativeTo ;
3759
3781
newRelativeTo = CalendarDateAdd ( calendar , relativeTo , oneYear , undefined , dateAdd ) ;
3760
3782
const untilOptions = ObjectCreate ( null ) ;
@@ -3771,9 +3793,9 @@ export function BalanceDurationRelative(
3771
3793
// balance days up to months
3772
3794
let newRelativeTo , oneMonthDays ;
3773
3795
( { relativeTo : newRelativeTo , days : oneMonthDays } = MoveRelativeDate ( calendar , relativeTo , oneMonth , dateAdd ) ) ;
3774
- while ( MathAbs ( days ) >= MathAbs ( oneMonthDays ) ) {
3775
- days -= oneMonthDays ;
3776
- months += sign ;
3796
+ while ( JSBI . greaterThanOrEqual ( abs ( days ) , JSBI . BigInt ( MathAbs ( oneMonthDays ) ) ) ) {
3797
+ days = JSBI . subtract ( days , JSBI . BigInt ( oneMonthDays ) ) ;
3798
+ months = JSBI . add ( months , signBI ) ;
3777
3799
relativeTo = newRelativeTo ;
3778
3800
( { relativeTo : newRelativeTo , days : oneMonthDays } = MoveRelativeDate ( calendar , relativeTo , oneMonth , dateAdd ) ) ;
3779
3801
}
@@ -3786,9 +3808,9 @@ export function BalanceDurationRelative(
3786
3808
// balance days up to weeks
3787
3809
let newRelativeTo , oneWeekDays ;
3788
3810
( { relativeTo : newRelativeTo , days : oneWeekDays } = MoveRelativeDate ( calendar , relativeTo , oneWeek , dateAdd ) ) ;
3789
- while ( MathAbs ( days ) >= MathAbs ( oneWeekDays ) ) {
3790
- days -= oneWeekDays ;
3791
- weeks += sign ;
3811
+ while ( JSBI . greaterThanOrEqual ( abs ( days ) , JSBI . BigInt ( MathAbs ( oneWeekDays ) ) ) ) {
3812
+ days = JSBI . subtract ( days , JSBI . BigInt ( oneWeekDays ) ) ;
3813
+ weeks = JSBI . add ( weeks , signBI ) ;
3792
3814
relativeTo = newRelativeTo ;
3793
3815
( { relativeTo : newRelativeTo , days : oneWeekDays } = MoveRelativeDate ( calendar , relativeTo , oneWeek , dateAdd ) ) ;
3794
3816
}
@@ -3799,7 +3821,12 @@ export function BalanceDurationRelative(
3799
3821
break ;
3800
3822
}
3801
3823
3802
- return { years, months, weeks, days } ;
3824
+ return {
3825
+ years : JSBI . toNumber ( years ) ,
3826
+ months : JSBI . toNumber ( months ) ,
3827
+ weeks : JSBI . toNumber ( weeks ) ,
3828
+ days : JSBI . toNumber ( days )
3829
+ } ;
3803
3830
}
3804
3831
3805
3832
export function CalculateOffsetShift (
0 commit comments