effect 2.3.8 → 2.4.1

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 (279) hide show
  1. package/dist/cjs/BigInt.js +14 -1
  2. package/dist/cjs/BigInt.js.map +1 -1
  3. package/dist/cjs/Effect.js +48 -61
  4. package/dist/cjs/Effect.js.map +1 -1
  5. package/dist/cjs/Either.js +35 -6
  6. package/dist/cjs/Either.js.map +1 -1
  7. package/dist/cjs/Equal.js +1 -1
  8. package/dist/cjs/Equal.js.map +1 -1
  9. package/dist/cjs/Exit.js +1 -1
  10. package/dist/cjs/Number.js +25 -1
  11. package/dist/cjs/Number.js.map +1 -1
  12. package/dist/cjs/Predicate.js +40 -3
  13. package/dist/cjs/Predicate.js.map +1 -1
  14. package/dist/cjs/ReadonlyArray.js +2 -2
  15. package/dist/cjs/ReadonlyArray.js.map +1 -1
  16. package/dist/cjs/ReadonlyRecord.js +71 -76
  17. package/dist/cjs/ReadonlyRecord.js.map +1 -1
  18. package/dist/cjs/STM.js.map +1 -1
  19. package/dist/cjs/Schedule.js.map +1 -1
  20. package/dist/cjs/Sink.js.map +1 -1
  21. package/dist/cjs/Stream.js +3 -23
  22. package/dist/cjs/Stream.js.map +1 -1
  23. package/dist/cjs/Struct.js +3 -1
  24. package/dist/cjs/Struct.js.map +1 -1
  25. package/dist/cjs/TestAnnotation.js.map +1 -1
  26. package/dist/cjs/internal/channel/channelExecutor.js +5 -5
  27. package/dist/cjs/internal/channel/channelExecutor.js.map +1 -1
  28. package/dist/cjs/internal/channel/channelState.js +5 -5
  29. package/dist/cjs/internal/channel/channelState.js.map +1 -1
  30. package/dist/cjs/internal/channel.js.map +1 -1
  31. package/dist/cjs/internal/clock.js +3 -4
  32. package/dist/cjs/internal/clock.js.map +1 -1
  33. package/dist/cjs/internal/core-effect.js +6 -23
  34. package/dist/cjs/internal/core-effect.js.map +1 -1
  35. package/dist/cjs/internal/core.js +11 -27
  36. package/dist/cjs/internal/core.js.map +1 -1
  37. package/dist/cjs/internal/effect/circular.js +4 -5
  38. package/dist/cjs/internal/effect/circular.js.map +1 -1
  39. package/dist/cjs/internal/either.js +3 -3
  40. package/dist/cjs/internal/either.js.map +1 -1
  41. package/dist/cjs/internal/groupBy.js.map +1 -1
  42. package/dist/cjs/internal/layer.js +0 -2
  43. package/dist/cjs/internal/layer.js.map +1 -1
  44. package/dist/cjs/internal/runtime.js +12 -1
  45. package/dist/cjs/internal/runtime.js.map +1 -1
  46. package/dist/cjs/internal/schedule.js +4 -4
  47. package/dist/cjs/internal/schedule.js.map +1 -1
  48. package/dist/cjs/internal/sink.js +0 -2
  49. package/dist/cjs/internal/sink.js.map +1 -1
  50. package/dist/cjs/internal/stm/stm.js +1 -0
  51. package/dist/cjs/internal/stm/stm.js.map +1 -1
  52. package/dist/cjs/internal/stream.js +51 -64
  53. package/dist/cjs/internal/stream.js.map +1 -1
  54. package/dist/cjs/internal/version.js +1 -1
  55. package/dist/dts/BigInt.d.ts +7 -0
  56. package/dist/dts/BigInt.d.ts.map +1 -1
  57. package/dist/dts/Brand.d.ts +1 -1
  58. package/dist/dts/Brand.d.ts.map +1 -1
  59. package/dist/dts/Cause.d.ts +1 -1
  60. package/dist/dts/Cause.d.ts.map +1 -1
  61. package/dist/dts/Channel.d.ts +11 -11
  62. package/dist/dts/Channel.d.ts.map +1 -1
  63. package/dist/dts/Chunk.d.ts +3 -3
  64. package/dist/dts/Config.d.ts +4 -4
  65. package/dist/dts/Config.d.ts.map +1 -1
  66. package/dist/dts/Cron.d.ts +1 -1
  67. package/dist/dts/Cron.d.ts.map +1 -1
  68. package/dist/dts/Differ.d.ts +2 -2
  69. package/dist/dts/Differ.d.ts.map +1 -1
  70. package/dist/dts/Effect.d.ts +84 -108
  71. package/dist/dts/Effect.d.ts.map +1 -1
  72. package/dist/dts/Either.d.ts +126 -83
  73. package/dist/dts/Either.d.ts.map +1 -1
  74. package/dist/dts/Encoding.d.ts +6 -6
  75. package/dist/dts/Encoding.d.ts.map +1 -1
  76. package/dist/dts/Equal.d.ts.map +1 -1
  77. package/dist/dts/Exit.d.ts +2 -2
  78. package/dist/dts/Fiber.d.ts +2 -2
  79. package/dist/dts/Fiber.d.ts.map +1 -1
  80. package/dist/dts/GroupBy.d.ts +12 -12
  81. package/dist/dts/GroupBy.d.ts.map +1 -1
  82. package/dist/dts/Layer.d.ts +26 -26
  83. package/dist/dts/Layer.d.ts.map +1 -1
  84. package/dist/dts/List.d.ts +2 -2
  85. package/dist/dts/Logger.d.ts +4 -4
  86. package/dist/dts/Match.d.ts +2 -2
  87. package/dist/dts/Match.d.ts.map +1 -1
  88. package/dist/dts/MergeDecision.d.ts +1 -1
  89. package/dist/dts/MergeState.d.ts +5 -5
  90. package/dist/dts/MergeState.d.ts.map +1 -1
  91. package/dist/dts/Metric.d.ts +13 -13
  92. package/dist/dts/Metric.d.ts.map +1 -1
  93. package/dist/dts/MetricPolling.d.ts +4 -4
  94. package/dist/dts/MetricPolling.d.ts.map +1 -1
  95. package/dist/dts/Number.d.ts +8 -0
  96. package/dist/dts/Number.d.ts.map +1 -1
  97. package/dist/dts/Option.d.ts +11 -11
  98. package/dist/dts/Predicate.d.ts +37 -2
  99. package/dist/dts/Predicate.d.ts.map +1 -1
  100. package/dist/dts/ReadonlyArray.d.ts +9 -8
  101. package/dist/dts/ReadonlyArray.d.ts.map +1 -1
  102. package/dist/dts/ReadonlyRecord.d.ts +111 -94
  103. package/dist/dts/ReadonlyRecord.d.ts.map +1 -1
  104. package/dist/dts/Reloadable.d.ts +4 -4
  105. package/dist/dts/Reloadable.d.ts.map +1 -1
  106. package/dist/dts/RequestResolver.d.ts +13 -13
  107. package/dist/dts/RequestResolver.d.ts.map +1 -1
  108. package/dist/dts/Resource.d.ts +1 -1
  109. package/dist/dts/Resource.d.ts.map +1 -1
  110. package/dist/dts/STM.d.ts +144 -139
  111. package/dist/dts/STM.d.ts.map +1 -1
  112. package/dist/dts/Schedule.d.ts +171 -179
  113. package/dist/dts/Schedule.d.ts.map +1 -1
  114. package/dist/dts/SingleProducerAsyncInput.d.ts +1 -1
  115. package/dist/dts/SingleProducerAsyncInput.d.ts.map +1 -1
  116. package/dist/dts/Sink.d.ts +13 -13
  117. package/dist/dts/Sink.d.ts.map +1 -1
  118. package/dist/dts/Stream.d.ts +355 -366
  119. package/dist/dts/Stream.d.ts.map +1 -1
  120. package/dist/dts/Struct.d.ts +3 -3
  121. package/dist/dts/Struct.d.ts.map +1 -1
  122. package/dist/dts/SubscriptionRef.d.ts +2 -2
  123. package/dist/dts/TArray.d.ts +2 -2
  124. package/dist/dts/TDeferred.d.ts +3 -3
  125. package/dist/dts/TMap.d.ts +10 -10
  126. package/dist/dts/TSet.d.ts +4 -4
  127. package/dist/dts/Take.d.ts +2 -2
  128. package/dist/dts/TestAnnotation.d.ts +2 -2
  129. package/dist/dts/TestAnnotation.d.ts.map +1 -1
  130. package/dist/dts/Types.d.ts +7 -0
  131. package/dist/dts/Types.d.ts.map +1 -1
  132. package/dist/dts/internal/stm/stm.d.ts +2 -15
  133. package/dist/dts/internal/stm/stm.d.ts.map +1 -1
  134. package/dist/esm/BigInt.js +12 -0
  135. package/dist/esm/BigInt.js.map +1 -1
  136. package/dist/esm/Effect.js +45 -58
  137. package/dist/esm/Effect.js.map +1 -1
  138. package/dist/esm/Either.js +42 -5
  139. package/dist/esm/Either.js.map +1 -1
  140. package/dist/esm/Equal.js +1 -1
  141. package/dist/esm/Equal.js.map +1 -1
  142. package/dist/esm/Exit.js +1 -1
  143. package/dist/esm/Number.js +23 -0
  144. package/dist/esm/Number.js.map +1 -1
  145. package/dist/esm/Predicate.js +37 -2
  146. package/dist/esm/Predicate.js.map +1 -1
  147. package/dist/esm/ReadonlyArray.js +2 -2
  148. package/dist/esm/ReadonlyArray.js.map +1 -1
  149. package/dist/esm/ReadonlyRecord.js +70 -75
  150. package/dist/esm/ReadonlyRecord.js.map +1 -1
  151. package/dist/esm/STM.js.map +1 -1
  152. package/dist/esm/Schedule.js.map +1 -1
  153. package/dist/esm/Sink.js.map +1 -1
  154. package/dist/esm/Stream.js +5 -22
  155. package/dist/esm/Stream.js.map +1 -1
  156. package/dist/esm/Struct.js +3 -1
  157. package/dist/esm/Struct.js.map +1 -1
  158. package/dist/esm/TestAnnotation.js.map +1 -1
  159. package/dist/esm/internal/channel/channelExecutor.js +5 -5
  160. package/dist/esm/internal/channel/channelExecutor.js.map +1 -1
  161. package/dist/esm/internal/channel/channelState.js +3 -3
  162. package/dist/esm/internal/channel/channelState.js.map +1 -1
  163. package/dist/esm/internal/channel.js.map +1 -1
  164. package/dist/esm/internal/clock.js +3 -4
  165. package/dist/esm/internal/clock.js.map +1 -1
  166. package/dist/esm/internal/core-effect.js +4 -20
  167. package/dist/esm/internal/core-effect.js.map +1 -1
  168. package/dist/esm/internal/core.js +8 -22
  169. package/dist/esm/internal/core.js.map +1 -1
  170. package/dist/esm/internal/effect/circular.js +4 -5
  171. package/dist/esm/internal/effect/circular.js.map +1 -1
  172. package/dist/esm/internal/either.js +3 -3
  173. package/dist/esm/internal/either.js.map +1 -1
  174. package/dist/esm/internal/groupBy.js.map +1 -1
  175. package/dist/esm/internal/layer.js +0 -2
  176. package/dist/esm/internal/layer.js.map +1 -1
  177. package/dist/esm/internal/runtime.js +12 -1
  178. package/dist/esm/internal/runtime.js.map +1 -1
  179. package/dist/esm/internal/schedule.js +4 -4
  180. package/dist/esm/internal/schedule.js.map +1 -1
  181. package/dist/esm/internal/sink.js +0 -2
  182. package/dist/esm/internal/sink.js.map +1 -1
  183. package/dist/esm/internal/stm/stm.js +1 -0
  184. package/dist/esm/internal/stm/stm.js.map +1 -1
  185. package/dist/esm/internal/stream.js +49 -59
  186. package/dist/esm/internal/stream.js.map +1 -1
  187. package/dist/esm/internal/version.js +1 -1
  188. package/package.json +1 -1
  189. package/src/BigInt.ts +13 -0
  190. package/src/Brand.ts +4 -4
  191. package/src/Cause.ts +1 -1
  192. package/src/Channel.ts +17 -17
  193. package/src/Chunk.ts +4 -4
  194. package/src/Config.ts +4 -4
  195. package/src/Cron.ts +2 -2
  196. package/src/Differ.ts +2 -2
  197. package/src/Effect.ts +100 -145
  198. package/src/Either.ts +215 -133
  199. package/src/Encoding.ts +3 -3
  200. package/src/Equal.ts +1 -1
  201. package/src/Exit.ts +2 -2
  202. package/src/Fiber.ts +2 -2
  203. package/src/GroupBy.ts +16 -16
  204. package/src/Layer.ts +32 -32
  205. package/src/List.ts +3 -3
  206. package/src/Logger.ts +4 -4
  207. package/src/Match.ts +3 -3
  208. package/src/MergeDecision.ts +1 -1
  209. package/src/MergeState.ts +8 -8
  210. package/src/Metric.ts +13 -13
  211. package/src/MetricPolling.ts +9 -9
  212. package/src/Number.ts +26 -0
  213. package/src/Option.ts +17 -17
  214. package/src/Predicate.ts +39 -2
  215. package/src/ReadonlyArray.ts +23 -15
  216. package/src/ReadonlyRecord.ts +421 -265
  217. package/src/Reloadable.ts +4 -4
  218. package/src/RequestResolver.ts +19 -19
  219. package/src/Resource.ts +3 -3
  220. package/src/STM.ts +166 -213
  221. package/src/Schedule.ts +331 -361
  222. package/src/SingleProducerAsyncInput.ts +1 -1
  223. package/src/Sink.ts +19 -19
  224. package/src/Stream.ts +449 -456
  225. package/src/Struct.ts +8 -5
  226. package/src/SubscriptionRef.ts +2 -2
  227. package/src/TArray.ts +2 -2
  228. package/src/TDeferred.ts +4 -4
  229. package/src/TMap.ts +10 -10
  230. package/src/TSet.ts +4 -4
  231. package/src/Take.ts +4 -4
  232. package/src/TestAnnotation.ts +5 -8
  233. package/src/Types.ts +11 -0
  234. package/src/internal/blockedRequests.ts +2 -2
  235. package/src/internal/cause.ts +2 -2
  236. package/src/internal/channel/channelExecutor.ts +26 -26
  237. package/src/internal/channel/channelState.ts +13 -13
  238. package/src/internal/channel/mergeDecision.ts +1 -1
  239. package/src/internal/channel/mergeState.ts +6 -6
  240. package/src/internal/channel/singleProducerAsyncInput.ts +5 -5
  241. package/src/internal/channel.ts +43 -43
  242. package/src/internal/clock.ts +3 -4
  243. package/src/internal/config.ts +7 -7
  244. package/src/internal/configError.ts +1 -1
  245. package/src/internal/configProvider/pathPatch.ts +2 -2
  246. package/src/internal/configProvider.ts +1 -1
  247. package/src/internal/core-effect.ts +28 -43
  248. package/src/internal/core.ts +15 -40
  249. package/src/internal/dataSource.ts +26 -26
  250. package/src/internal/differ/orPatch.ts +7 -7
  251. package/src/internal/differ.ts +2 -2
  252. package/src/internal/effect/circular.ts +9 -10
  253. package/src/internal/either.ts +25 -22
  254. package/src/internal/encoding/base64.ts +1 -1
  255. package/src/internal/encoding/base64Url.ts +1 -1
  256. package/src/internal/encoding/hex.ts +1 -1
  257. package/src/internal/fiber.ts +2 -2
  258. package/src/internal/fiberRuntime.ts +9 -9
  259. package/src/internal/groupBy.ts +40 -40
  260. package/src/internal/layer/circular.ts +4 -4
  261. package/src/internal/layer.ts +52 -54
  262. package/src/internal/matcher.ts +5 -5
  263. package/src/internal/metric/polling.ts +8 -8
  264. package/src/internal/metric.ts +6 -6
  265. package/src/internal/reloadable.ts +4 -4
  266. package/src/internal/resource.ts +2 -2
  267. package/src/internal/runtime.ts +32 -19
  268. package/src/internal/schedule.ts +430 -500
  269. package/src/internal/sink.ts +27 -29
  270. package/src/internal/stm/core.ts +23 -23
  271. package/src/internal/stm/stm.ts +158 -157
  272. package/src/internal/stm/tArray.ts +3 -3
  273. package/src/internal/stm/tDeferred.ts +5 -5
  274. package/src/internal/stm/tMap.ts +13 -13
  275. package/src/internal/stm/tSet.ts +4 -4
  276. package/src/internal/stream.ts +688 -723
  277. package/src/internal/subscriptionRef.ts +3 -3
  278. package/src/internal/take.ts +6 -6
  279. package/src/internal/version.ts +1 -1
package/src/Either.ts CHANGED
@@ -12,7 +12,7 @@ import type { Option } from "./Option.js"
12
12
  import type { Pipeable } from "./Pipeable.js"
13
13
  import type { Predicate, Refinement } from "./Predicate.js"
14
14
  import { isFunction } from "./Predicate.js"
15
- import type { Covariant, NoInfer } from "./Types.js"
15
+ import type { Covariant, MergeRecord, NoInfer } from "./Types.js"
16
16
  import type * as Unify from "./Unify.js"
17
17
  import * as Gen from "./Utils.js"
18
18
 
@@ -20,7 +20,7 @@ import * as Gen from "./Utils.js"
20
20
  * @category models
21
21
  * @since 2.0.0
22
22
  */
23
- export type Either<E, A> = Left<E, A> | Right<E, A>
23
+ export type Either<R, L = never> = Left<L, R> | Right<L, R>
24
24
 
25
25
  /**
26
26
  * @category symbols
@@ -38,13 +38,13 @@ export type TypeId = typeof TypeId
38
38
  * @category models
39
39
  * @since 2.0.0
40
40
  */
41
- export interface Left<out E, out A> extends Pipeable, Inspectable {
41
+ export interface Left<out L, out R> extends Pipeable, Inspectable {
42
42
  readonly _tag: "Left"
43
43
  readonly _op: "Left"
44
- readonly left: E
44
+ readonly left: L
45
45
  readonly [TypeId]: {
46
- readonly _A: Covariant<A>
47
- readonly _E: Covariant<E>
46
+ readonly _R: Covariant<R>
47
+ readonly _L: Covariant<L>
48
48
  }
49
49
  [Unify.typeSymbol]?: unknown
50
50
  [Unify.unifySymbol]?: EitherUnify<this>
@@ -55,13 +55,13 @@ export interface Left<out E, out A> extends Pipeable, Inspectable {
55
55
  * @category models
56
56
  * @since 2.0.0
57
57
  */
58
- export interface Right<out E, out A> extends Pipeable, Inspectable {
58
+ export interface Right<out L, out R> extends Pipeable, Inspectable {
59
59
  readonly _tag: "Right"
60
60
  readonly _op: "Right"
61
- readonly right: A
61
+ readonly right: R
62
62
  readonly [TypeId]: {
63
- readonly _A: Covariant<A>
64
- readonly _E: Covariant<E>
63
+ readonly _R: Covariant<R>
64
+ readonly _L: Covariant<L>
65
65
  }
66
66
  [Unify.typeSymbol]?: unknown
67
67
  [Unify.unifySymbol]?: EitherUnify<this>
@@ -73,7 +73,7 @@ export interface Right<out E, out A> extends Pipeable, Inspectable {
73
73
  * @since 2.0.0
74
74
  */
75
75
  export interface EitherUnify<A extends { [Unify.typeSymbol]?: any }> {
76
- Either?: () => A[Unify.typeSymbol] extends Either<infer E0, infer A0> | infer _ ? Either<E0, A0> : never
76
+ Either?: () => A[Unify.typeSymbol] extends Either<infer R0, infer L0> | infer _ ? Either<R0, L0> : never
77
77
  }
78
78
 
79
79
  /**
@@ -87,7 +87,7 @@ export interface EitherUnifyIgnore {}
87
87
  * @since 2.0.0
88
88
  */
89
89
  export interface EitherTypeLambda extends TypeLambda {
90
- readonly type: Either<this["Out1"], this["Target"]>
90
+ readonly type: Either<this["Target"], this["Out1"]>
91
91
  }
92
92
 
93
93
  /**
@@ -97,7 +97,7 @@ export interface EitherTypeLambda extends TypeLambda {
97
97
  * @category constructors
98
98
  * @since 2.0.0
99
99
  */
100
- export const right: <A>(a: A) => Either<never, A> = either.right
100
+ export const right: <R>(right: R) => Either<R> = either.right
101
101
 
102
102
  /**
103
103
  * Constructs a new `Either` holding a `Left` value. This usually represents a failure, due to the right-bias of this
@@ -106,7 +106,7 @@ export const right: <A>(a: A) => Either<never, A> = either.right
106
106
  * @category constructors
107
107
  * @since 2.0.0
108
108
  */
109
- export const left: <E>(e: E) => Either<E, never> = either.left
109
+ export const left: <L>(left: L) => Either<never, L> = either.left
110
110
 
111
111
  /**
112
112
  * Takes a lazy default and a nullable value, if the value is not nully (`null` or `undefined`), turn it into a `Right`, if the value is nully use
@@ -122,12 +122,12 @@ export const left: <E>(e: E) => Either<E, never> = either.left
122
122
  * @since 2.0.0
123
123
  */
124
124
  export const fromNullable: {
125
- <A, E>(onNullable: (a: A) => E): (self: A) => Either<E, NonNullable<A>>
126
- <A, E>(self: A, onNullable: (a: A) => E): Either<E, NonNullable<A>>
125
+ <R, L>(onNullable: (right: R) => L): (self: R) => Either<NonNullable<R>, L>
126
+ <R, L>(self: R, onNullable: (right: R) => L): Either<NonNullable<R>, L>
127
127
  } = dual(
128
128
  2,
129
- <A, E>(self: A, onNullable: (a: A) => E): Either<E, NonNullable<A>> =>
130
- self == null ? left(onNullable(self)) : right(self as NonNullable<A>)
129
+ <R, L>(self: R, onNullable: (right: R) => L): Either<NonNullable<R>, L> =>
130
+ self == null ? left(onNullable(self)) : right(self as NonNullable<R>)
131
131
  )
132
132
 
133
133
  /**
@@ -142,22 +142,22 @@ export const fromNullable: {
142
142
  * @since 2.0.0
143
143
  */
144
144
  export const fromOption: {
145
- <A, E>(self: Option<A>, onNone: () => E): Either<E, A>
146
- <E>(onNone: () => E): <A>(self: Option<A>) => Either<E, A>
145
+ <L>(onNone: () => L): <R>(self: Option<R>) => Either<R, L>
146
+ <R, L>(self: Option<R>, onNone: () => L): Either<R, L>
147
147
  } = either.fromOption
148
148
 
149
149
  const try_: {
150
- <A, E>(
150
+ <R, L>(
151
151
  options: {
152
- readonly try: LazyArg<A>
153
- readonly catch: (error: unknown) => E
152
+ readonly try: LazyArg<R>
153
+ readonly catch: (error: unknown) => L
154
154
  }
155
- ): Either<E, A>
156
- <A>(evaluate: LazyArg<A>): Either<unknown, A>
157
- } = (<A, E>(
158
- evaluate: LazyArg<A> | {
159
- readonly try: LazyArg<A>
160
- readonly catch: (error: unknown) => E
155
+ ): Either<R, L>
156
+ <R>(evaluate: LazyArg<R>): Either<R, unknown>
157
+ } = (<R, L>(
158
+ evaluate: LazyArg<R> | {
159
+ readonly try: LazyArg<R>
160
+ readonly catch: (error: unknown) => L
161
161
  }
162
162
  ) => {
163
163
  if (isFunction(evaluate)) {
@@ -217,7 +217,7 @@ export const isEither: (input: unknown) => input is Either<unknown, unknown> = e
217
217
  * @category guards
218
218
  * @since 2.0.0
219
219
  */
220
- export const isLeft: <E, A>(self: Either<E, A>) => self is Left<E, A> = either.isLeft
220
+ export const isLeft: <R, L>(self: Either<R, L>) => self is Left<L, R> = either.isLeft
221
221
 
222
222
  /**
223
223
  * Determine if a `Either` is a `Right`.
@@ -233,7 +233,7 @@ export const isLeft: <E, A>(self: Either<E, A>) => self is Left<E, A> = either.i
233
233
  * @category guards
234
234
  * @since 2.0.0
235
235
  */
236
- export const isRight: <E, A>(self: Either<E, A>) => self is Right<E, A> = either.isRight
236
+ export const isRight: <R, L>(self: Either<R, L>) => self is Right<L, R> = either.isRight
237
237
 
238
238
  /**
239
239
  * Converts a `Either` to an `Option` discarding the `Left`.
@@ -250,7 +250,7 @@ export const isRight: <E, A>(self: Either<E, A>) => self is Right<E, A> = either
250
250
  * @category getters
251
251
  * @since 2.0.0
252
252
  */
253
- export const getRight: <E, A>(self: Either<E, A>) => Option<A> = either.getRight
253
+ export const getRight: <R, L>(self: Either<R, L>) => Option<R> = either.getRight
254
254
 
255
255
  /**
256
256
  * Converts a `Either` to an `Option` discarding the value.
@@ -265,21 +265,21 @@ export const getRight: <E, A>(self: Either<E, A>) => Option<A> = either.getRight
265
265
  * @category getters
266
266
  * @since 2.0.0
267
267
  */
268
- export const getLeft: <E, A>(self: Either<E, A>) => Option<E> = either.getLeft
268
+ export const getLeft: <R, L>(self: Either<R, L>) => Option<L> = either.getLeft
269
269
 
270
270
  /**
271
271
  * @category equivalence
272
272
  * @since 2.0.0
273
273
  */
274
- export const getEquivalence = <E, A>(
275
- EE: Equivalence.Equivalence<E>,
276
- EA: Equivalence.Equivalence<A>
277
- ): Equivalence.Equivalence<Either<E, A>> =>
274
+ export const getEquivalence = <R, L>(
275
+ EquivalenceL: Equivalence.Equivalence<L>,
276
+ EquivalenceR: Equivalence.Equivalence<R>
277
+ ): Equivalence.Equivalence<Either<R, L>> =>
278
278
  Equivalence.make((x, y) =>
279
279
  x === y ||
280
280
  (isLeft(x) ?
281
- isLeft(y) && EE(x.left, y.left) :
282
- isRight(y) && EA(x.right, y.right))
281
+ isLeft(y) && EquivalenceL(x.left, y.left) :
282
+ isRight(y) && EquivalenceR(x.right, y.right))
283
283
  )
284
284
 
285
285
  /**
@@ -287,20 +287,20 @@ export const getEquivalence = <E, A>(
287
287
  * @since 2.0.0
288
288
  */
289
289
  export const mapBoth: {
290
- <E1, E2, A, B>(options: {
291
- readonly onLeft: (e: E1) => E2
292
- readonly onRight: (a: A) => B
293
- }): (self: Either<E1, A>) => Either<E2, B>
294
- <E1, A, E2, B>(self: Either<E1, A>, options: {
295
- readonly onLeft: (e: E1) => E2
296
- readonly onRight: (a: A) => B
297
- }): Either<E2, B>
290
+ <L, L2, R, R2>(options: {
291
+ readonly onLeft: (left: L) => L2
292
+ readonly onRight: (right: R) => R2
293
+ }): (self: Either<R, L>) => Either<R2, L2>
294
+ <L, R, L2, R2>(self: Either<R, L>, options: {
295
+ readonly onLeft: (left: L) => L2
296
+ readonly onRight: (right: R) => R2
297
+ }): Either<R2, L2>
298
298
  } = dual(
299
299
  2,
300
- <E1, A, E2, B>(self: Either<E1, A>, { onLeft, onRight }: {
301
- readonly onLeft: (e: E1) => E2
302
- readonly onRight: (a: A) => B
303
- }): Either<E2, B> => isLeft(self) ? left(onLeft(self.left)) : right(onRight(self.right))
300
+ <L, R, L2, R2>(self: Either<R, L>, { onLeft, onRight }: {
301
+ readonly onLeft: (left: L) => L2
302
+ readonly onRight: (right: R) => R2
303
+ }): Either<R2, L2> => isLeft(self) ? left(onLeft(self.left)) : right(onRight(self.right))
304
304
  )
305
305
 
306
306
  /**
@@ -313,11 +313,12 @@ export const mapBoth: {
313
313
  * @since 2.0.0
314
314
  */
315
315
  export const mapLeft: {
316
- <E, G>(f: (e: E) => G): <A>(self: Either<E, A>) => Either<G, A>
317
- <E, A, G>(self: Either<E, A>, f: (e: E) => G): Either<G, A>
316
+ <L, L2>(f: (left: L) => L2): <R>(self: Either<R, L>) => Either<R, L2>
317
+ <R, L, L2>(self: Either<R, L>, f: (left: L) => L2): Either<R, L2>
318
318
  } = dual(
319
319
  2,
320
- <E, A, G>(self: Either<E, A>, f: (e: E) => G): Either<G, A> => isLeft(self) ? left(f(self.left)) : right(self.right)
320
+ <R, L1, L2>(self: Either<R, L1>, f: (left: L1) => L2): Either<R, L2> =>
321
+ isLeft(self) ? left(f(self.left)) : right(self.right)
321
322
  )
322
323
 
323
324
  /**
@@ -330,11 +331,12 @@ export const mapLeft: {
330
331
  * @since 2.0.0
331
332
  */
332
333
  export const map: {
333
- <A, B>(f: (a: A) => B): <E>(self: Either<E, A>) => Either<E, B>
334
- <E, A, B>(self: Either<E, A>, f: (a: A) => B): Either<E, B>
334
+ <R, R2>(f: (right: R) => R2): <L>(self: Either<R, L>) => Either<R2, L>
335
+ <R, L, R2>(self: Either<R, L>, f: (right: R) => R2): Either<R2, L>
335
336
  } = dual(
336
337
  2,
337
- <E, A, B>(self: Either<E, A>, f: (a: A) => B): Either<E, B> => isRight(self) ? right(f(self.right)) : left(self.left)
338
+ <R1, L, R2>(self: Either<R1, L>, f: (right: R1) => R2): Either<R2, L> =>
339
+ isRight(self) ? right(f(self.right)) : left(self.left)
338
340
  )
339
341
 
340
342
  /**
@@ -359,19 +361,19 @@ export const map: {
359
361
  * @since 2.0.0
360
362
  */
361
363
  export const match: {
362
- <E, B, A, C = B>(options: {
363
- readonly onLeft: (e: E) => B
364
- readonly onRight: (a: A) => C
365
- }): (self: Either<E, A>) => B | C
366
- <E, A, B, C = B>(self: Either<E, A>, options: {
367
- readonly onLeft: (e: E) => B
368
- readonly onRight: (a: A) => C
364
+ <L, B, R, C = B>(options: {
365
+ readonly onLeft: (left: L) => B
366
+ readonly onRight: (right: R) => C
367
+ }): (self: Either<R, L>) => B | C
368
+ <R, L, B, C = B>(self: Either<R, L>, options: {
369
+ readonly onLeft: (left: L) => B
370
+ readonly onRight: (right: R) => C
369
371
  }): B | C
370
372
  } = dual(
371
373
  2,
372
- <E, A, B, C = B>(self: Either<E, A>, { onLeft, onRight }: {
373
- readonly onLeft: (e: E) => B
374
- readonly onRight: (a: A) => C
374
+ <R, L, B, C = B>(self: Either<R, L>, { onLeft, onRight }: {
375
+ readonly onLeft: (left: L) => B
376
+ readonly onRight: (right: R) => C
375
377
  }): B | C => isLeft(self) ? onLeft(self.left) : onRight(self.right)
376
378
  )
377
379
 
@@ -404,31 +406,31 @@ export const match: {
404
406
  * @category filtering & conditionals
405
407
  */
406
408
  export const filterOrLeft: {
407
- <A, B extends A, E2>(
408
- refinement: Refinement<NoInfer<A>, B>,
409
- orLeftWith: (a: NoInfer<A>) => E2
410
- ): <E>(self: Either<E, A>) => Either<E2 | E, B>
411
- <A, E2>(
412
- predicate: Predicate<NoInfer<A>>,
413
- orLeftWith: (a: NoInfer<A>) => E2
414
- ): <E>(self: Either<E, A>) => Either<E2 | E, A>
415
- <E, A, B extends A, E2>(
416
- self: Either<E, A>,
417
- refinement: Refinement<A, B>,
418
- orLeftWith: (a: A) => E2
419
- ): Either<E | E2, B>
420
- <E, A, E2>(self: Either<E, A>, predicate: Predicate<A>, orLeftWith: (a: A) => E2): Either<E | E2, A>
421
- } = dual(3, <E, A, E2>(
422
- self: Either<E, A>,
423
- predicate: Predicate<A>,
424
- orLeftWith: (a: A) => E2
425
- ): Either<E | E2, A> => flatMap(self, (a) => predicate(a) ? right(a) : left(orLeftWith(a))))
409
+ <R, B extends R, L2>(
410
+ refinement: Refinement<NoInfer<R>, B>,
411
+ orLeftWith: (right: NoInfer<R>) => L2
412
+ ): <L>(self: Either<R, L>) => Either<B, L2 | L>
413
+ <R, L2>(
414
+ predicate: Predicate<NoInfer<R>>,
415
+ orLeftWith: (right: NoInfer<R>) => L2
416
+ ): <L>(self: Either<R, L>) => Either<R, L2 | L>
417
+ <R, L, B extends R, L2>(
418
+ self: Either<R, L>,
419
+ refinement: Refinement<R, B>,
420
+ orLeftWith: (right: R) => L2
421
+ ): Either<B, L | L2>
422
+ <R, L, E2>(self: Either<R, L>, predicate: Predicate<R>, orLeftWith: (right: R) => E2): Either<R, L | E2>
423
+ } = dual(3, <R, L, E2>(
424
+ self: Either<R, L>,
425
+ predicate: Predicate<R>,
426
+ orLeftWith: (right: R) => E2
427
+ ): Either<R, L | E2> => flatMap(self, (r) => predicate(r) ? right(r) : left(orLeftWith(r))))
426
428
 
427
429
  /**
428
430
  * @category getters
429
431
  * @since 2.0.0
430
432
  */
431
- export const merge: <E, A>(self: Either<E, A>) => E | A = match({
433
+ export const merge: <R, L>(self: Either<R, L>) => L | R = match({
432
434
  onLeft: identity,
433
435
  onRight: identity
434
436
  })
@@ -446,11 +448,11 @@ export const merge: <E, A>(self: Either<E, A>) => E | A = match({
446
448
  * @since 2.0.0
447
449
  */
448
450
  export const getOrElse: {
449
- <E, B>(onLeft: (e: E) => B): <A>(self: Either<E, A>) => B | A
450
- <E, A, B>(self: Either<E, A>, onLeft: (e: E) => B): A | B
451
+ <L, R2>(onLeft: (left: L) => R2): <R>(self: Either<R, L>) => R2 | R
452
+ <R, L, R2>(self: Either<R, L>, onLeft: (left: L) => R2): R | R2
451
453
  } = dual(
452
454
  2,
453
- <E, A, B>(self: Either<E, A>, onLeft: (e: E) => B): A | B => isLeft(self) ? onLeft(self.left) : self.right
455
+ <R, L, B>(self: Either<R, L>, onLeft: (left: L) => B): R | B => isLeft(self) ? onLeft(self.left) : self.right
454
456
  )
455
457
 
456
458
  /**
@@ -463,7 +465,7 @@ export const getOrElse: {
463
465
  * @category getters
464
466
  * @since 2.0.0
465
467
  */
466
- export const getOrNull: <E, A>(self: Either<E, A>) => A | null = getOrElse(constNull)
468
+ export const getOrNull: <R, L>(self: Either<R, L>) => R | null = getOrElse(constNull)
467
469
 
468
470
  /**
469
471
  * @example
@@ -475,7 +477,7 @@ export const getOrNull: <E, A>(self: Either<E, A>) => A | null = getOrElse(const
475
477
  * @category getters
476
478
  * @since 2.0.0
477
479
  */
478
- export const getOrUndefined: <E, A>(self: Either<E, A>) => A | undefined = getOrElse(constUndefined)
480
+ export const getOrUndefined: <R, L>(self: Either<R, L>) => R | undefined = getOrElse(constUndefined)
479
481
 
480
482
  /**
481
483
  * Extracts the value of an `Either` or throws if the `Either` is `Left`.
@@ -498,9 +500,9 @@ export const getOrUndefined: <E, A>(self: Either<E, A>) => A | undefined = getOr
498
500
  * @since 2.0.0
499
501
  */
500
502
  export const getOrThrowWith: {
501
- <E>(onLeft: (e: E) => unknown): <A>(self: Either<E, A>) => A
502
- <E, A>(self: Either<E, A>, onLeft: (e: E) => unknown): A
503
- } = dual(2, <E, A>(self: Either<E, A>, onLeft: (e: E) => unknown): A => {
503
+ <L>(onLeft: (left: L) => unknown): <A>(self: Either<A, L>) => A
504
+ <R, L>(self: Either<R, L>, onLeft: (left: L) => unknown): R
505
+ } = dual(2, <R, L>(self: Either<R, L>, onLeft: (left: L) => unknown): R => {
504
506
  if (isRight(self)) {
505
507
  return self.right
506
508
  }
@@ -524,7 +526,7 @@ export const getOrThrowWith: {
524
526
  * @category getters
525
527
  * @since 2.0.0
526
528
  */
527
- export const getOrThrow: <E, A>(self: Either<E, A>) => A = getOrThrowWith(() =>
529
+ export const getOrThrow: <R, L>(self: Either<R, L>) => R = getOrThrowWith(() =>
528
530
  new Error("getOrThrow called on a Left")
529
531
  )
530
532
 
@@ -538,11 +540,11 @@ export const getOrThrow: <E, A>(self: Either<E, A>) => A = getOrThrowWith(() =>
538
540
  * @since 2.0.0
539
541
  */
540
542
  export const orElse: {
541
- <E1, E2, B>(that: (e1: E1) => Either<E2, B>): <A>(self: Either<E1, A>) => Either<E2, A | B>
542
- <E1, A, E2, B>(self: Either<E1, A>, that: (e1: E1) => Either<E2, B>): Either<E2, A | B>
543
+ <L, R2, L2>(that: (left: L) => Either<R2, L2>): <R>(self: Either<R, L>) => Either<R | R2, L2>
544
+ <R, L, R2, L2>(self: Either<R, L>, that: (left: L) => Either<R2, L2>): Either<R | R2, L2>
543
545
  } = dual(
544
546
  2,
545
- <E1, A, E2, B>(self: Either<E1, A>, that: (e1: E1) => Either<E2, B>): Either<E2, A | B> =>
547
+ <R1, L1, R2, L2>(self: Either<R1, L1>, that: (left: L1) => Either<R2, L2>): Either<R1 | R2, L2> =>
546
548
  isLeft(self) ? that(self.left) : right(self.right)
547
549
  )
548
550
 
@@ -551,11 +553,11 @@ export const orElse: {
551
553
  * @since 2.0.0
552
554
  */
553
555
  export const flatMap: {
554
- <A, E2, B>(f: (a: A) => Either<E2, B>): <E1>(self: Either<E1, A>) => Either<E1 | E2, B>
555
- <E1, A, E2, B>(self: Either<E1, A>, f: (a: A) => Either<E2, B>): Either<E1 | E2, B>
556
+ <R, R2, L2>(f: (right: R) => Either<R2, L2>): <L>(self: Either<R, L>) => Either<R2, L | L2>
557
+ <R, L, R2, L2>(self: Either<R, L>, f: (right: R) => Either<R2, L2>): Either<R2, L | L2>
556
558
  } = dual(
557
559
  2,
558
- <E1, A, E2, B>(self: Either<E1, A>, f: (a: A) => Either<E2, B>): Either<E1 | E2, B> =>
560
+ <R1, L1, R2, L2>(self: Either<R1, L1>, f: (right: R1) => Either<R2, L2>): Either<R2, L1 | L2> =>
559
561
  isLeft(self) ? left(self.left) : f(self.right)
560
562
  )
561
563
 
@@ -566,17 +568,17 @@ export const flatMap: {
566
568
  * @since 2.0.0
567
569
  */
568
570
  export const andThen: {
569
- <A, E2, B>(f: (a: A) => Either<E2, B>): <E1>(self: Either<E1, A>) => Either<E1 | E2, B>
570
- <E2, B>(f: Either<E2, B>): <E1, A>(self: Either<E1, A>) => Either<E1 | E2, B>
571
- <A, B>(f: (a: A) => B): <E1>(self: Either<E1, A>) => Either<E1, B>
572
- <B>(b: B): <A, E1>(self: Either<E1, A>) => Either<E1, B>
573
- <E1, A, E2, B>(self: Either<E1, A>, f: (a: A) => Either<E2, B>): Either<E1 | E2, B>
574
- <E1, A, E2, B>(self: Either<E1, A>, f: Either<E2, B>): Either<E1 | E2, B>
575
- <E1, A, B>(self: Either<E1, A>, f: (a: A) => B): Either<E1, B>
576
- <E1, A, B>(self: Either<E1, A>, f: B): Either<E1, B>
571
+ <R, R2, L2>(f: (right: R) => Either<R2, L2>): <L>(self: Either<R, L>) => Either<R2, L | L2>
572
+ <R2, L2>(f: Either<R2, L2>): <L, R1>(self: Either<R1, L>) => Either<R2, L | L2>
573
+ <R, R2>(f: (right: R) => R2): <L>(self: Either<R, L>) => Either<R2, L>
574
+ <R2>(right: R2): <R1, L>(self: Either<R1, L>) => Either<R2, L>
575
+ <R, L, R2, L2>(self: Either<R, L>, f: (right: R) => Either<R2, L2>): Either<R2, L | L2>
576
+ <R, L, R2, L2>(self: Either<R, L>, f: Either<R2, L2>): Either<R2, L | L2>
577
+ <R, L, R2>(self: Either<R, L>, f: (right: R) => R2): Either<R2, L>
578
+ <R, L, R2>(self: Either<R, L>, f: R2): Either<R2, L>
577
579
  } = dual(
578
580
  2,
579
- <E1, A, E2, B>(self: Either<E1, A>, f: (a: A) => Either<E2, B> | Either<E2, B>): Either<E1 | E2, B> =>
581
+ <R, L, R2, L2>(self: Either<R, L>, f: (right: R) => Either<R2, L2> | Either<R2, L2>): Either<R2, L | L2> =>
580
582
  flatMap(self, (a) => {
581
583
  const b = isFunction(f) ? f(a) : f
582
584
  return isEither(b) ? b : right(b)
@@ -588,19 +590,19 @@ export const andThen: {
588
590
  * @since 2.0.0
589
591
  */
590
592
  export const zipWith: {
591
- <E2, A2, A, B>(
592
- that: Either<E2, A2>,
593
- f: (a: A, b: A2) => B
594
- ): <E>(self: Either<E, A>) => Either<E2 | E, B>
595
- <E, A, E2, A2, B>(
596
- self: Either<E, A>,
597
- that: Either<E2, A2>,
598
- f: (a: A, b: A2) => B
599
- ): Either<E | E2, B>
593
+ <R2, L2, R, B>(
594
+ that: Either<R2, L2>,
595
+ f: (right: R, right2: R2) => B
596
+ ): <L>(self: Either<R, L>) => Either<B, L2 | L>
597
+ <R, L, R2, L2, B>(
598
+ self: Either<R, L>,
599
+ that: Either<R2, L2>,
600
+ f: (right: R, right2: R2) => B
601
+ ): Either<B, L | L2>
600
602
  } = dual(
601
603
  3,
602
- <E, A, E2, A2, B>(self: Either<E, A>, that: Either<E2, A2>, f: (a: A, b: A2) => B): Either<E | E2, B> =>
603
- flatMap(self, (a) => map(that, (b) => f(a, b)))
604
+ <R, L, R2, L2, B>(self: Either<R, L>, that: Either<R2, L2>, f: (right: R, right2: R2) => B): Either<B, L | L2> =>
605
+ flatMap(self, (r) => map(that, (r2) => f(r, r2)))
604
606
  )
605
607
 
606
608
  /**
@@ -608,11 +610,11 @@ export const zipWith: {
608
610
  * @since 2.0.0
609
611
  */
610
612
  export const ap: {
611
- <E2, A>(that: Either<E2, A>): <E, B>(self: Either<E, (a: A) => B>) => Either<E | E2, B>
612
- <E, A, B, E2>(self: Either<E, (a: A) => B>, that: Either<E2, A>): Either<E | E2, B>
613
+ <R, L2>(that: Either<R, L2>): <R2, L>(self: Either<(right: R) => R2, L>) => Either<R2, L | L2>
614
+ <R, R2, L, L2>(self: Either<(right: R) => R2, L>, that: Either<R, L2>): Either<R2, L | L2>
613
615
  } = dual(
614
616
  2,
615
- <E, A, B, E2>(self: Either<E, (a: A) => B>, that: Either<E2, A>): Either<E | E2, B> =>
617
+ <R, R2, L, L2>(self: Either<(right: R) => R2, L>, that: Either<R, L2>): Either<R2, L | L2> =>
616
618
  zipWith(self, that, (f, a) => f(a))
617
619
  )
618
620
 
@@ -629,8 +631,8 @@ export const ap: {
629
631
  * import * as Either from "effect/Either"
630
632
  *
631
633
  * assert.deepStrictEqual(Either.all([Either.right(1), Either.right(2)]), Either.right([1, 2]))
632
- * assert.deepStrictEqual(Either.all({ a: Either.right(1), b: Either.right("hello") }), Either.right({ a: 1, b: "hello" }))
633
- * assert.deepStrictEqual(Either.all({ a: Either.right(1), b: Either.left("error") }), Either.left("error"))
634
+ * assert.deepStrictEqual(Either.all({ right: Either.right(1), b: Either.right("hello") }), Either.right({ right: 1, b: "hello" }))
635
+ * assert.deepStrictEqual(Either.all({ right: Either.right(1), b: Either.left("error") }), Either.left("error"))
634
636
  *
635
637
  * @category combining
636
638
  * @since 2.0.0
@@ -639,13 +641,13 @@ export const ap: {
639
641
  export const all: <const I extends Iterable<Either<any, any>> | Record<string, Either<any, any>>>(
640
642
  input: I
641
643
  ) => [I] extends [ReadonlyArray<Either<any, any>>] ? Either<
642
- I[number] extends never ? never : [I[number]] extends [Either<infer E, any>] ? E : never,
643
- { -readonly [K in keyof I]: [I[K]] extends [Either<any, infer A>] ? A : never }
644
+ { -readonly [K in keyof I]: [I[K]] extends [Either<infer R, any>] ? R : never },
645
+ I[number] extends never ? never : [I[number]] extends [Either<any, infer L>] ? L : never
644
646
  >
645
- : [I] extends [Iterable<Either<infer E, infer A>>] ? Either<E, Array<A>>
647
+ : [I] extends [Iterable<Either<infer R, infer L>>] ? Either<Array<R>, L>
646
648
  : Either<
647
- I[keyof I] extends never ? never : [I[keyof I]] extends [Either<infer E, any>] ? E : never,
648
- { -readonly [K in keyof I]: [I[K]] extends [Either<any, infer A>] ? A : never }
649
+ { -readonly [K in keyof I]: [I[K]] extends [Either<infer R, any>] ? R : never },
650
+ I[keyof I] extends never ? never : [I[keyof I]] extends [Either<any, infer L>] ? L : never
649
651
  > = (
650
652
  input: Iterable<Either<any, any>> | Record<string, Either<any, any>>
651
653
  ): Either<any, any> => {
@@ -678,7 +680,7 @@ export const all: <const I extends Iterable<Either<any, any>> | Record<string, E
678
680
  * @since 2.0.0
679
681
  * @category mapping
680
682
  */
681
- export const flip = <E, A>(self: Either<E, A>): Either<A, E> => isLeft(self) ? right(self.left) : left(self.right)
683
+ export const flip = <R, L>(self: Either<R, L>): Either<L, R> => isLeft(self) ? right(self.left) : left(self.right)
682
684
 
683
685
  const adapter = Gen.adapter<EitherTypeLambda>()
684
686
 
@@ -708,3 +710,83 @@ export const gen: Gen.Gen<EitherTypeLambda, Gen.Adapter<EitherTypeLambda>> = (f)
708
710
  return right(state.value)
709
711
  }
710
712
  }
713
+
714
+ // -------------------------------------------------------------------------------------
715
+ // do notation
716
+ // -------------------------------------------------------------------------------------
717
+
718
+ /**
719
+ * @since 2.4.0
720
+ * @category do notation
721
+ */
722
+ export const Do: Either<{}> = right({})
723
+
724
+ /**
725
+ * Binds an effectful value in a `do` scope
726
+ *
727
+ * @since 2.4.0
728
+ * @category do notation
729
+ */
730
+ export const bind: {
731
+ <N extends string, K, A, E2>(
732
+ tag: Exclude<N, keyof K>,
733
+ f: (_: K) => Either<A, E2>
734
+ ): <E>(self: Either<K, E>) => Either<MergeRecord<K, { [k in N]: A }>, E2 | E>
735
+ <K, E, N extends string, A, E2>(
736
+ self: Either<E, K>,
737
+ tag: Exclude<N, keyof K>,
738
+ f: (_: K) => Either<A, E2>
739
+ ): Either<MergeRecord<K, { [k in N]: A }>, E2 | E>
740
+ } = dual(3, <K, E, N extends string, A, E2>(
741
+ self: Either<K, E>,
742
+ tag: Exclude<N, keyof K>,
743
+ f: (_: K) => Either<A, E2>
744
+ ): Either<MergeRecord<K, { [k in N]: A }>, E2 | E> =>
745
+ flatMap(self, (k) =>
746
+ map(
747
+ f(k),
748
+ (a): MergeRecord<K, { [k in N]: A }> => ({ ...k, [tag]: a } as any)
749
+ )))
750
+
751
+ /**
752
+ * @category do notation
753
+ * @since 2.4.0
754
+ */
755
+ export const bindTo: {
756
+ <N extends string>(tag: N): <A, E>(self: Either<A, E>) => Either<Record<N, A>, E>
757
+ <A, E, N extends string>(self: Either<A, E>, tag: N): Either<Record<N, A>, E>
758
+ } = dual(
759
+ 2,
760
+ <A, E, N extends string>(self: Either<A, E>, tag: N): Either<Record<N, A>, E> =>
761
+ map(self, (a) => ({ [tag]: a } as Record<N, A>))
762
+ )
763
+
764
+ const let_: {
765
+ <N extends string, K, A>(
766
+ tag: Exclude<N, keyof K>,
767
+ f: (_: K) => A
768
+ ): <E>(self: Either<K, E>) => Either<MergeRecord<K, { [k in N]: A }>, E>
769
+ <K, E, N extends string, A>(
770
+ self: Either<K, E>,
771
+ tag: Exclude<N, keyof K>,
772
+ f: (_: K) => A
773
+ ): Either<MergeRecord<K, { [k in N]: A }>, E>
774
+ } = dual(3, <K, E, N extends string, A>(
775
+ self: Either<K, E>,
776
+ tag: Exclude<N, keyof K>,
777
+ f: (_: K) => A
778
+ ): Either<MergeRecord<K, { [k in N]: A }>, E> =>
779
+ map(
780
+ self,
781
+ (k): MergeRecord<K, { [k in N]: A }> => ({ ...k, [tag]: f(k) } as any)
782
+ ))
783
+
784
+ export {
785
+ /**
786
+ * Like bind for values
787
+ *
788
+ * @since 2.4.0
789
+ * @category do notation
790
+ */
791
+ let_ as let
792
+ }
package/src/Encoding.ts CHANGED
@@ -28,7 +28,7 @@ export const encodeBase64: (input: Uint8Array | string) => string = (input) =>
28
28
  * @category decoding
29
29
  * @since 2.0.0
30
30
  */
31
- export const decodeBase64 = (str: string): Either.Either<DecodeException, Uint8Array> => Base64.decode(str)
31
+ export const decodeBase64 = (str: string): Either.Either<Uint8Array, DecodeException> => Base64.decode(str)
32
32
 
33
33
  /**
34
34
  * Decodes a base64 (RFC4648) encoded `string` into a UTF-8 `string`.
@@ -53,7 +53,7 @@ export const encodeBase64Url: (input: Uint8Array | string) => string = (input) =
53
53
  * @category decoding
54
54
  * @since 2.0.0
55
55
  */
56
- export const decodeBase64Url = (str: string): Either.Either<DecodeException, Uint8Array> => Base64Url.decode(str)
56
+ export const decodeBase64Url = (str: string): Either.Either<Uint8Array, DecodeException> => Base64Url.decode(str)
57
57
 
58
58
  /**
59
59
  * Decodes a base64 (URL) encoded `string` into a UTF-8 `string`.
@@ -78,7 +78,7 @@ export const encodeHex: (input: Uint8Array | string) => string = (input) =>
78
78
  * @category decoding
79
79
  * @since 2.0.0
80
80
  */
81
- export const decodeHex = (str: string): Either.Either<DecodeException, Uint8Array> => Hex.decode(str)
81
+ export const decodeHex = (str: string): Either.Either<Uint8Array, DecodeException> => Hex.decode(str)
82
82
 
83
83
  /**
84
84
  * Decodes a hex encoded `string` into a UTF-8 `string`.