effect-app 1.32.0 → 2.0.0

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 (310) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/_cjs/Array.cjs +132 -0
  3. package/_cjs/Array.cjs.map +1 -0
  4. package/_cjs/Chunk.cjs +128 -0
  5. package/_cjs/Chunk.cjs.map +1 -0
  6. package/_cjs/Config/SecretURL.cjs +3 -3
  7. package/_cjs/Config/SecretURL.cjs.map +1 -1
  8. package/_cjs/Config/internal/configSecretURL.cjs +2 -2
  9. package/_cjs/Config/internal/configSecretURL.cjs.map +1 -1
  10. package/_cjs/Context.cjs +243 -0
  11. package/_cjs/Context.cjs.map +1 -0
  12. package/_cjs/Dictionary.cjs +522 -0
  13. package/_cjs/Dictionary.cjs.map +1 -0
  14. package/_cjs/Effect.cjs +202 -0
  15. package/_cjs/Effect.cjs.map +1 -0
  16. package/_cjs/Function.cjs +107 -0
  17. package/_cjs/Function.cjs.map +1 -0
  18. package/_cjs/NonEmptySet.cjs +26 -0
  19. package/_cjs/NonEmptySet.cjs.map +1 -0
  20. package/_cjs/NonEmptySetAspects.cjs +17 -0
  21. package/_cjs/NonEmptySetAspects.cjs.map +1 -0
  22. package/_cjs/NonEmptySetBase.cjs +82 -0
  23. package/_cjs/NonEmptySetBase.cjs.map +1 -0
  24. package/_cjs/Object.cjs +24 -0
  25. package/_cjs/Object.cjs.map +1 -0
  26. package/_cjs/Operations.cjs +1 -1
  27. package/_cjs/Option.cjs +88 -0
  28. package/_cjs/Option.cjs.map +1 -0
  29. package/_cjs/Prelude.cjs +51 -0
  30. package/_cjs/Prelude.cjs.map +1 -0
  31. package/_cjs/Prelude.code.cjs +51 -0
  32. package/_cjs/Prelude.code.cjs.map +1 -0
  33. package/_cjs/Pure.cjs +39 -36
  34. package/_cjs/Pure.cjs.map +1 -1
  35. package/_cjs/Schema/Class.cjs +61 -0
  36. package/_cjs/Schema/Class.cjs.map +1 -0
  37. package/_cjs/Schema/FastCheck.cjs +39 -0
  38. package/_cjs/Schema/FastCheck.cjs.map +1 -0
  39. package/_cjs/Schema/Methods.cjs +6 -0
  40. package/_cjs/Schema/Methods.cjs.map +1 -0
  41. package/_cjs/Schema/brand.cjs +17 -0
  42. package/_cjs/Schema/brand.cjs.map +1 -0
  43. package/_cjs/Schema/email.cjs +20 -0
  44. package/_cjs/Schema/email.cjs.map +1 -0
  45. package/_cjs/Schema/ext.cjs +174 -0
  46. package/_cjs/Schema/ext.cjs.map +1 -0
  47. package/_cjs/Schema/moreStrings.cjs +124 -0
  48. package/_cjs/Schema/moreStrings.cjs.map +1 -0
  49. package/_cjs/Schema/numbers.cjs +52 -0
  50. package/_cjs/Schema/numbers.cjs.map +1 -0
  51. package/_cjs/Schema/phoneNumber.cjs +22 -0
  52. package/_cjs/Schema/phoneNumber.cjs.map +1 -0
  53. package/_cjs/Schema/schema.cjs +15 -0
  54. package/_cjs/Schema/schema.cjs.map +1 -0
  55. package/_cjs/Schema/strings.cjs +32 -0
  56. package/_cjs/Schema/strings.cjs.map +1 -0
  57. package/_cjs/Schema.cjs +334 -0
  58. package/_cjs/Schema.cjs.map +1 -0
  59. package/_cjs/Set.cjs +567 -0
  60. package/_cjs/Set.cjs.map +1 -0
  61. package/_cjs/Struct.cjs +51 -0
  62. package/_cjs/Struct.cjs.map +1 -0
  63. package/_cjs/Tag.cjs +25 -0
  64. package/_cjs/Tag.cjs.map +1 -0
  65. package/_cjs/Unify.cjs +40 -0
  66. package/_cjs/Unify.cjs.map +1 -0
  67. package/_cjs/_ext/misc.cjs +16 -16
  68. package/_cjs/_ext/misc.cjs.map +1 -1
  69. package/_cjs/_ext/ord.ext.cjs +52 -0
  70. package/_cjs/_ext/ord.ext.cjs.map +1 -0
  71. package/_cjs/builtin.cjs +6 -0
  72. package/_cjs/builtin.cjs.map +1 -0
  73. package/_cjs/client/clientFor.cjs +5 -3
  74. package/_cjs/client/clientFor.cjs.map +1 -1
  75. package/_cjs/client/config.cjs +4 -4
  76. package/_cjs/client/config.cjs.map +1 -1
  77. package/_cjs/client/errors.cjs +9 -9
  78. package/_cjs/client/errors.cjs.map +1 -1
  79. package/_cjs/http/http-client.cjs +35 -0
  80. package/_cjs/http/http-client.cjs.map +1 -0
  81. package/_cjs/ids.cjs +5 -5
  82. package/_cjs/ids.cjs.map +1 -1
  83. package/_cjs/index.cjs +1 -1
  84. package/_cjs/lib.cjs +178 -9
  85. package/_cjs/lib.cjs.map +1 -1
  86. package/_cjs/logger.cjs +1 -1
  87. package/_cjs/transform.cjs +45 -0
  88. package/_cjs/transform.cjs.map +1 -0
  89. package/_cjs/utils/effectify.cjs +25 -0
  90. package/_cjs/utils/effectify.cjs.map +1 -0
  91. package/_cjs/utils/extend.cjs +17 -0
  92. package/_cjs/utils/extend.cjs.map +1 -0
  93. package/_cjs/utils/logger.cjs +23 -0
  94. package/_cjs/utils/logger.cjs.map +1 -0
  95. package/_cjs/utils.cjs +431 -4
  96. package/_cjs/utils.cjs.map +1 -1
  97. package/_cjs/validation/validators.cjs +32 -0
  98. package/_cjs/validation/validators.cjs.map +1 -0
  99. package/_cjs/validation.cjs +45 -0
  100. package/_cjs/validation.cjs.map +1 -0
  101. package/dist/Array.d.ts +64 -0
  102. package/dist/Array.d.ts.map +1 -0
  103. package/dist/Array.js +89 -0
  104. package/dist/Chunk.d.ts +68 -0
  105. package/dist/Chunk.d.ts.map +1 -0
  106. package/dist/Chunk.js +93 -0
  107. package/dist/Config/SecretURL.d.ts +3 -3
  108. package/dist/Config/SecretURL.d.ts.map +1 -1
  109. package/dist/Config/SecretURL.js +2 -2
  110. package/dist/Config/internal/configSecretURL.js +2 -2
  111. package/dist/Context.d.ts +55 -0
  112. package/dist/Context.d.ts.map +1 -0
  113. package/dist/Context.js +204 -0
  114. package/dist/Dictionary.d.ts +260 -0
  115. package/dist/Dictionary.d.ts.map +1 -0
  116. package/dist/Dictionary.js +448 -0
  117. package/dist/Effect.d.ts +115 -0
  118. package/dist/Effect.d.ts.map +1 -0
  119. package/dist/Effect.js +153 -0
  120. package/dist/Function.d.ts +72 -0
  121. package/dist/Function.d.ts.map +1 -0
  122. package/dist/Function.js +71 -0
  123. package/dist/Inputify.type.d.ts +1 -1
  124. package/dist/Inputify.type.d.ts.map +1 -1
  125. package/dist/NonEmptySet.d.ts +3 -0
  126. package/dist/NonEmptySet.d.ts.map +1 -0
  127. package/dist/NonEmptySet.js +3 -0
  128. package/dist/NonEmptySetAspects.d.ts +2 -0
  129. package/dist/NonEmptySetAspects.d.ts.map +1 -0
  130. package/dist/NonEmptySetAspects.js +2 -0
  131. package/dist/NonEmptySetBase.d.ts +39 -0
  132. package/dist/NonEmptySetBase.d.ts.map +1 -0
  133. package/dist/NonEmptySetBase.js +63 -0
  134. package/dist/Object.d.ts +7 -0
  135. package/dist/Object.d.ts.map +1 -0
  136. package/dist/Object.js +7 -0
  137. package/dist/Operations.d.ts +2 -2
  138. package/dist/Operations.js +1 -1
  139. package/dist/Option.d.ts +39 -0
  140. package/dist/Option.d.ts.map +1 -0
  141. package/dist/Option.js +55 -0
  142. package/dist/Prelude.code.d.ts +24 -0
  143. package/dist/Prelude.code.d.ts.map +1 -0
  144. package/dist/Prelude.code.js +23 -0
  145. package/dist/Prelude.d.ts +163 -0
  146. package/dist/Prelude.d.ts.map +1 -0
  147. package/dist/Prelude.js +23 -0
  148. package/dist/Pure.d.ts +13 -12
  149. package/dist/Pure.d.ts.map +1 -1
  150. package/dist/Pure.js +18 -17
  151. package/dist/Schema/Class.d.ts +45 -0
  152. package/dist/Schema/Class.d.ts.map +1 -0
  153. package/dist/Schema/Class.js +50 -0
  154. package/dist/Schema/FastCheck.d.ts +10 -0
  155. package/dist/Schema/FastCheck.d.ts.map +1 -0
  156. package/dist/Schema/FastCheck.js +12 -0
  157. package/dist/Schema/Methods.d.ts +6 -0
  158. package/dist/Schema/Methods.d.ts.map +1 -0
  159. package/dist/Schema/Methods.js +2 -0
  160. package/dist/Schema/brand.d.ts +35 -0
  161. package/dist/Schema/brand.d.ts.map +1 -0
  162. package/dist/Schema/brand.js +7 -0
  163. package/dist/Schema/email.d.ts +9 -0
  164. package/dist/Schema/email.d.ts.map +1 -0
  165. package/dist/Schema/email.js +12 -0
  166. package/dist/Schema/ext.d.ts +89 -0
  167. package/dist/Schema/ext.d.ts.map +1 -0
  168. package/dist/Schema/ext.js +111 -0
  169. package/dist/Schema/moreStrings.d.ts +109 -0
  170. package/dist/Schema/moreStrings.d.ts.map +1 -0
  171. package/dist/Schema/moreStrings.js +108 -0
  172. package/dist/Schema/numbers.d.ts +46 -0
  173. package/dist/Schema/numbers.d.ts.map +1 -0
  174. package/dist/Schema/numbers.js +28 -0
  175. package/dist/Schema/phoneNumber.d.ts +9 -0
  176. package/dist/Schema/phoneNumber.d.ts.map +1 -0
  177. package/dist/Schema/phoneNumber.js +14 -0
  178. package/dist/Schema/schema.d.ts +6 -0
  179. package/dist/Schema/schema.d.ts.map +1 -0
  180. package/dist/Schema/schema.js +5 -0
  181. package/dist/Schema/strings.d.ts +19 -0
  182. package/dist/Schema/strings.d.ts.map +1 -0
  183. package/dist/Schema/strings.js +32 -0
  184. package/dist/{schema.d.ts → Schema.d.ts} +25 -9
  185. package/dist/Schema.d.ts.map +1 -0
  186. package/dist/Schema.js +89 -0
  187. package/dist/Set.d.ts +221 -0
  188. package/dist/Set.d.ts.map +1 -0
  189. package/dist/Set.js +516 -0
  190. package/dist/Struct.d.ts +44 -0
  191. package/dist/Struct.d.ts.map +1 -0
  192. package/dist/Struct.js +29 -0
  193. package/dist/Tag.d.ts +9 -0
  194. package/dist/Tag.d.ts.map +1 -0
  195. package/dist/Tag.js +18 -0
  196. package/dist/Unify.d.ts +43 -0
  197. package/dist/Unify.d.ts.map +1 -0
  198. package/dist/Unify.js +31 -0
  199. package/dist/Widen.type.d.ts +1 -1
  200. package/dist/Widen.type.d.ts.map +1 -1
  201. package/dist/_ext/misc.d.ts +11 -11
  202. package/dist/_ext/misc.d.ts.map +1 -1
  203. package/dist/_ext/misc.js +8 -8
  204. package/dist/_ext/ord.ext.d.ts +23 -0
  205. package/dist/_ext/ord.ext.d.ts.map +1 -0
  206. package/dist/_ext/ord.ext.js +44 -0
  207. package/dist/builtin.d.ts +51 -0
  208. package/dist/builtin.d.ts.map +1 -0
  209. package/dist/builtin.js +2 -0
  210. package/dist/client/clientFor.d.ts +1 -1
  211. package/dist/client/clientFor.d.ts.map +1 -1
  212. package/dist/client/clientFor.js +2 -2
  213. package/dist/client/config.d.ts +1 -1
  214. package/dist/client/config.d.ts.map +1 -1
  215. package/dist/client/config.js +2 -2
  216. package/dist/client/errors.js +1 -1
  217. package/dist/http/http-client.d.ts +43 -0
  218. package/dist/http/http-client.d.ts.map +1 -0
  219. package/dist/http/http-client.js +30 -0
  220. package/dist/ids.d.ts +3 -3
  221. package/dist/ids.d.ts.map +1 -1
  222. package/dist/ids.js +2 -2
  223. package/dist/index.d.ts +1 -1
  224. package/dist/index.d.ts.map +1 -1
  225. package/dist/index.js +2 -2
  226. package/dist/lib.d.ts +22 -4
  227. package/dist/lib.d.ts.map +1 -1
  228. package/dist/lib.js +20 -5
  229. package/dist/logger.d.ts.map +1 -1
  230. package/dist/logger.js +2 -2
  231. package/dist/transform.d.ts +12 -0
  232. package/dist/transform.d.ts.map +1 -0
  233. package/dist/transform.js +39 -0
  234. package/dist/utils/effectify.d.ts +210 -0
  235. package/dist/utils/effectify.d.ts.map +1 -0
  236. package/dist/utils/effectify.js +19 -0
  237. package/dist/utils/extend.d.ts +3 -0
  238. package/dist/utils/extend.d.ts.map +1 -0
  239. package/dist/utils/extend.js +9 -0
  240. package/dist/utils/logger.d.ts +12 -0
  241. package/dist/utils/logger.d.ts.map +1 -0
  242. package/dist/utils/logger.js +15 -0
  243. package/dist/utils.d.ts +192 -1
  244. package/dist/utils.d.ts.map +1 -1
  245. package/dist/utils.js +332 -2
  246. package/dist/validation/validators.d.ts +11 -0
  247. package/dist/validation/validators.d.ts.map +1 -0
  248. package/dist/validation/validators.js +26 -0
  249. package/dist/validation.d.ts +13 -0
  250. package/dist/validation.d.ts.map +1 -0
  251. package/dist/validation.js +14 -0
  252. package/package.json +360 -9
  253. package/src/Array.ts +127 -0
  254. package/src/Chunk.ts +112 -0
  255. package/src/Config/SecretURL.ts +3 -3
  256. package/src/Config/internal/configSecretURL.ts +1 -1
  257. package/src/Context.ts +293 -0
  258. package/src/Dictionary.ts +669 -0
  259. package/src/Effect.ts +265 -0
  260. package/src/Function.ts +175 -0
  261. package/src/Inputify.type.ts +1 -1
  262. package/src/NonEmptySet.ts +3 -0
  263. package/src/NonEmptySetAspects.ts +1 -0
  264. package/src/NonEmptySetBase.ts +109 -0
  265. package/src/Object.ts +19 -0
  266. package/src/Operations.ts +1 -1
  267. package/src/Option.ts +82 -0
  268. package/src/Prelude.code.ts +26 -0
  269. package/src/Prelude.ts +220 -0
  270. package/src/Pure.ts +37 -30
  271. package/src/Schema/Class.ts +225 -0
  272. package/src/Schema/FastCheck.ts +23 -0
  273. package/src/Schema/Methods.ts +8 -0
  274. package/src/Schema/brand.ts +50 -0
  275. package/src/Schema/email.ts +22 -0
  276. package/src/Schema/ext.ts +273 -0
  277. package/src/Schema/moreStrings.ts +260 -0
  278. package/src/Schema/numbers.ts +83 -0
  279. package/src/Schema/phoneNumber.ts +24 -0
  280. package/src/Schema/schema.ts +6 -0
  281. package/src/Schema/strings.ts +60 -0
  282. package/src/{schema.ts → Schema.ts} +52 -20
  283. package/src/Set.ts +674 -0
  284. package/src/Struct.ts +54 -0
  285. package/src/Tag.ts +20 -0
  286. package/src/Unify.ts +56 -0
  287. package/src/Widen.type.ts +1 -1
  288. package/src/_ext/misc.ts +22 -22
  289. package/src/_ext/ord.ext.ts +49 -0
  290. package/src/builtin.ts +64 -0
  291. package/src/client/clientFor.ts +1 -1
  292. package/src/client/config.ts +1 -1
  293. package/src/client/errors.ts +1 -1
  294. package/src/http/http-client.ts +73 -0
  295. package/src/ids.ts +3 -3
  296. package/src/index.ts +1 -1
  297. package/src/lib.ts +88 -4
  298. package/src/logger.ts +1 -1
  299. package/src/transform.ts +80 -0
  300. package/src/utils/effectify.ts +259 -0
  301. package/src/utils/extend.ts +9 -0
  302. package/src/utils/logger.ts +24 -0
  303. package/src/utils.ts +805 -1
  304. package/src/validation/validators.ts +32 -0
  305. package/src/validation.ts +18 -0
  306. package/tsconfig.src.json +1 -5
  307. package/_cjs/schema.cjs +0 -110
  308. package/_cjs/schema.cjs.map +0 -1
  309. package/dist/schema.d.ts.map +0 -1
  310. package/dist/schema.js +0 -73
package/src/Set.ts ADDED
@@ -0,0 +1,674 @@
1
+ // ets_tracing: off
2
+
3
+ import { Array, Option } from "effect"
4
+ import type { Either, Equivalence, Order } from "effect"
5
+ import { not } from "effect/Predicate"
6
+ import type { Predicate, Refinement } from "./Function.js"
7
+ import { identity, pipe, tuple } from "./Function.js"
8
+
9
+ /**
10
+ * @tsplus fluent ets/Set find
11
+ */
12
+ export function find_<A, B extends A>(
13
+ as: ReadonlySet<A>,
14
+ refinement: Refinement<A, B>
15
+ ): B | undefined
16
+ export function find_<A>(set: ReadonlySet<A>, predicate: Predicate<A>): A | undefined
17
+ export function find_<A>(set: ReadonlySet<A>, predicate: Predicate<A>) {
18
+ return [...set].find(predicate)
19
+ }
20
+
21
+ /**
22
+ * @tsplus fluent ets/Set findFirst
23
+ */
24
+ export function findFirst_<A, B extends A>(
25
+ set: ReadonlySet<A>,
26
+ refinement: Refinement<A, B>
27
+ ): Option.Option<B>
28
+ export function findFirst_<A>(set: ReadonlySet<A>, predicate: Predicate<A>): Option.Option<A>
29
+ export function findFirst_<A>(set: ReadonlySet<A>, predicate: Predicate<A>): Option.Option<A> {
30
+ return Option.fromNullable([...set].find(predicate))
31
+ }
32
+
33
+ /**
34
+ * @tsplus fluent ets/Set findFirstMap
35
+ */
36
+ export function findFirstMap_<A, B>(
37
+ set: ReadonlySet<A>,
38
+ f: (a: A) => Option.Option<B>
39
+ ): Option.Option<B> {
40
+ return Array.findFirst([...set], f)
41
+ }
42
+
43
+ export type MutableSet<A> = globalThis.Set<A>
44
+ export type Set<A> = ReadonlySet<A>
45
+
46
+ export const empty: Set<never> = new Set()
47
+
48
+ /**
49
+ * The set of elements which are in both the first and second set
50
+ */
51
+ export function intersection_<A>(E: Equivalence.Equivalence<A>): (l: Set<A>, r: Set<A>) => Set<A> {
52
+ const elemE = elem_(E)
53
+ return (x, y) => {
54
+ if (x === empty || y === empty) {
55
+ return empty
56
+ }
57
+ const r = new Set<A>()
58
+ x.forEach((e) => {
59
+ if (elemE(y, e)) {
60
+ r.add(e)
61
+ }
62
+ })
63
+ return r
64
+ }
65
+ }
66
+
67
+ /**
68
+ * The set of elements which are in both the first and second set
69
+ */
70
+ export function intersection<A>(E: Equivalence.Equivalence<A>): (r: Set<A>) => (l: Set<A>) => Set<A> {
71
+ const i = intersection_(E)
72
+ return (x) => (y) => i(x, y)
73
+ }
74
+
75
+ /**
76
+ * Convert a mutable set to a readonly one
77
+ */
78
+ export function fromMutable<A>(s: MutableSet<A>): Set<A> {
79
+ return new Set(s)
80
+ }
81
+
82
+ /**
83
+ * Convert a set to a mutable one
84
+ */
85
+ export function toMutable<A>(s: Set<A>): MutableSet<A> {
86
+ return new Set(s)
87
+ }
88
+
89
+ // /**
90
+ // * get Show for set given Show for values
91
+ // */
92
+ // export function getShow<A>(S: Show<A>): Show<Set<A>> {
93
+ // return {
94
+ // show: (s) => {
95
+ // let elements = ""
96
+ // s.forEach((a) => {
97
+ // elements += S.show(a) + ", "
98
+ // })
99
+ // if (elements !== "") {
100
+ // elements = elements.substring(0, elements.length - 2)
101
+ // }
102
+ // return `new Set([${elements}])`
103
+ // }
104
+ // }
105
+ // }
106
+
107
+ /**
108
+ * Convert a set to an Array
109
+ */
110
+ export function toArray<A>(O: Order.Order<A>): (set: Set<A>) => ReadonlyArray<A> {
111
+ return (x) => {
112
+ const r: Array<A> = []
113
+ x.forEach((e) => r.push(e))
114
+ return r.sort(O)
115
+ }
116
+ }
117
+
118
+ /**
119
+ * Convert a set to an Array
120
+ */
121
+ export function toArray_<A>(x: Set<A>, O: Order.Order<A>): ReadonlyArray<A> {
122
+ return toArray(O)(x)
123
+ }
124
+
125
+ // /**
126
+ // * Get Equivalence for Setgiven Equivalence for element
127
+ // */
128
+ // export function getEquivalence.Equivalence<A>(E: Equivalence.Equivalence<A>): Equivalence.Equivalence<Set<A>> {
129
+ // const subsetE = isSubset_(E)
130
+ // return makeEquivalence((x, y) => subsetE(x, y) && subsetE(y, x))
131
+ // }
132
+
133
+ interface Next<A> {
134
+ readonly done?: boolean
135
+ readonly value: A
136
+ }
137
+
138
+ /**
139
+ * true if one or more elements match predicate
140
+ */
141
+ export function some<A>(predicate: Predicate<A>): (set: Set<A>) => boolean {
142
+ return (set) => {
143
+ const values = set.values()
144
+ let e: Next<A>
145
+ let found = false
146
+ while (!found && !(e = values.next() as any).done) {
147
+ found = predicate(e.value)
148
+ }
149
+ return found
150
+ }
151
+ }
152
+
153
+ /**
154
+ * true if one or more elements match predicate
155
+ * @tsplus fluent ets/Set some
156
+ */
157
+ export function some_<A>(set: Set<A>, predicate: Predicate<A>): boolean {
158
+ return some(predicate)(set)
159
+ }
160
+
161
+ /**
162
+ * Projects a Set through a function
163
+ */
164
+ export function map<B>(E: Equivalence.Equivalence<B>): <A>(f: (x: A) => B) => (set: Set<A>) => Set<B> {
165
+ const m = map_(E)
166
+ return (f) => (set) => m(set, f)
167
+ }
168
+
169
+ /**
170
+ * Projects a Set through a function
171
+ */
172
+ export function map_<B>(E: Equivalence.Equivalence<B>): <A>(set: Set<A>, f: (x: A) => B) => Set<B> {
173
+ const elemE = elem_(E)
174
+ return (set, f) => {
175
+ const r = new Set<B>()
176
+ set.forEach((e) => {
177
+ const v = f(e)
178
+ if (!elemE(r, v)) {
179
+ r.add(v)
180
+ }
181
+ })
182
+ return r
183
+ }
184
+ }
185
+
186
+ /**
187
+ * true if all elements match predicate
188
+ */
189
+ export function every<A>(predicate: Predicate<A>): (set: Set<A>) => boolean {
190
+ return (set) => every_(set, predicate)
191
+ }
192
+
193
+ /**
194
+ * true if all elements match predicate
195
+ */
196
+ export function every_<A>(set: Set<A>, predicate: Predicate<A>): boolean {
197
+ return not(some(not(predicate)))(set)
198
+ }
199
+
200
+ /**
201
+ * Map + Flatten
202
+ */
203
+ export function chain<B>(
204
+ E: Equivalence.Equivalence<B>
205
+ ): <A>(f: (x: A) => Set<B>) => (set: Set<A>) => Set<B> {
206
+ const c = chain_(E)
207
+ return (f) => (set) => c(set, f)
208
+ }
209
+
210
+ /**
211
+ * Map + Flatten
212
+ */
213
+ export function chain_<B>(
214
+ E: Equivalence.Equivalence<B>
215
+ ): <A>(set: Set<A>, f: (x: A) => Set<B>) => Set<B> {
216
+ const elemE = elem_(E)
217
+ return (set, f) => {
218
+ const r = new Set<B>()
219
+ set.forEach((e) => {
220
+ f(e).forEach((e) => {
221
+ if (!elemE(r, e)) {
222
+ r.add(e)
223
+ }
224
+ })
225
+ })
226
+ return r
227
+ }
228
+ }
229
+
230
+ /**
231
+ * `true` if and only if every element in the first set is an element of the second set
232
+ */
233
+ export function isSubset<A>(E: Equivalence.Equivalence<A>): (x: Set<A>, y: Set<A>) => boolean {
234
+ const i = isSubset_(E)
235
+ return (x, y) => i(y, x)
236
+ }
237
+
238
+ /**
239
+ * `true` if and only if every element in the first set is an element of the second set
240
+ */
241
+ export function isSubset_<A>(E: Equivalence.Equivalence<A>): (x: Set<A>, y: Set<A>) => boolean {
242
+ const elemE = elem_(E)
243
+ return (x, y) => every((a: A) => elemE(y, a))(x)
244
+ }
245
+
246
+ /**
247
+ * Filter set values using predicate
248
+ */
249
+ export function filter<A, B extends A>(
250
+ refinement: Refinement<A, B>
251
+ ): (set: Set<A>) => Set<B>
252
+ export function filter<A>(predicate: Predicate<A>): (set: Set<A>) => Set<A>
253
+ export function filter<A>(predicate: Predicate<A>): (set: Set<A>) => Set<A> {
254
+ return (set) => filter_(set, predicate)
255
+ }
256
+
257
+ /**
258
+ * Filter set values using predicate
259
+ * @tsplus fluent ets/Set filter
260
+ */
261
+ export function filter_<A, B extends A>(
262
+ set: Set<A>,
263
+ refinement: Refinement<A, B>
264
+ ): Set<B>
265
+ export function filter_<A>(set: Set<A>, predicate: Predicate<A>): Set<A>
266
+ export function filter_<A>(set: Set<A>, predicate: Predicate<A>): Set<A> {
267
+ const values = set.values()
268
+ let e: Next<A>
269
+ const r = new Set<A>()
270
+ while (!(e = values.next() as any).done) {
271
+ const value = e.value
272
+ if (predicate(value)) {
273
+ r.add(value)
274
+ }
275
+ }
276
+ return r
277
+ }
278
+
279
+ /**
280
+ * Partition set values using predicate
281
+ */
282
+ export function partition<A, B extends A>(
283
+ refinement: Refinement<A, B>
284
+ ): (set: Set<A>) => readonly [Set<A>, Set<B>]
285
+ export function partition<A>(
286
+ predicate: Predicate<A>
287
+ ): (set: Set<A>) => readonly [Set<A>, Set<A>]
288
+ export function partition<A>(
289
+ predicate: Predicate<A>
290
+ ): (set: Set<A>) => readonly [Set<A>, Set<A>] {
291
+ return (set) => partition_(set, predicate)
292
+ }
293
+
294
+ /**
295
+ * Partition set values using predicate
296
+ */
297
+ export function partition_<A, B extends A>(
298
+ set: Set<A>,
299
+ refinement: Refinement<A, B>
300
+ ): readonly [Set<A>, Set<B>]
301
+ export function partition_<A>(
302
+ set: Set<A>,
303
+ predicate: Predicate<A>
304
+ ): readonly [Set<A>, Set<A>]
305
+ export function partition_<A>(
306
+ set: Set<A>,
307
+ predicate: Predicate<A>
308
+ ): readonly [Set<A>, Set<A>] {
309
+ const values = set.values()
310
+ let e: Next<A>
311
+ const right = new Set<A>()
312
+ const left = new Set<A>()
313
+ while (!(e = values.next() as any).done) {
314
+ const value = e.value
315
+ if (predicate(value)) {
316
+ right.add(value)
317
+ } else {
318
+ left.add(value)
319
+ }
320
+ }
321
+ return tuple(left, right)
322
+ }
323
+
324
+ /**
325
+ * Test if a value is a member of a set
326
+ */
327
+ export function elem_<A>(E: Equivalence.Equivalence<A>): (set: Set<A>, a: A) => boolean {
328
+ return (set, a) => {
329
+ const values = set.values()
330
+ let e: Next<A>
331
+ let found = false
332
+ while (!found && !(e = values.next() as any).done) {
333
+ found = E(a, e.value)
334
+ }
335
+ return found
336
+ }
337
+ }
338
+
339
+ /**
340
+ * Test if a value is a member of a set
341
+ */
342
+ export function elem<A>(E: Equivalence.Equivalence<A>): (a: A) => (set: Set<A>) => boolean {
343
+ const e = elem_(E)
344
+ return (a) => (set) => e(set, a)
345
+ }
346
+
347
+ /**
348
+ * Partition elements according to f
349
+ */
350
+ export function partitionMap<B, C>(
351
+ EB: Equivalence.Equivalence<B>,
352
+ EC: Equivalence.Equivalence<C>
353
+ ): <A>(f: (a: A) => Either.Either<C, B>) => (set: Set<A>) => readonly [Set<B>, Set<C>] {
354
+ const pm = partitionMap_(EB, EC)
355
+ return <A>(f: (a: A) => Either.Either<C, B>) => (set: Set<A>) => pm(set, f)
356
+ }
357
+
358
+ /**
359
+ * Partition elements according to f
360
+ */
361
+ export function partitionMap_<B, C>(
362
+ EB: Equivalence.Equivalence<B>,
363
+ EC: Equivalence.Equivalence<C>
364
+ ): <A>(set: Set<A>, f: (a: A) => Either.Either<C, B>) => readonly [Set<B>, Set<C>] {
365
+ return <A>(set: Set<A>, f: (a: A) => Either.Either<C, B>) => {
366
+ const values = set.values()
367
+ let e: Next<A>
368
+ const left = new Set<B>()
369
+ const right = new Set<C>()
370
+ const hasB = elem_(EB)
371
+ const hasC = elem_(EC)
372
+ while (!(e = values.next() as any).done) {
373
+ const v = f(e.value)
374
+ switch (v._tag) {
375
+ case "Left":
376
+ if (!hasB(left, v.left)) {
377
+ left.add(v.left)
378
+ }
379
+ break
380
+ case "Right":
381
+ if (!hasC(right, v.right)) {
382
+ right.add(v.right)
383
+ }
384
+ break
385
+ }
386
+ }
387
+ return tuple(left, right)
388
+ }
389
+ }
390
+
391
+ /**
392
+ * Form the set difference (`x` - `y`)
393
+ */
394
+ export function difference_<A>(E: Equivalence.Equivalence<A>): (l: Set<A>, r: Set<A>) => Set<A> {
395
+ const elemE = elem_(E)
396
+ return (x, y) => filter((a: A) => !elemE(y, a))(x)
397
+ }
398
+
399
+ /**
400
+ * Form the set difference (`x` - `y`)
401
+ */
402
+ export function difference<A>(E: Equivalence.Equivalence<A>): (x: Set<A>, y: Set<A>) => Set<A> {
403
+ const diff = difference_(E)
404
+ return (x, y) => diff(x, y)
405
+ }
406
+
407
+ /**
408
+ * Reduce over the set values
409
+ */
410
+ export function reduce<A>(
411
+ O: Order.Order<A>
412
+ ): <B>(b: B, f: (b: B, a: A) => B) => (fa: Set<A>) => B {
413
+ const red = reduce_(O)
414
+ return (b, f) => (fa) => red(fa, b, f)
415
+ }
416
+
417
+ /**
418
+ * Reduce over the set values
419
+ */
420
+ export function reduce_<A>(
421
+ O: Order.Order<A>
422
+ ): <B>(fa: Set<A>, b: B, f: (b: B, a: A) => B) => B {
423
+ const toArrayO = toArray(O)
424
+ return (fa, b, f) => toArrayO(fa).reduce(f, b)
425
+ }
426
+
427
+ // /**
428
+ // * Fold + Map
429
+ // */
430
+ // export function foldMap<A, M>(
431
+ // O: Order.Order<A>,
432
+ // M: Identity<M>
433
+ // ): (f: (a: A) => M) => (fa: Set<A>) => M {
434
+ // const fm = foldMap_(O, M)
435
+ // return (f) => (fa) => fm(fa, f)
436
+ // }
437
+
438
+ // /**
439
+ // * Fold + Map
440
+ // */
441
+ // export function foldMap_<A, M>(
442
+ // O: Order.Order<A>,
443
+ // M: Identity<M>
444
+ // ): (fa: Set<A>, f: (a: A) => M) => M {
445
+ // const toArrayO = toArray(O)
446
+ // return (fa, f) => toArrayO(fa).reduce((b, a) => M.combine(b, f(a)), M.identity)
447
+ // }
448
+
449
+ /**
450
+ * Create a set with one element
451
+ */
452
+ export function singleton<A>(a: A): Set<A> {
453
+ return new Set([a])
454
+ }
455
+
456
+ /**
457
+ * Insert a value into a set
458
+ */
459
+ export function insert<A>(E: Equivalence.Equivalence<A>): (a: A) => (set: Set<A>) => Set<A> {
460
+ const i = insert_(E)
461
+ return (a) => (set) => i(set, a)
462
+ }
463
+
464
+ /**
465
+ * Insert a value into a set
466
+ */
467
+ export function insert_<A>(E: Equivalence.Equivalence<A>): (set: Set<A>, a: A) => Set<A> {
468
+ const elemE = elem_(E)
469
+ return (set, a) => {
470
+ if (!elemE(set, a)) {
471
+ const r = new Set(set)
472
+ r.add(a)
473
+ return r
474
+ } else {
475
+ return set
476
+ }
477
+ }
478
+ }
479
+
480
+ /**
481
+ * Delete a value from a set
482
+ */
483
+ export function remove<A>(E: Equivalence.Equivalence<A>): (a: A) => (set: Set<A>) => Set<A> {
484
+ const rem = remove_(E)
485
+ return (a) => (set) => rem(set, a)
486
+ }
487
+
488
+ /**
489
+ * Delete a value from a set
490
+ */
491
+ export function remove_<A>(E: Equivalence.Equivalence<A>): (set: Set<A>, a: A) => Set<A> {
492
+ return (set, a) => filter((ax: A) => !E(a, ax))(set)
493
+ }
494
+
495
+ /**
496
+ * If element is present remove it, if not add it
497
+ */
498
+ export function toggle<A>(E: Equivalence.Equivalence<A>): (a: A) => (set: Set<A>) => Set<A> {
499
+ const t = toggle_(E)
500
+ return (a) => (set) => t(set, a)
501
+ }
502
+
503
+ /**
504
+ * If element is present remove it, if not add it
505
+ */
506
+ export function toggle_<A>(E: Equivalence.Equivalence<A>): (set: Set<A>, a: A) => Set<A> {
507
+ const elemE = elem_(E)
508
+ const removeE = remove(E)
509
+ const insertE = insert(E)
510
+ return (set, a) => (elemE(set, a) ? removeE : insertE)(a)(set)
511
+ }
512
+
513
+ /**
514
+ * Create a set from an array
515
+ */
516
+ export function fromArray<A>(E: Equivalence.Equivalence<A>): (as: ReadonlyArray<A>) => Set<A> {
517
+ return (as) => {
518
+ const len = as.length
519
+ const r = new Set<A>()
520
+ const has = elem_(E)
521
+ for (let i = 0; i < len; i++) {
522
+ const a = as[i]!
523
+ if (!has(r, a)) {
524
+ r.add(a)
525
+ }
526
+ }
527
+ return r
528
+ }
529
+ }
530
+
531
+ /**
532
+ * Set compaction, remove none
533
+ */
534
+ export function compact<A>(E: Equivalence.Equivalence<A>): (fa: Set<Option.Option<A>>) => Set<A> {
535
+ return filterMap(E)(identity)
536
+ }
537
+
538
+ /**
539
+ * Separate elements
540
+ */
541
+ export function separate<E, A>(
542
+ EE: Equivalence.Equivalence<E>,
543
+ EA: Equivalence.Equivalence<A>
544
+ ): (fa: Set<Either.Either<A, E>>) => readonly [Set<E>, Set<A>] {
545
+ return (fa) => {
546
+ const elemEE = elem_(EE)
547
+ const elemEA = elem_(EA)
548
+ const left: MutableSet<E> = new Set()
549
+ const right: MutableSet<A> = new Set()
550
+ fa.forEach((e) => {
551
+ switch (e._tag) {
552
+ case "Left":
553
+ if (!elemEE(left, e.left)) {
554
+ left.add(e.left)
555
+ }
556
+ break
557
+ case "Right":
558
+ if (!elemEA(right, e.right)) {
559
+ right.add(e.right)
560
+ }
561
+ break
562
+ }
563
+ })
564
+ return tuple(left, right)
565
+ }
566
+ }
567
+
568
+ /**
569
+ * Filter + Map
570
+ */
571
+ export function filterMap<B>(
572
+ E: Equivalence.Equivalence<B>
573
+ ): <A>(f: (a: A) => Option.Option<B>) => (fa: Set<A>) => Set<B> {
574
+ const fm = filterMap_(E)
575
+ return (f) => (fa) => fm(fa, f)
576
+ }
577
+
578
+ /**
579
+ * Filter + Map
580
+ */
581
+ export function filterMap_<B>(
582
+ E: Equivalence.Equivalence<B>
583
+ ): <A>(fa: Set<A>, f: (a: A) => Option.Option<B>) => Set<B> {
584
+ const elemE = elem_(E)
585
+ return (fa, f) => {
586
+ const r: MutableSet<B> = new Set()
587
+ fa.forEach((a) => {
588
+ const ob = f(a)
589
+ if (ob._tag === "Some" && !elemE(r, ob.value)) {
590
+ r.add(ob.value)
591
+ }
592
+ })
593
+ return r
594
+ }
595
+ }
596
+
597
+ /**
598
+ * Form the union of two sets
599
+ */
600
+ export function union_<A>(E: Equivalence.Equivalence<A>): (set: Set<A>, y: Set<A>) => Set<A> {
601
+ const elemE = elem_(E)
602
+ return (x, y) => {
603
+ if (x === empty) {
604
+ return y
605
+ }
606
+ if (y === empty) {
607
+ return x
608
+ }
609
+ const r = new Set(x)
610
+ y.forEach((e) => {
611
+ if (!elemE(r, e)) {
612
+ r.add(e)
613
+ }
614
+ })
615
+ return r
616
+ }
617
+ }
618
+
619
+ /**
620
+ * Form the union of two sets
621
+ */
622
+ export function union<A>(E: Equivalence.Equivalence<A>): (set: Set<A>, y: Set<A>) => Set<A> {
623
+ const u = union_(E)
624
+ return (x, y) => u(x, y)
625
+ }
626
+
627
+ function make_<A>(ord: Order.Order<A>, eq_?: Equivalence.Equivalence<A>) {
628
+ const eq = eq_ ?? ((x, y) => ord(x, y) === 0)
629
+
630
+ const fromArray_ = fromArray(eq)
631
+ const concat_ = (set: Set<A>, it: Iterable<A>) => fromArray_([...set, ...it])
632
+ const insert__ = insert(eq)
633
+
634
+ function replace_(set: Set<A>, a: A) {
635
+ return pipe(filter_(set, (x) => !eq(x, a)), insert__(a))
636
+ }
637
+
638
+ return {
639
+ insert: insert__,
640
+ insert_: insert_(eq),
641
+ remove: remove(eq),
642
+ remove_: remove_(eq),
643
+ reduce: reduce(ord),
644
+ reduce_: reduce_(ord),
645
+ replace: (a: A) => (set: Set<A>) => replace_(set, a),
646
+ replace_,
647
+ toArray: toArray(ord),
648
+ fromArray,
649
+ from: (it: Iterable<A>) => fromArray_([...it]),
650
+ empty: () => new Set<A>(),
651
+ concat_,
652
+ concat: (it: Iterable<A>) => (set: Set<A>) => concat_(set, it),
653
+
654
+ // A and B the same, useful when editing elements.
655
+ map: map(eq),
656
+ map_: map_(eq),
657
+ filterMap: filterMap(eq),
658
+ filterMap_: filterMap_(eq)
659
+ }
660
+ // TODO: extend
661
+ }
662
+
663
+ class Wrapper<A> {
664
+ wrapped(ord: Order.Order<A>, eq: Equivalence.Equivalence<A>) {
665
+ return make_(ord, eq)
666
+ }
667
+ }
668
+
669
+ export interface SetSchemaExtensions<A> extends ReturnType<Wrapper<A>["wrapped"]> {}
670
+
671
+ export const make: <A>(
672
+ ord: Order.Order<A>,
673
+ eq?: Equivalence.Equivalence<A>
674
+ ) => SetSchemaExtensions<A> = make_