effect 2.0.1 → 2.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Cron/package.json +6 -0
- package/dist/cjs/Cron.js +457 -0
- package/dist/cjs/Cron.js.map +1 -0
- package/dist/cjs/Fiber.js.map +1 -1
- package/dist/cjs/ReadonlyArray.js +13 -7
- package/dist/cjs/ReadonlyArray.js.map +1 -1
- package/dist/cjs/Schedule.js +12 -1
- package/dist/cjs/Schedule.js.map +1 -1
- package/dist/cjs/index.js +4 -2
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/internal/schedule.js +29 -2
- package/dist/cjs/internal/schedule.js.map +1 -1
- package/dist/cjs/internal/version.js +1 -1
- package/dist/dts/Cron.d.ts +170 -0
- package/dist/dts/Cron.d.ts.map +1 -0
- package/dist/dts/Fiber.d.ts +6 -0
- package/dist/dts/Fiber.d.ts.map +1 -1
- package/dist/dts/ReadonlyArray.d.ts +26 -26
- package/dist/dts/ReadonlyArray.d.ts.map +1 -1
- package/dist/dts/Schedule.d.ts +11 -0
- package/dist/dts/Schedule.d.ts.map +1 -1
- package/dist/dts/index.d.ts +4 -0
- package/dist/dts/index.d.ts.map +1 -1
- package/dist/dts/internal/version.d.ts +1 -1
- package/dist/esm/Cron.js +418 -0
- package/dist/esm/Cron.js.map +1 -0
- package/dist/esm/Fiber.js.map +1 -1
- package/dist/esm/ReadonlyArray.js +14 -8
- package/dist/esm/ReadonlyArray.js.map +1 -1
- package/dist/esm/Schedule.js +11 -0
- package/dist/esm/Schedule.js.map +1 -1
- package/dist/esm/index.js +4 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/internal/schedule.js +26 -0
- package/dist/esm/internal/schedule.js.map +1 -1
- package/dist/esm/internal/version.js +1 -1
- package/package.json +9 -1
- package/src/Cron.ts +525 -0
- package/src/Fiber.ts +7 -0
- package/src/ReadonlyArray.ts +74 -53
- package/src/Schedule.ts +12 -0
- package/src/index.ts +5 -0
- package/src/internal/schedule.ts +42 -0
- package/src/internal/version.ts +1 -1
package/src/ReadonlyArray.ts
CHANGED
|
@@ -8,15 +8,15 @@ import type { Either } from "./Either.js"
|
|
|
8
8
|
import * as E from "./Either.js"
|
|
9
9
|
import * as Equal from "./Equal.js"
|
|
10
10
|
import * as Equivalence from "./Equivalence.js"
|
|
11
|
-
import { dual, identity } from "./Function.js"
|
|
12
11
|
import type { LazyArg } from "./Function.js"
|
|
12
|
+
import { dual, identity } from "./Function.js"
|
|
13
13
|
import type { TypeLambda } from "./HKT.js"
|
|
14
14
|
import * as readonlyArray from "./internal/readonlyArray.js"
|
|
15
15
|
import type { Option } from "./Option.js"
|
|
16
16
|
import * as O from "./Option.js"
|
|
17
17
|
import * as Order from "./Order.js"
|
|
18
|
-
import { isBoolean, not } from "./Predicate.js"
|
|
19
18
|
import type { Predicate, Refinement } from "./Predicate.js"
|
|
19
|
+
import { isBoolean } from "./Predicate.js"
|
|
20
20
|
import * as RR from "./ReadonlyRecord.js"
|
|
21
21
|
import * as Tuple from "./Tuple.js"
|
|
22
22
|
|
|
@@ -559,25 +559,27 @@ export const takeRight: {
|
|
|
559
559
|
* @since 2.0.0
|
|
560
560
|
*/
|
|
561
561
|
export const takeWhile: {
|
|
562
|
-
<A, B extends A>(refinement:
|
|
563
|
-
<B extends A, A = B>(predicate:
|
|
564
|
-
<A, B extends A>(self: Iterable<A>, refinement:
|
|
565
|
-
<A>(self: Iterable<A>, predicate:
|
|
566
|
-
} = dual(2, <A>(self: Iterable<A>, predicate:
|
|
562
|
+
<A, B extends A>(refinement: (a: A, i: number) => a is B): (self: Iterable<A>) => Array<B>
|
|
563
|
+
<B extends A, A = B>(predicate: (a: A, i: number) => boolean): (self: Iterable<B>) => Array<B>
|
|
564
|
+
<A, B extends A>(self: Iterable<A>, refinement: (a: A, i: number) => a is B): Array<B>
|
|
565
|
+
<A>(self: Iterable<A>, predicate: (a: A, i: number) => boolean): Array<A>
|
|
566
|
+
} = dual(2, <A>(self: Iterable<A>, predicate: (a: A, i: number) => boolean): Array<A> => {
|
|
567
|
+
let i = 0
|
|
567
568
|
const out: Array<A> = []
|
|
568
569
|
for (const a of self) {
|
|
569
|
-
if (!predicate(a)) {
|
|
570
|
+
if (!predicate(a, i)) {
|
|
570
571
|
break
|
|
571
572
|
}
|
|
572
573
|
out.push(a)
|
|
574
|
+
i++
|
|
573
575
|
}
|
|
574
576
|
return out
|
|
575
577
|
})
|
|
576
578
|
|
|
577
|
-
const spanIndex = <A>(self: Iterable<A>, predicate:
|
|
579
|
+
const spanIndex = <A>(self: Iterable<A>, predicate: (a: A, i: number) => boolean): number => {
|
|
578
580
|
let i = 0
|
|
579
581
|
for (const a of self) {
|
|
580
|
-
if (!predicate(a)) {
|
|
582
|
+
if (!predicate(a, i)) {
|
|
581
583
|
break
|
|
582
584
|
}
|
|
583
585
|
i++
|
|
@@ -596,14 +598,17 @@ const spanIndex = <A>(self: Iterable<A>, predicate: Predicate<A>): number => {
|
|
|
596
598
|
*/
|
|
597
599
|
export const span: {
|
|
598
600
|
<C extends A, B extends A, A = C>(
|
|
599
|
-
refinement:
|
|
601
|
+
refinement: (a: A, i: number) => a is B
|
|
600
602
|
): (self: Iterable<C>) => [init: Array<B>, rest: Array<Exclude<C, B>>]
|
|
601
|
-
<B extends A, A = B>(predicate:
|
|
602
|
-
<A, B extends A>(
|
|
603
|
-
|
|
603
|
+
<B extends A, A = B>(predicate: (a: A, i: number) => boolean): (self: Iterable<B>) => [init: Array<B>, rest: Array<B>]
|
|
604
|
+
<A, B extends A>(
|
|
605
|
+
self: Iterable<A>,
|
|
606
|
+
refinement: (a: A, i: number) => a is B
|
|
607
|
+
): [init: Array<B>, rest: Array<Exclude<A, B>>]
|
|
608
|
+
<A>(self: Iterable<A>, predicate: (a: A, i: number) => boolean): [init: Array<A>, rest: Array<A>]
|
|
604
609
|
} = dual(
|
|
605
610
|
2,
|
|
606
|
-
<A>(self: Iterable<A>, predicate:
|
|
611
|
+
<A>(self: Iterable<A>, predicate: (a: A, i: number) => boolean): [init: Array<A>, rest: Array<A>] =>
|
|
607
612
|
splitAt(self, spanIndex(self, predicate))
|
|
608
613
|
)
|
|
609
614
|
|
|
@@ -646,11 +651,12 @@ export const dropRight: {
|
|
|
646
651
|
* @since 2.0.0
|
|
647
652
|
*/
|
|
648
653
|
export const dropWhile: {
|
|
649
|
-
<B extends A, A = B>(predicate:
|
|
650
|
-
<A>(self: Iterable<A>, predicate:
|
|
654
|
+
<B extends A, A = B>(predicate: (a: A, i: number) => boolean): (self: Iterable<B>) => Array<B>
|
|
655
|
+
<A>(self: Iterable<A>, predicate: (a: A, i: number) => boolean): Array<A>
|
|
651
656
|
} = dual(
|
|
652
657
|
2,
|
|
653
|
-
<A>(self: Iterable<A>, predicate:
|
|
658
|
+
<A>(self: Iterable<A>, predicate: (a: A, i: number) => boolean): Array<A> =>
|
|
659
|
+
fromIterable(self).slice(spanIndex(self, predicate))
|
|
654
660
|
)
|
|
655
661
|
|
|
656
662
|
/**
|
|
@@ -660,12 +666,12 @@ export const dropWhile: {
|
|
|
660
666
|
* @since 2.0.0
|
|
661
667
|
*/
|
|
662
668
|
export const findFirstIndex: {
|
|
663
|
-
<A>(predicate:
|
|
664
|
-
<A>(self: Iterable<A>, predicate:
|
|
665
|
-
} = dual(2, <A>(self: Iterable<A>, predicate:
|
|
669
|
+
<A>(predicate: (a: A, i: number) => boolean): (self: Iterable<A>) => Option<number>
|
|
670
|
+
<A>(self: Iterable<A>, predicate: (a: A, i: number) => boolean): Option<number>
|
|
671
|
+
} = dual(2, <A>(self: Iterable<A>, predicate: (a: A, i: number) => boolean): Option<number> => {
|
|
666
672
|
let i = 0
|
|
667
673
|
for (const a of self) {
|
|
668
|
-
if (predicate(a)) {
|
|
674
|
+
if (predicate(a, i)) {
|
|
669
675
|
return O.some(i)
|
|
670
676
|
}
|
|
671
677
|
i++
|
|
@@ -680,12 +686,12 @@ export const findFirstIndex: {
|
|
|
680
686
|
* @since 2.0.0
|
|
681
687
|
*/
|
|
682
688
|
export const findLastIndex: {
|
|
683
|
-
<A>(predicate:
|
|
684
|
-
<A>(self: Iterable<A>, predicate:
|
|
685
|
-
} = dual(2, <A>(self: Iterable<A>, predicate:
|
|
689
|
+
<A>(predicate: (a: A, i: number) => boolean): (self: Iterable<A>) => Option<number>
|
|
690
|
+
<A>(self: Iterable<A>, predicate: (a: A, i: number) => boolean): Option<number>
|
|
691
|
+
} = dual(2, <A>(self: Iterable<A>, predicate: (a: A, i: number) => boolean): Option<number> => {
|
|
686
692
|
const input = fromIterable(self)
|
|
687
693
|
for (let i = input.length - 1; i >= 0; i--) {
|
|
688
|
-
if (predicate(input[i])) {
|
|
694
|
+
if (predicate(input[i], i)) {
|
|
689
695
|
return O.some(i)
|
|
690
696
|
}
|
|
691
697
|
}
|
|
@@ -1230,12 +1236,14 @@ export const split: {
|
|
|
1230
1236
|
* @since 2.0.0
|
|
1231
1237
|
*/
|
|
1232
1238
|
export const splitWhere: {
|
|
1233
|
-
<B extends A, A = B>(
|
|
1234
|
-
|
|
1239
|
+
<B extends A, A = B>(
|
|
1240
|
+
predicate: (a: A, i: number) => boolean
|
|
1241
|
+
): (self: Iterable<B>) => [beforeMatch: Array<B>, fromMatch: Array<B>]
|
|
1242
|
+
<A>(self: Iterable<A>, predicate: (a: A, i: number) => boolean): [beforeMatch: Array<A>, fromMatch: Array<A>]
|
|
1235
1243
|
} = dual(
|
|
1236
1244
|
2,
|
|
1237
|
-
<A>(self: Iterable<A>, predicate:
|
|
1238
|
-
span(self,
|
|
1245
|
+
<A>(self: Iterable<A>, predicate: (a: A, i: number) => boolean): [beforeMatch: Array<A>, fromMatch: Array<A>] =>
|
|
1246
|
+
span(self, (a: A, i: number) => !predicate(a, i))
|
|
1239
1247
|
)
|
|
1240
1248
|
|
|
1241
1249
|
/**
|
|
@@ -1578,17 +1586,19 @@ export const filterMap: {
|
|
|
1578
1586
|
* @since 2.0.0
|
|
1579
1587
|
*/
|
|
1580
1588
|
export const filterMapWhile: {
|
|
1581
|
-
<A, B>(f: (a: A) => Option<B>): (self: Iterable<A>) => Array<B>
|
|
1582
|
-
<A, B>(self: Iterable<A>, f: (a: A) => Option<B>): Array<B>
|
|
1583
|
-
} = dual(2, <A, B>(self: Iterable<A>, f: (a: A) => Option<B>) => {
|
|
1589
|
+
<A, B>(f: (a: A, i: number) => Option<B>): (self: Iterable<A>) => Array<B>
|
|
1590
|
+
<A, B>(self: Iterable<A>, f: (a: A, i: number) => Option<B>): Array<B>
|
|
1591
|
+
} = dual(2, <A, B>(self: Iterable<A>, f: (a: A, i: number) => Option<B>) => {
|
|
1592
|
+
let i = 0
|
|
1584
1593
|
const out: Array<B> = []
|
|
1585
1594
|
for (const a of self) {
|
|
1586
|
-
const b = f(a)
|
|
1595
|
+
const b = f(a, i)
|
|
1587
1596
|
if (O.isSome(b)) {
|
|
1588
1597
|
out.push(b.value)
|
|
1589
1598
|
} else {
|
|
1590
1599
|
break
|
|
1591
1600
|
}
|
|
1601
|
+
i++
|
|
1592
1602
|
}
|
|
1593
1603
|
return out
|
|
1594
1604
|
})
|
|
@@ -1844,13 +1854,13 @@ export const liftEither = <A extends Array<unknown>, E, B>(
|
|
|
1844
1854
|
* @since 2.0.0
|
|
1845
1855
|
*/
|
|
1846
1856
|
export const every: {
|
|
1847
|
-
<A, B extends A>(refinement:
|
|
1848
|
-
<A>(predicate:
|
|
1849
|
-
<A, B extends A>(self: ReadonlyArray<A>, refinement:
|
|
1850
|
-
<A>(self: ReadonlyArray<A>, predicate:
|
|
1857
|
+
<A, B extends A>(refinement: (a: A, i: number) => a is B): (self: ReadonlyArray<A>) => self is ReadonlyArray<B>
|
|
1858
|
+
<A>(predicate: (a: A, i: number) => boolean): (self: ReadonlyArray<A>) => boolean
|
|
1859
|
+
<A, B extends A>(self: ReadonlyArray<A>, refinement: (a: A, i: number) => a is B): self is ReadonlyArray<B>
|
|
1860
|
+
<A>(self: ReadonlyArray<A>, predicate: (a: A, i: number) => boolean): boolean
|
|
1851
1861
|
} = dual(
|
|
1852
1862
|
2,
|
|
1853
|
-
<A, B extends A>(self: ReadonlyArray<A>, refinement:
|
|
1863
|
+
<A, B extends A>(self: ReadonlyArray<A>, refinement: (a: A, i: number) => a is B): self is ReadonlyArray<B> =>
|
|
1854
1864
|
self.every(refinement)
|
|
1855
1865
|
)
|
|
1856
1866
|
|
|
@@ -1861,11 +1871,14 @@ export const every: {
|
|
|
1861
1871
|
* @since 2.0.0
|
|
1862
1872
|
*/
|
|
1863
1873
|
export const some: {
|
|
1864
|
-
<B extends A, A = B>(
|
|
1865
|
-
|
|
1874
|
+
<B extends A, A = B>(
|
|
1875
|
+
predicate: (a: A, i: number) => boolean
|
|
1876
|
+
): (self: ReadonlyArray<B>) => self is NonEmptyReadonlyArray<B>
|
|
1877
|
+
<A>(self: ReadonlyArray<A>, predicate: (a: A, i: number) => boolean): self is NonEmptyReadonlyArray<A>
|
|
1866
1878
|
} = dual(
|
|
1867
1879
|
2,
|
|
1868
|
-
<A>(self: ReadonlyArray<A>, predicate:
|
|
1880
|
+
<A>(self: ReadonlyArray<A>, predicate: (a: A, i: number) => boolean): self is NonEmptyReadonlyArray<A> =>
|
|
1881
|
+
self.some(predicate)
|
|
1869
1882
|
)
|
|
1870
1883
|
|
|
1871
1884
|
/**
|
|
@@ -2026,18 +2039,26 @@ export const join: {
|
|
|
2026
2039
|
* @category folding
|
|
2027
2040
|
*/
|
|
2028
2041
|
export const mapAccum: {
|
|
2029
|
-
<S, A, B>(
|
|
2030
|
-
|
|
2031
|
-
|
|
2032
|
-
|
|
2033
|
-
|
|
2034
|
-
|
|
2035
|
-
|
|
2036
|
-
|
|
2037
|
-
|
|
2042
|
+
<S, A, B>(
|
|
2043
|
+
s: S,
|
|
2044
|
+
f: (s: S, a: A, i: number) => readonly [S, B]
|
|
2045
|
+
): (self: Iterable<A>) => [state: S, mappedArray: Array<B>]
|
|
2046
|
+
<S, A, B>(self: Iterable<A>, s: S, f: (s: S, a: A, i: number) => readonly [S, B]): [state: S, mappedArray: Array<B>]
|
|
2047
|
+
} = dual(
|
|
2048
|
+
3,
|
|
2049
|
+
<S, A, B>(self: Iterable<A>, s: S, f: (s: S, a: A, i: number) => [S, B]): [state: S, mappedArray: Array<B>] => {
|
|
2050
|
+
let i = 0
|
|
2051
|
+
let s1 = s
|
|
2052
|
+
const out: Array<B> = []
|
|
2053
|
+
for (const a of self) {
|
|
2054
|
+
const r = f(s1, a, i)
|
|
2055
|
+
s1 = r[0]
|
|
2056
|
+
out.push(r[1])
|
|
2057
|
+
i++
|
|
2058
|
+
}
|
|
2059
|
+
return [s1, out]
|
|
2038
2060
|
}
|
|
2039
|
-
|
|
2040
|
-
})
|
|
2061
|
+
)
|
|
2041
2062
|
|
|
2042
2063
|
/**
|
|
2043
2064
|
* Zips this chunk crosswise with the specified chunk using the specified combiner.
|
package/src/Schedule.ts
CHANGED
|
@@ -405,6 +405,18 @@ export const mapInputEffect: {
|
|
|
405
405
|
*/
|
|
406
406
|
export const count: Schedule<never, unknown, number> = internal.count
|
|
407
407
|
|
|
408
|
+
/**
|
|
409
|
+
* Cron schedule that recurs every `minute` that matches the schedule.
|
|
410
|
+
*
|
|
411
|
+
* It triggers at zero second of the minute. Producing the timestamps of the cron window.
|
|
412
|
+
*
|
|
413
|
+
* NOTE: `expression` parameter is validated lazily. Must be a valid cron expression.
|
|
414
|
+
*
|
|
415
|
+
* @since 2.0.0
|
|
416
|
+
* @category constructors
|
|
417
|
+
*/
|
|
418
|
+
export const cron: (expression: string) => Schedule<never, unknown, [number, number]> = internal.cron
|
|
419
|
+
|
|
408
420
|
/**
|
|
409
421
|
* Cron-like schedule that recurs every specified `day` of month. Won't recur
|
|
410
422
|
* on months containing less days than specified in `day` param.
|
package/src/index.ts
CHANGED
package/src/internal/schedule.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type * as Cause from "../Cause.js"
|
|
|
2
2
|
import * as Chunk from "../Chunk.js"
|
|
3
3
|
import * as Clock from "../Clock.js"
|
|
4
4
|
import * as Context from "../Context.js"
|
|
5
|
+
import * as Cron from "../Cron.js"
|
|
5
6
|
import * as Duration from "../Duration.js"
|
|
6
7
|
import type * as Effect from "../Effect.js"
|
|
7
8
|
import * as Either from "../Either.js"
|
|
@@ -419,6 +420,47 @@ export const mapInputEffect = dual<
|
|
|
419
420
|
(input) => self.step(now, input, state)
|
|
420
421
|
)))
|
|
421
422
|
|
|
423
|
+
/** @internal */
|
|
424
|
+
export const cron = (expression: string): Schedule.Schedule<never, unknown, [number, number]> => {
|
|
425
|
+
const parsed = Cron.parse(expression)
|
|
426
|
+
return makeWithState<[boolean, [number, number, number]], never, unknown, [number, number]>(
|
|
427
|
+
[true, [Number.MIN_SAFE_INTEGER, 0, 0]],
|
|
428
|
+
(now, _, [initial, previous]) => {
|
|
429
|
+
if (now < previous[0]) {
|
|
430
|
+
return core.succeed([
|
|
431
|
+
[false, previous],
|
|
432
|
+
[previous[1], previous[2]],
|
|
433
|
+
ScheduleDecision.continueWith(Interval.make(previous[1], previous[2]))
|
|
434
|
+
])
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
if (Either.isLeft(parsed)) {
|
|
438
|
+
return core.die(parsed.left)
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
const cron = parsed.right
|
|
442
|
+
const date = new Date(now)
|
|
443
|
+
|
|
444
|
+
let next: number
|
|
445
|
+
if (initial && Cron.match(cron, date)) {
|
|
446
|
+
next = now
|
|
447
|
+
} else {
|
|
448
|
+
const result = Cron.next(cron, date)
|
|
449
|
+
next = result.getTime()
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
const start = beginningOfMinute(next)
|
|
453
|
+
const end = endOfMinute(next)
|
|
454
|
+
const interval = Interval.make(start, end)
|
|
455
|
+
return core.succeed([
|
|
456
|
+
[false, [next, start, end]],
|
|
457
|
+
[start, end],
|
|
458
|
+
ScheduleDecision.continueWith(interval)
|
|
459
|
+
])
|
|
460
|
+
}
|
|
461
|
+
)
|
|
462
|
+
}
|
|
463
|
+
|
|
422
464
|
/** @internal */
|
|
423
465
|
export const dayOfMonth = (day: number): Schedule.Schedule<never, unknown, number> => {
|
|
424
466
|
return makeWithState<[number, number], never, unknown, number>(
|
package/src/internal/version.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const moduleVersion = "2.0.
|
|
1
|
+
export const moduleVersion = "2.0.3"
|