{"version":3,"sources":["../src/Interval.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAW1E,qBAAa,QAAQ,CAAC,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,CAAE,YAAW,SAAS,EAAE,mBAAmB;IAClF,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;gBAEJ,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;aAKxB,QAAQ;IAIZ,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAS/B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;IAO3B,gBAAgB,CAAC,KAAK,EAAE,CAAC;IAIzB,qBAAqB,CAAC,KAAK,EAAE,CAAC;IAI9B,gBAAgB,CAAC,GAAG,EAAE,CAAC;IAIvB,mBAAmB,CAAC,GAAG,EAAE,CAAC;IAI1B,qBAAqB,CAAC,QAAQ,EAAE,QAAQ;IAIxC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ;IAItC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;IAIzB,wBAAwB,IAAI,MAAM;IAwGlC,6BAA6B,IAAI,MAAM;IAIvC,2BAA2B,IAAI,MAAM;IAIrC,QAAQ,IAAI,MAAM;IAIlB,MAAM;IAIN,MAAM,CAAC,iBAAiB,CAAC,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ;IAI5E,MAAM,CAAC,eAAe,CAAC,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;IAIxE,MAAM,CAAC,+BAA+B,CAAC,IAAI,EAAE,MAAM;IAInD,MAAM,CAAC,gCAAgC,CAAC,IAAI,EAAE,MAAM;IAIpD,MAAM,CAAC,+BAA+B,CAAC,IAAI,EAAE,MAAM;IAInD,MAAM,CAAC,2BAA2B,CAAC,IAAI,EAAE,MAAM;IAI/C,MAAM,CAAC,2BAA2B,CAAC,IAAI,EAAE,MAAM;IAI/C,MAAM,CAAC,4BAA4B,CAAC,IAAI,EAAE,MAAM;IAIhD,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM;IAI9B,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAI3C,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,MAAM;IAI1B,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO;IAM1F,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,MAAM;CAM1E","file":"Interval.d.ts","sourcesContent":["/*!\r\n   Copyright 2019 Ron Buckton\r\n\r\n   Licensed under the Apache License, Version 2.0 (the \"License\");\r\n   you may not use this file except in compliance with the License.\r\n   You may obtain a copy of the License at\r\n\r\n       http://www.apache.org/licenses/LICENSE-2.0\r\n\r\n   Unless required by applicable law or agreed to in writing, software\r\n   distributed under the License is distributed on an \"AS IS\" BASIS,\r\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n   See the License for the specific language governing permissions and\r\n   limitations under the License.\r\n*/\r\nimport { R } from 'retemplate';\r\nimport { getCalendarDateFromWeekDate, getCalendarDateFromOrdinalDate, getWeeksInYear } from './internal/date';\r\nimport { PARTIAL_ZONED_CALENDAR_DATETIME_EXTENDED, PARTIAL_ZONED_CALENDAR_DATETIME_BASIC, PARTIAL_ZONED_WEEK_DATETIME_EXTENDED, PARTIAL_ZONED_WEEK_DATETIME_BASIC, PARTIAL_ZONED_ORDINAL_DATETIME_EXTENDED, PARTIAL_ZONED_ORDINAL_DATETIME_BASIC } from './internal/patterns';\r\nimport { D6, D4, D3, D2 } from './internal/formats';\r\nimport { Temporal } from './types';\r\nimport { ZoneOffset } from './Zone';\r\nimport { CivilDate } from './CivilDate';\r\nimport { CivilTime } from './CivilTime';\r\nimport { CivilDateTime } from './CivilDateTime';\r\nimport { OffsetTime } from './OffsetTime';\r\nimport { OffsetDateTime } from './OffsetDateTime';\r\nimport { ZonedDateTime } from './ZonedDateTime';\r\nimport { Duration } from './Duration';\r\nimport { Equatable, Equaler, StructuralEquatable } from '@esfx/equatable';\r\nimport { INTERVAL_HASH_SEED } from './internal/core';\r\n\r\nconst intervalRegExp = /^(?<first>(?:[^/]|\\[[^/]+\\])+)\\/(?<second>(?:[^/]|\\[[^/]+\\])+)$/;\r\nconst partialCalendarDateTimeExtendedRegExp = new RegExp(R`^(?!$)${PARTIAL_ZONED_CALENDAR_DATETIME_EXTENDED}$`);\r\nconst partialCalendarDateTimeBasicRegExp = new RegExp(R`^(?!$)${PARTIAL_ZONED_CALENDAR_DATETIME_BASIC}$`);\r\nconst partialWeekDateTimeExtendedRegExp = new RegExp(R`^(?!$)${PARTIAL_ZONED_WEEK_DATETIME_EXTENDED}$`);\r\nconst partialWeekDateTimeBasicRegExp = new RegExp(R`^(?!$)${PARTIAL_ZONED_WEEK_DATETIME_BASIC}$`);\r\nconst partialOrdinalDateTimeExtendedRegExp = new RegExp(R`^(?!$)${PARTIAL_ZONED_ORDINAL_DATETIME_EXTENDED}$`);\r\nconst partialOrdinalDateTimeBasicRegExp = new RegExp(R`^(?!$)${PARTIAL_ZONED_ORDINAL_DATETIME_BASIC}$`);\r\n\r\nexport class Interval<T extends Temporal<T>> implements Equatable, StructuralEquatable {\r\n    readonly start: T;\r\n    readonly end: T;\r\n\r\n    constructor(start: T, end: T) {\r\n        this.start = start.compareTo(end) <= 0 ? start : end;\r\n        this.end = start.compareTo(end) <= 0 ? end : start;\r\n    }\r\n\r\n    get duration() {\r\n        return this.start.until(this.end);\r\n    }\r\n\r\n    contains(value: T | Interval<T>) {\r\n        if (value instanceof Interval) {\r\n            return this.start.compareTo(value.start) <= 0\r\n                && this.end.compareTo(value.end) >= 0;\r\n        }\r\n        return this.start.compareTo(value) <= 0\r\n            && this.end.compareTo(value) >= 0;\r\n    }\r\n\r\n    overlaps(other: Interval<T>) {\r\n        return this.contains(other.start)\r\n            || this.contains(other.end)\r\n            || other.contains(this.start)\r\n            || other.contains(this.end);\r\n    }\r\n\r\n    withStartSameEnd(start: T) {\r\n        return new Interval(start, this.end);\r\n    }\r\n\r\n    withStartSameDuration(start: T) {\r\n        return new Interval(start, start.plus(this.duration));\r\n    }\r\n\r\n    withEndSameStart(end: T) {\r\n        return new Interval(this.start, end);\r\n    }\r\n\r\n    withEndSameDuration(end: T) {\r\n        return new Interval(end.minus(this.duration), end);\r\n    }\r\n\r\n    withDurationSameStart(duration: Duration) {\r\n        return new Interval(this.start, this.start.plus(duration));\r\n    }\r\n\r\n    withDurationSameEnd(duration: Duration) {\r\n        return new Interval(this.end.minus(duration), this.end);\r\n    }\r\n\r\n    equals(other: Interval<T>) {\r\n        return this[Equatable.equals](other);\r\n    }\r\n\r\n    toStartEndIntervalString(): string {\r\n        return `${this.start}/${this.end}`;\r\n        // // write a consise representation of end\r\n        // const startDate = getCivilDate(this.start);\r\n        // const startTime = getCivilTime(this.start);\r\n        // const startOffset = getOffset(this.start);\r\n        // const endDate = getCivilDate(this.end);\r\n        // const endTime = getCivilTime(this.end);\r\n        // const endOffset = getOffset(this.end);\r\n\r\n        // // determine components of date to write\r\n        // let writeYear = false;\r\n        // let writeMonth = false;\r\n        // let writeDay = false;\r\n        // let writeDate = false;\r\n        // if (startDate && endDate) {\r\n        //     writeYear = endDate.year !== startDate.year;\r\n        //     writeMonth = writeYear || endDate.month !== startDate.month;\r\n        //     writeDay = writeMonth || endDate.day !== startDate.day;\r\n        //     writeDate = writeYear || writeMonth || writeDay;\r\n        // }\r\n\r\n        // // determine components of time to write\r\n        // let writeOffset = false;\r\n        // if (startOffset && endOffset) {\r\n        //     writeOffset = !endOffset.equals(startOffset);\r\n        // }\r\n\r\n        // let writeNanosecond = false;\r\n        // let writeMillisecond = false;\r\n        // let writeSecond = false;\r\n        // let writeMinute = false;\r\n        // let writeHour = false;\r\n        // let writeTime = false;\r\n        // let writeTimeSeparator = false;\r\n        // if (startTime && endTime) {\r\n        //     writeNanosecond = endTime.nanosecond !== startTime.nanosecond;\r\n        //     writeMillisecond = writeNanosecond || endTime.millisecond !== startTime.millisecond;\r\n        //     writeSecond = writeMillisecond || endTime.second !== startTime.second;\r\n        //     writeMinute = writeSecond || endTime.minute !== startTime.minute;\r\n        //     writeHour = writeMinute || writeOffset || endTime.hour !== startTime.hour;\r\n        //     if (writeHour) writeMinute = true;\r\n        //     writeTime = writeHour || writeOffset;\r\n        //     writeTimeSeparator = writeDate && writeTime || (writeHour && !writeMinute);\r\n        // }\r\n\r\n        // let s = \"\";\r\n        // // if every component needs to be written, write it as an instant.\r\n        // if (writeYear && writeMonth && writeDay && writeHour && writeMinute && writeSecond && writeOffset) {\r\n        //     s = this.end.toISOString();\r\n        // }\r\n        // else {\r\n        //     if (endDate) {\r\n        //         if (writeYear) s += D4(endDate.year);\r\n        //         if (writeYear && (writeMonth || writeDay)) s += \"-\";\r\n        //         if (writeMonth) s += D2(endDate.month);\r\n        //         if (writeMonth && writeDay) s += \"-\";\r\n        //         if (writeDay) s += D2(endDate.day);\r\n        //     }\r\n        //     if (endTime) {\r\n        //         if (writeTimeSeparator) s += \"T\";\r\n        //         if (writeHour) s += D2(endTime.hour);\r\n        //         if (writeHour && writeMinute) s += \":\";\r\n        //         if (writeMinute) s += D2(endTime.minute);\r\n        //         if (writeMinute && writeSecond) s += \":\";\r\n        //         if (writeSecond) {\r\n        //             let text = D2(endTime.second);\r\n        //             if (writeMillisecond) {\r\n        //                 text += `.${D3(endTime.millisecond)}`;\r\n        //                 if (writeNanosecond) {\r\n        //                     text += D6(endTime.nanosecond);\r\n        //                 }\r\n        //             }\r\n        //             s += text;\r\n        //         }\r\n        //     }\r\n        //     if (endOffset && writeOffset) {\r\n        //         let offsetSeconds = endOffset.offsetSeconds;\r\n        //         if (offsetSeconds === 0) {\r\n        //             s += \"Z\";\r\n        //         }\r\n        //         else {\r\n        //             let sign = \"+\";\r\n        //             if (offsetSeconds < 0) {\r\n        //                 sign = \"-\";\r\n        //                 offsetSeconds = -offsetSeconds;\r\n        //             }\r\n\r\n        //             const h = Math.floor(offsetSeconds / 3600);\r\n        //             const m = Math.floor(offsetSeconds / 60) % 60;\r\n        //             const ss = offsetSeconds % 60;\r\n        //             s += `${sign}${D2(h)}`;\r\n        //             if (m !== 0 || ss !== 0) {\r\n        //                 s += `:${D2(m)}`;\r\n        //                 if (ss !== 0) {\r\n        //                     s += `:${D2(ss)}`;\r\n        //                 }\r\n        //             }\r\n        //         }\r\n        //     }\r\n        // }\r\n        // return `${this.start.toString()}/${s}`;\r\n    }\r\n\r\n    toStartDurationIntervalString(): string {\r\n        return `${this.start.toString()}/${this.duration.toString()}`;\r\n    }\r\n\r\n    toDurationEndIntervalString(): string {\r\n        return `${this.duration.toString()}/${this.duration.toString()}`;\r\n    }\r\n\r\n    toString(): string {\r\n        return this.toStartEndIntervalString();\r\n    }\r\n\r\n    toJSON() {\r\n        return this.toString();\r\n    }\r\n\r\n    static fromStartDuration<T extends Temporal<T>>(start: T, duration: Duration) {\r\n        return new Interval(start, start.plus(duration));\r\n    }\r\n\r\n    static fromDurationEnd<T extends Temporal<T>>(duration: Duration, end: T) {\r\n        return new Interval(end.minus(duration), end);\r\n    }\r\n\r\n    static fromZonedDateTimeIntervalString(text: string) {\r\n        return fromString(text, \"ZonedDateTime\", undefined);\r\n    }\r\n\r\n    static fromOffsetDateTimeIntervalString(text: string) {\r\n        return fromString(text, \"OffsetDateTime\", undefined);\r\n    }\r\n\r\n    static fromCivilDateTimeIntervalString(text: string) {\r\n        return fromString(text, \"CivilDateTime\", undefined);\r\n    }\r\n\r\n    static fromCivilDateIntervalString(text: string) {\r\n        return fromString(text, \"CivilDate\", undefined);\r\n    }\r\n\r\n    static fromCivilTimeIntervalString(text: string) {\r\n        return fromString(text, \"CivilTime\", undefined);\r\n    }\r\n\r\n    static fromOffsetTimeIntervalString(text: string) {\r\n        return fromString(text, \"OffsetTime\", undefined);\r\n    }\r\n\r\n    static fromString(text: string) {\r\n        return fromString(text, undefined, undefined);\r\n    }\r\n\r\n    [Equatable.equals](other: unknown): boolean {\r\n        return this[StructuralEquatable.structuralEquals](other, Equaler.defaultEqualer);\r\n    }\r\n\r\n    [Equatable.hash](): number {\r\n        return this[StructuralEquatable.structuralHash](Equaler.defaultEqualer);\r\n    }\r\n\r\n    [StructuralEquatable.structuralEquals](other: unknown, equaler: Equaler<unknown>): boolean {\r\n        return other instanceof Interval\r\n            && equaler.equals(this.start, other.start)\r\n            && equaler.equals(this.end, other.end);\r\n    }\r\n\r\n    [StructuralEquatable.structuralHash](equaler: Equaler<unknown>): number {\r\n        let hc = INTERVAL_HASH_SEED;\r\n        hc = ((hc << 7) | (hc >>> 25)) ^ equaler.hash(this.start);\r\n        hc = ((hc << 7) | (hc >>> 25)) ^ equaler.hash(this.end);\r\n        return hc;\r\n    }\r\n}\r\n\r\nfunction tryParseInt(x: string | undefined, fallback: number): number;\r\nfunction tryParseInt(x: string | undefined, fallback?: number): number | undefined;\r\nfunction tryParseInt(x: string | undefined, fallback?: number) {\r\n    return x ? parseInt(x, 10) : fallback;\r\n}\r\n\r\ninterface DateParts { year?: number, month?: number, day?: number }\r\ninterface TimeParts { hour?: number, minute?: number, second?: number, millisecond?: number, nanosecond?: number, offset?: string, ianaZone?: string }\r\n\r\nfunction createFromPartialZonedDateTime(start: ZonedDateTime, date: DateParts, time: TimeParts) {\r\n    const { year = start.year, month = start.month, day = start.day } = date;\r\n    const { hour = start.hour, minute = start.minute, second = start.second, millisecond = start.millisecond, nanosecond = start.nanosecond } = time;\r\n    return ZonedDateTime.fromCalendarDateTime(time.ianaZone || time.offset || start.zone, year, month, day, hour, minute, second, millisecond, nanosecond);\r\n}\r\n\r\nfunction createFromPartialOffsetDateTime(start: OffsetDateTime, date: DateParts, time: TimeParts) {\r\n    const { year = start.year, month = start.month, day = start.day } = date;\r\n    const { hour = start.hour, minute = start.minute, second = start.second, millisecond = start.millisecond, nanosecond = start.nanosecond } = time;\r\n    return new OffsetDateTime(time.offset ? ZoneOffset.fromString(time.offset) : start.offset, year, month, day, hour, minute, second, millisecond, nanosecond);\r\n}\r\n\r\nfunction createFromPartialCivilDateTime(start: CivilDateTime, date: DateParts, time: TimeParts) {\r\n    if (time.offset || time.ianaZone) return undefined;\r\n    const { year = start.year, month = start.month, day = start.day } = date;\r\n    const { hour = start.hour, minute = start.minute, second = start.second, millisecond = start.millisecond, nanosecond = start.nanosecond } = time;\r\n    return new CivilDateTime(year, month, day, hour, minute, second, millisecond, nanosecond);\r\n}\r\n\r\nfunction createFromPartialCivilDate(start: CivilDate, date: DateParts, time: TimeParts) {\r\n    if (time.offset || time.ianaZone || time.hour !== undefined || time.minute !== undefined || time.second !== undefined || time.millisecond !== undefined || time.nanosecond !== undefined) return undefined;\r\n    const { year = start.year, month = start.month, day = start.day } = date;\r\n    return new CivilDate(year, month, day);\r\n}\r\n\r\nfunction createFromPartialOffsetTime(start: OffsetTime, date: DateParts, time: TimeParts) {\r\n    if (time.ianaZone || date.year !== undefined || date.month !== undefined || date.day !== undefined) return undefined;\r\n    const { hour = start.hour, minute = start.minute, second = start.second, millisecond = start.millisecond, nanosecond = start.nanosecond } = time;\r\n    return new OffsetTime(time.offset ? ZoneOffset.fromString(time.offset) : start.offset, hour, minute, second, millisecond, nanosecond);\r\n}\r\n\r\nfunction createFromPartialCivilTime(start: CivilTime, date: DateParts, time: TimeParts) {\r\n    if (time.offset || time.ianaZone || date.year !== undefined || date.month !== undefined || date.day !== undefined) return undefined;\r\n    const { hour = start.hour, minute = start.minute, second = start.second, millisecond = start.millisecond, nanosecond = start.nanosecond } = time;\r\n    return new CivilTime(hour, minute, second, millisecond, nanosecond);\r\n}\r\n\r\nfunction parseTemporal(text: string, type?: \"CivilDate\" | \"CivilTime\" | \"CivilDateTime\" | \"OffsetTime\" | \"OffsetDateTime\" | \"ZonedDateTime\" | undefined) {\r\n    if (type === undefined || type === \"OffsetDateTime\") {\r\n        try { return OffsetDateTime.fromString(text); } catch { }\r\n    }\r\n    if (type === undefined || type === \"OffsetTime\") {\r\n        try { return OffsetTime.fromString(text); } catch { }\r\n    }\r\n    if (type === undefined || type === \"ZonedDateTime\") {\r\n        try { return ZonedDateTime.fromString(text); } catch { }\r\n    }\r\n    if (type === undefined || type === \"CivilDateTime\") {\r\n        try { return CivilDateTime.fromString(text); } catch { }\r\n    }\r\n    if (type === undefined || type === \"CivilDate\") {\r\n        try { return CivilDate.fromString(text); } catch { }\r\n    }\r\n    if (type === undefined || type === \"CivilTime\") {\r\n        try { return CivilTime.fromString(text); } catch { }\r\n    }\r\n    throw new SyntaxError(`Invalid temporal string '${text}'.`);\r\n}\r\n\r\nfunction getOffset(temporal: Temporal) {\r\n    return temporal instanceof ZonedDateTime ? temporal.zone.getOffset(temporal.instant) :\r\n        temporal instanceof OffsetDateTime ? temporal.offset :\r\n        temporal instanceof OffsetTime ? temporal.offset :\r\n        undefined;\r\n}\r\n\r\nfunction getCivilDate(temporal: Temporal) {\r\n    return temporal instanceof ZonedDateTime ? temporal.toCivilDate() :\r\n        temporal instanceof OffsetDateTime ? temporal.toCivilDate() :\r\n        temporal instanceof CivilDateTime ? temporal.toCivilDate() :\r\n        temporal instanceof CivilDate ? temporal :\r\n        undefined;\r\n}\r\n\r\nfunction getCivilTime(temporal: Temporal) {\r\n    return temporal instanceof ZonedDateTime ? temporal.toCivilTime() :\r\n        temporal instanceof OffsetDateTime ? temporal.toCivilTime() :\r\n        temporal instanceof CivilDateTime ? temporal.toCivilTime() :\r\n        temporal instanceof CivilTime ? temporal :\r\n        temporal instanceof OffsetTime ? temporal.toCivilTime() :\r\n        undefined;\r\n}\r\n\r\nfunction fromString(text: string, type: \"CivilDate\", kind: \"start-end\" | \"start-duration\" | \"duration-end\" | undefined): Interval<CivilDate>;\r\nfunction fromString(text: string, type: \"CivilTime\", kind: \"start-end\" | \"start-duration\" | \"duration-end\" | undefined): Interval<CivilTime>;\r\nfunction fromString(text: string, type: \"CivilDateTime\", kind: \"start-end\" | \"start-duration\" | \"duration-end\" | undefined): Interval<CivilDateTime>;\r\nfunction fromString(text: string, type: \"OffsetTime\", kind: \"start-end\" | \"start-duration\" | \"duration-end\" | undefined): Interval<OffsetTime>;\r\nfunction fromString(text: string, type: \"OffsetDateTime\", kind: \"start-end\" | \"start-duration\" | \"duration-end\" | undefined): Interval<OffsetDateTime>;\r\nfunction fromString(text: string, type: \"ZonedDateTime\", kind: \"start-end\" | \"start-duration\" | \"duration-end\" | undefined): Interval<ZonedDateTime>;\r\nfunction fromString(text: string, type: \"CivilDate\" | \"CivilTime\" | \"CivilDateTime\" | \"OffsetTime\" | \"OffsetDateTime\" | \"ZonedDateTime\" | undefined, kind: \"start-end\" | \"start-duration\" | \"duration-end\" | undefined): Interval<CivilDate | CivilTime | CivilDateTime | OffsetTime | OffsetDateTime | ZonedDateTime>;\r\nfunction fromString(text: string, type: \"CivilDate\" | \"CivilTime\" | \"CivilDateTime\" | \"OffsetTime\" | \"OffsetDateTime\" | \"ZonedDateTime\" | undefined, kind: \"start-end\" | \"start-duration\" | \"duration-end\" | undefined) {\r\n    const match = intervalRegExp.exec(text);\r\n    if (!match) throw new SyntaxError(`Invalid interval string '${text}'.`);\r\n\r\n    const { first, second } = match.groups!;\r\n\r\n    let start: CivilDate | CivilTime | CivilDateTime | OffsetTime | OffsetDateTime | ZonedDateTime | undefined;\r\n    try {\r\n        if (first.startsWith(\"P\")) {\r\n            if (kind === \"duration-end\" && kind === undefined) {\r\n                return Interval.fromDurationEnd(\r\n                    Duration.fromString(first),\r\n                    parseTemporal(second, type));\r\n            }\r\n        }\r\n        else if (second.startsWith(\"P\")) {\r\n            if (kind === \"start-duration\" || kind === undefined) {\r\n                return Interval.fromStartDuration(\r\n                    parseTemporal(first, type),\r\n                    Duration.fromString(second));\r\n            }\r\n        }\r\n        else {\r\n            start = parseTemporal(first);\r\n        }\r\n    }\r\n    catch {\r\n        throw new SyntaxError(`Invalid interval string '${text}'.`);\r\n    }\r\n\r\n    if (start === undefined || kind === \"start-duration\" || kind === \"duration-end\") {\r\n        throw new SyntaxError(`Invalid interval string '${text}'.`);\r\n    }\r\n\r\n    let end: CivilDate | CivilTime | CivilDateTime | OffsetTime | OffsetDateTime | ZonedDateTime | undefined;\r\n    try {\r\n        end = parseTemporal(second, type);\r\n    }\r\n    catch {\r\n        let date: DateParts;\r\n        let groups: Record<string, string | undefined>;\r\n        const calendar = partialCalendarDateTimeExtendedRegExp.exec(second) || partialCalendarDateTimeBasicRegExp.exec(second);\r\n        if (calendar && calendar.groups) {\r\n            groups = calendar.groups;\r\n            date = {\r\n                year: tryParseInt(groups.year),\r\n                month: tryParseInt(groups.month),\r\n                day: tryParseInt(groups.day)\r\n            };\r\n        }\r\n        else {\r\n            const week = partialWeekDateTimeExtendedRegExp.exec(second) || partialWeekDateTimeBasicRegExp.exec(second);\r\n            if (week && week.groups && (start instanceof ZonedDateTime || start instanceof CivilDateTime || start instanceof CivilDate)) {\r\n                groups = week.groups;\r\n                let year = tryParseInt(groups.year, start.year);\r\n                let weekOfYear = tryParseInt(groups.weekOfYear, start.weekOfYear);\r\n                const dayOfWeek = tryParseInt(groups.dayOfWeek, start.dayOfWeek);\r\n                while (weekOfYear < 1) year--, weekOfYear += getWeeksInYear(year);\r\n                while (weekOfYear > getWeeksInYear(year)) weekOfYear -= getWeeksInYear(year), year++;\r\n                date = getCalendarDateFromWeekDate(year, weekOfYear, dayOfWeek);;\r\n            }\r\n            else {\r\n                const ordinal = partialOrdinalDateTimeExtendedRegExp.exec(second) || partialOrdinalDateTimeBasicRegExp.exec(second);\r\n                if (ordinal && ordinal.groups && (start instanceof ZonedDateTime || start instanceof CivilDateTime || start instanceof CivilDate)) {\r\n                    groups = ordinal.groups;\r\n                    const year = tryParseInt(groups.year, start.year);\r\n                    const dayOfYear = tryParseInt(groups.dayOfYear, start.dayOfYear);\r\n                    date = getCalendarDateFromOrdinalDate(year, dayOfYear);\r\n                }\r\n                else {\r\n                    throw new SyntaxError(`Invalid interval string '${text}'.`);\r\n                }\r\n            }\r\n        }\r\n\r\n        const time: TimeParts = {\r\n            hour: tryParseInt(groups.hour),\r\n            minute: tryParseInt(groups.minute),\r\n            second: tryParseInt(groups.second),\r\n            millisecond: groups.millisecond ? +groups.millisecond.padEnd(3, \"0\") : undefined,\r\n            nanosecond: groups.nanosecond ? +groups.nanosecond.padEnd(6, \"0\") : undefined,\r\n            offset: groups.offset,\r\n            ianaZone: groups.ianaZone\r\n        };\r\n\r\n        if (start instanceof ZonedDateTime) {\r\n            end = createFromPartialZonedDateTime(start, date, time);\r\n        }\r\n        else if (start instanceof OffsetDateTime) {\r\n            end = createFromPartialOffsetDateTime(start, date, time);\r\n        }\r\n        else if (start instanceof CivilDateTime) {\r\n            end = createFromPartialCivilDateTime(start, date, time);\r\n        }\r\n        else if (start instanceof CivilDate) {\r\n            end = createFromPartialCivilDate(start, date, time);\r\n        }\r\n        else if (start instanceof OffsetTime) {\r\n            end = createFromPartialOffsetTime(start, date, time);\r\n        }\r\n        else if (start instanceof CivilTime) {\r\n            end = createFromPartialCivilTime(start, date, time);\r\n        }\r\n    }\r\n\r\n    if (end === undefined) {\r\n        throw new SyntaxError(`Invalid interval string '${text}'.`);\r\n    }\r\n\r\n    return new Interval(start, end);\r\n}"],"sourceRoot":""}