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.
Files changed (44) hide show
  1. package/Cron/package.json +6 -0
  2. package/dist/cjs/Cron.js +457 -0
  3. package/dist/cjs/Cron.js.map +1 -0
  4. package/dist/cjs/Fiber.js.map +1 -1
  5. package/dist/cjs/ReadonlyArray.js +13 -7
  6. package/dist/cjs/ReadonlyArray.js.map +1 -1
  7. package/dist/cjs/Schedule.js +12 -1
  8. package/dist/cjs/Schedule.js.map +1 -1
  9. package/dist/cjs/index.js +4 -2
  10. package/dist/cjs/index.js.map +1 -1
  11. package/dist/cjs/internal/schedule.js +29 -2
  12. package/dist/cjs/internal/schedule.js.map +1 -1
  13. package/dist/cjs/internal/version.js +1 -1
  14. package/dist/dts/Cron.d.ts +170 -0
  15. package/dist/dts/Cron.d.ts.map +1 -0
  16. package/dist/dts/Fiber.d.ts +6 -0
  17. package/dist/dts/Fiber.d.ts.map +1 -1
  18. package/dist/dts/ReadonlyArray.d.ts +26 -26
  19. package/dist/dts/ReadonlyArray.d.ts.map +1 -1
  20. package/dist/dts/Schedule.d.ts +11 -0
  21. package/dist/dts/Schedule.d.ts.map +1 -1
  22. package/dist/dts/index.d.ts +4 -0
  23. package/dist/dts/index.d.ts.map +1 -1
  24. package/dist/dts/internal/version.d.ts +1 -1
  25. package/dist/esm/Cron.js +418 -0
  26. package/dist/esm/Cron.js.map +1 -0
  27. package/dist/esm/Fiber.js.map +1 -1
  28. package/dist/esm/ReadonlyArray.js +14 -8
  29. package/dist/esm/ReadonlyArray.js.map +1 -1
  30. package/dist/esm/Schedule.js +11 -0
  31. package/dist/esm/Schedule.js.map +1 -1
  32. package/dist/esm/index.js +4 -0
  33. package/dist/esm/index.js.map +1 -1
  34. package/dist/esm/internal/schedule.js +26 -0
  35. package/dist/esm/internal/schedule.js.map +1 -1
  36. package/dist/esm/internal/version.js +1 -1
  37. package/package.json +9 -1
  38. package/src/Cron.ts +525 -0
  39. package/src/Fiber.ts +7 -0
  40. package/src/ReadonlyArray.ts +74 -53
  41. package/src/Schedule.ts +12 -0
  42. package/src/index.ts +5 -0
  43. package/src/internal/schedule.ts +42 -0
  44. package/src/internal/version.ts +1 -1
@@ -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: Refinement<A, B>): (self: Iterable<A>) => Array<B>
563
- <B extends A, A = B>(predicate: Predicate<A>): (self: Iterable<B>) => Array<B>
564
- <A, B extends A>(self: Iterable<A>, refinement: Refinement<A, B>): Array<B>
565
- <A>(self: Iterable<A>, predicate: Predicate<A>): Array<A>
566
- } = dual(2, <A>(self: Iterable<A>, predicate: Predicate<A>): Array<A> => {
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: Predicate<A>): number => {
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: Refinement<A, B>
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: Predicate<A>): (self: Iterable<B>) => [init: Array<B>, rest: Array<B>]
602
- <A, B extends A>(self: Iterable<A>, refinement: Refinement<A, B>): [init: Array<B>, rest: Array<Exclude<A, B>>]
603
- <A>(self: Iterable<A>, predicate: Predicate<A>): [init: Array<A>, rest: Array<A>]
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: Predicate<A>): [init: Array<A>, rest: Array<A>] =>
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: Predicate<A>): (self: Iterable<B>) => Array<B>
650
- <A>(self: Iterable<A>, predicate: Predicate<A>): Array<A>
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: Predicate<A>): Array<A> => fromIterable(self).slice(spanIndex(self, 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: Predicate<A>): (self: Iterable<A>) => Option<number>
664
- <A>(self: Iterable<A>, predicate: Predicate<A>): Option<number>
665
- } = dual(2, <A>(self: Iterable<A>, predicate: Predicate<A>): Option<number> => {
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: Predicate<A>): (self: Iterable<A>) => Option<number>
684
- <A>(self: Iterable<A>, predicate: Predicate<A>): Option<number>
685
- } = dual(2, <A>(self: Iterable<A>, predicate: Predicate<A>): Option<number> => {
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>(predicate: Predicate<A>): (self: Iterable<B>) => [beforeMatch: Array<B>, fromMatch: Array<B>]
1234
- <A>(self: Iterable<A>, predicate: Predicate<A>): [beforeMatch: Array<A>, fromMatch: Array<A>]
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: Predicate<A>): [beforeMatch: Array<A>, fromMatch: Array<A>] =>
1238
- span(self, not(predicate))
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: Refinement<A, B>): (self: ReadonlyArray<A>) => self is ReadonlyArray<B>
1848
- <A>(predicate: Predicate<A>): (self: ReadonlyArray<A>) => boolean
1849
- <A, B extends A>(self: ReadonlyArray<A>, refinement: Refinement<A, B>): self is ReadonlyArray<B>
1850
- <A>(self: ReadonlyArray<A>, predicate: Predicate<A>): boolean
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: Refinement<A, B>): self is ReadonlyArray<B> =>
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>(predicate: Predicate<A>): (self: ReadonlyArray<B>) => self is NonEmptyReadonlyArray<B>
1865
- <A>(self: ReadonlyArray<A>, predicate: Predicate<A>): self is NonEmptyReadonlyArray<A>
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: Predicate<A>): self is NonEmptyReadonlyArray<A> => self.some(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>(s: S, f: (s: S, a: A) => readonly [S, B]): (self: Iterable<A>) => [state: S, mappedArray: Array<B>]
2030
- <S, A, B>(self: Iterable<A>, s: S, f: (s: S, a: A) => readonly [S, B]): [state: S, mappedArray: Array<B>]
2031
- } = dual(3, <S, A, B>(self: Iterable<A>, s: S, f: (s: S, a: A) => [S, B]): [state: S, mappedArray: Array<B>] => {
2032
- let s1 = s
2033
- const out: Array<B> = []
2034
- for (const a of self) {
2035
- const r = f(s1, a)
2036
- s1 = r[0]
2037
- out.push(r[1])
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
- return [s1, out]
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
@@ -170,6 +170,11 @@ export * as Console from "./Console.js"
170
170
  */
171
171
  export * as Context from "./Context.js"
172
172
 
173
+ /**
174
+ * @since 2.0.0
175
+ */
176
+ export * as Cron from "./Cron.js"
177
+
173
178
  /**
174
179
  * @since 2.0.0
175
180
  */
@@ -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>(
@@ -1 +1 @@
1
- export const moduleVersion = "2.0.1"
1
+ export const moduleVersion = "2.0.3"