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.
- package/CHANGELOG.md +6 -0
- package/_cjs/Array.cjs +132 -0
- package/_cjs/Array.cjs.map +1 -0
- package/_cjs/Chunk.cjs +128 -0
- package/_cjs/Chunk.cjs.map +1 -0
- package/_cjs/Config/SecretURL.cjs +3 -3
- package/_cjs/Config/SecretURL.cjs.map +1 -1
- package/_cjs/Config/internal/configSecretURL.cjs +2 -2
- package/_cjs/Config/internal/configSecretURL.cjs.map +1 -1
- package/_cjs/Context.cjs +243 -0
- package/_cjs/Context.cjs.map +1 -0
- package/_cjs/Dictionary.cjs +522 -0
- package/_cjs/Dictionary.cjs.map +1 -0
- package/_cjs/Effect.cjs +202 -0
- package/_cjs/Effect.cjs.map +1 -0
- package/_cjs/Function.cjs +107 -0
- package/_cjs/Function.cjs.map +1 -0
- package/_cjs/NonEmptySet.cjs +26 -0
- package/_cjs/NonEmptySet.cjs.map +1 -0
- package/_cjs/NonEmptySetAspects.cjs +17 -0
- package/_cjs/NonEmptySetAspects.cjs.map +1 -0
- package/_cjs/NonEmptySetBase.cjs +82 -0
- package/_cjs/NonEmptySetBase.cjs.map +1 -0
- package/_cjs/Object.cjs +24 -0
- package/_cjs/Object.cjs.map +1 -0
- package/_cjs/Operations.cjs +1 -1
- package/_cjs/Option.cjs +88 -0
- package/_cjs/Option.cjs.map +1 -0
- package/_cjs/Prelude.cjs +51 -0
- package/_cjs/Prelude.cjs.map +1 -0
- package/_cjs/Prelude.code.cjs +51 -0
- package/_cjs/Prelude.code.cjs.map +1 -0
- package/_cjs/Pure.cjs +39 -36
- package/_cjs/Pure.cjs.map +1 -1
- package/_cjs/Schema/Class.cjs +61 -0
- package/_cjs/Schema/Class.cjs.map +1 -0
- package/_cjs/Schema/FastCheck.cjs +39 -0
- package/_cjs/Schema/FastCheck.cjs.map +1 -0
- package/_cjs/Schema/Methods.cjs +6 -0
- package/_cjs/Schema/Methods.cjs.map +1 -0
- package/_cjs/Schema/brand.cjs +17 -0
- package/_cjs/Schema/brand.cjs.map +1 -0
- package/_cjs/Schema/email.cjs +20 -0
- package/_cjs/Schema/email.cjs.map +1 -0
- package/_cjs/Schema/ext.cjs +174 -0
- package/_cjs/Schema/ext.cjs.map +1 -0
- package/_cjs/Schema/moreStrings.cjs +124 -0
- package/_cjs/Schema/moreStrings.cjs.map +1 -0
- package/_cjs/Schema/numbers.cjs +52 -0
- package/_cjs/Schema/numbers.cjs.map +1 -0
- package/_cjs/Schema/phoneNumber.cjs +22 -0
- package/_cjs/Schema/phoneNumber.cjs.map +1 -0
- package/_cjs/Schema/schema.cjs +15 -0
- package/_cjs/Schema/schema.cjs.map +1 -0
- package/_cjs/Schema/strings.cjs +32 -0
- package/_cjs/Schema/strings.cjs.map +1 -0
- package/_cjs/Schema.cjs +334 -0
- package/_cjs/Schema.cjs.map +1 -0
- package/_cjs/Set.cjs +567 -0
- package/_cjs/Set.cjs.map +1 -0
- package/_cjs/Struct.cjs +51 -0
- package/_cjs/Struct.cjs.map +1 -0
- package/_cjs/Tag.cjs +25 -0
- package/_cjs/Tag.cjs.map +1 -0
- package/_cjs/Unify.cjs +40 -0
- package/_cjs/Unify.cjs.map +1 -0
- package/_cjs/_ext/misc.cjs +16 -16
- package/_cjs/_ext/misc.cjs.map +1 -1
- package/_cjs/_ext/ord.ext.cjs +52 -0
- package/_cjs/_ext/ord.ext.cjs.map +1 -0
- package/_cjs/builtin.cjs +6 -0
- package/_cjs/builtin.cjs.map +1 -0
- package/_cjs/client/clientFor.cjs +5 -3
- package/_cjs/client/clientFor.cjs.map +1 -1
- package/_cjs/client/config.cjs +4 -4
- package/_cjs/client/config.cjs.map +1 -1
- package/_cjs/client/errors.cjs +9 -9
- package/_cjs/client/errors.cjs.map +1 -1
- package/_cjs/http/http-client.cjs +35 -0
- package/_cjs/http/http-client.cjs.map +1 -0
- package/_cjs/ids.cjs +5 -5
- package/_cjs/ids.cjs.map +1 -1
- package/_cjs/index.cjs +1 -1
- package/_cjs/lib.cjs +178 -9
- package/_cjs/lib.cjs.map +1 -1
- package/_cjs/logger.cjs +1 -1
- package/_cjs/transform.cjs +45 -0
- package/_cjs/transform.cjs.map +1 -0
- package/_cjs/utils/effectify.cjs +25 -0
- package/_cjs/utils/effectify.cjs.map +1 -0
- package/_cjs/utils/extend.cjs +17 -0
- package/_cjs/utils/extend.cjs.map +1 -0
- package/_cjs/utils/logger.cjs +23 -0
- package/_cjs/utils/logger.cjs.map +1 -0
- package/_cjs/utils.cjs +431 -4
- package/_cjs/utils.cjs.map +1 -1
- package/_cjs/validation/validators.cjs +32 -0
- package/_cjs/validation/validators.cjs.map +1 -0
- package/_cjs/validation.cjs +45 -0
- package/_cjs/validation.cjs.map +1 -0
- package/dist/Array.d.ts +64 -0
- package/dist/Array.d.ts.map +1 -0
- package/dist/Array.js +89 -0
- package/dist/Chunk.d.ts +68 -0
- package/dist/Chunk.d.ts.map +1 -0
- package/dist/Chunk.js +93 -0
- package/dist/Config/SecretURL.d.ts +3 -3
- package/dist/Config/SecretURL.d.ts.map +1 -1
- package/dist/Config/SecretURL.js +2 -2
- package/dist/Config/internal/configSecretURL.js +2 -2
- package/dist/Context.d.ts +55 -0
- package/dist/Context.d.ts.map +1 -0
- package/dist/Context.js +204 -0
- package/dist/Dictionary.d.ts +260 -0
- package/dist/Dictionary.d.ts.map +1 -0
- package/dist/Dictionary.js +448 -0
- package/dist/Effect.d.ts +115 -0
- package/dist/Effect.d.ts.map +1 -0
- package/dist/Effect.js +153 -0
- package/dist/Function.d.ts +72 -0
- package/dist/Function.d.ts.map +1 -0
- package/dist/Function.js +71 -0
- package/dist/Inputify.type.d.ts +1 -1
- package/dist/Inputify.type.d.ts.map +1 -1
- package/dist/NonEmptySet.d.ts +3 -0
- package/dist/NonEmptySet.d.ts.map +1 -0
- package/dist/NonEmptySet.js +3 -0
- package/dist/NonEmptySetAspects.d.ts +2 -0
- package/dist/NonEmptySetAspects.d.ts.map +1 -0
- package/dist/NonEmptySetAspects.js +2 -0
- package/dist/NonEmptySetBase.d.ts +39 -0
- package/dist/NonEmptySetBase.d.ts.map +1 -0
- package/dist/NonEmptySetBase.js +63 -0
- package/dist/Object.d.ts +7 -0
- package/dist/Object.d.ts.map +1 -0
- package/dist/Object.js +7 -0
- package/dist/Operations.d.ts +2 -2
- package/dist/Operations.js +1 -1
- package/dist/Option.d.ts +39 -0
- package/dist/Option.d.ts.map +1 -0
- package/dist/Option.js +55 -0
- package/dist/Prelude.code.d.ts +24 -0
- package/dist/Prelude.code.d.ts.map +1 -0
- package/dist/Prelude.code.js +23 -0
- package/dist/Prelude.d.ts +163 -0
- package/dist/Prelude.d.ts.map +1 -0
- package/dist/Prelude.js +23 -0
- package/dist/Pure.d.ts +13 -12
- package/dist/Pure.d.ts.map +1 -1
- package/dist/Pure.js +18 -17
- package/dist/Schema/Class.d.ts +45 -0
- package/dist/Schema/Class.d.ts.map +1 -0
- package/dist/Schema/Class.js +50 -0
- package/dist/Schema/FastCheck.d.ts +10 -0
- package/dist/Schema/FastCheck.d.ts.map +1 -0
- package/dist/Schema/FastCheck.js +12 -0
- package/dist/Schema/Methods.d.ts +6 -0
- package/dist/Schema/Methods.d.ts.map +1 -0
- package/dist/Schema/Methods.js +2 -0
- package/dist/Schema/brand.d.ts +35 -0
- package/dist/Schema/brand.d.ts.map +1 -0
- package/dist/Schema/brand.js +7 -0
- package/dist/Schema/email.d.ts +9 -0
- package/dist/Schema/email.d.ts.map +1 -0
- package/dist/Schema/email.js +12 -0
- package/dist/Schema/ext.d.ts +89 -0
- package/dist/Schema/ext.d.ts.map +1 -0
- package/dist/Schema/ext.js +111 -0
- package/dist/Schema/moreStrings.d.ts +109 -0
- package/dist/Schema/moreStrings.d.ts.map +1 -0
- package/dist/Schema/moreStrings.js +108 -0
- package/dist/Schema/numbers.d.ts +46 -0
- package/dist/Schema/numbers.d.ts.map +1 -0
- package/dist/Schema/numbers.js +28 -0
- package/dist/Schema/phoneNumber.d.ts +9 -0
- package/dist/Schema/phoneNumber.d.ts.map +1 -0
- package/dist/Schema/phoneNumber.js +14 -0
- package/dist/Schema/schema.d.ts +6 -0
- package/dist/Schema/schema.d.ts.map +1 -0
- package/dist/Schema/schema.js +5 -0
- package/dist/Schema/strings.d.ts +19 -0
- package/dist/Schema/strings.d.ts.map +1 -0
- package/dist/Schema/strings.js +32 -0
- package/dist/{schema.d.ts → Schema.d.ts} +25 -9
- package/dist/Schema.d.ts.map +1 -0
- package/dist/Schema.js +89 -0
- package/dist/Set.d.ts +221 -0
- package/dist/Set.d.ts.map +1 -0
- package/dist/Set.js +516 -0
- package/dist/Struct.d.ts +44 -0
- package/dist/Struct.d.ts.map +1 -0
- package/dist/Struct.js +29 -0
- package/dist/Tag.d.ts +9 -0
- package/dist/Tag.d.ts.map +1 -0
- package/dist/Tag.js +18 -0
- package/dist/Unify.d.ts +43 -0
- package/dist/Unify.d.ts.map +1 -0
- package/dist/Unify.js +31 -0
- package/dist/Widen.type.d.ts +1 -1
- package/dist/Widen.type.d.ts.map +1 -1
- package/dist/_ext/misc.d.ts +11 -11
- package/dist/_ext/misc.d.ts.map +1 -1
- package/dist/_ext/misc.js +8 -8
- package/dist/_ext/ord.ext.d.ts +23 -0
- package/dist/_ext/ord.ext.d.ts.map +1 -0
- package/dist/_ext/ord.ext.js +44 -0
- package/dist/builtin.d.ts +51 -0
- package/dist/builtin.d.ts.map +1 -0
- package/dist/builtin.js +2 -0
- package/dist/client/clientFor.d.ts +1 -1
- package/dist/client/clientFor.d.ts.map +1 -1
- package/dist/client/clientFor.js +2 -2
- package/dist/client/config.d.ts +1 -1
- package/dist/client/config.d.ts.map +1 -1
- package/dist/client/config.js +2 -2
- package/dist/client/errors.js +1 -1
- package/dist/http/http-client.d.ts +43 -0
- package/dist/http/http-client.d.ts.map +1 -0
- package/dist/http/http-client.js +30 -0
- package/dist/ids.d.ts +3 -3
- package/dist/ids.d.ts.map +1 -1
- package/dist/ids.js +2 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/lib.d.ts +22 -4
- package/dist/lib.d.ts.map +1 -1
- package/dist/lib.js +20 -5
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +2 -2
- package/dist/transform.d.ts +12 -0
- package/dist/transform.d.ts.map +1 -0
- package/dist/transform.js +39 -0
- package/dist/utils/effectify.d.ts +210 -0
- package/dist/utils/effectify.d.ts.map +1 -0
- package/dist/utils/effectify.js +19 -0
- package/dist/utils/extend.d.ts +3 -0
- package/dist/utils/extend.d.ts.map +1 -0
- package/dist/utils/extend.js +9 -0
- package/dist/utils/logger.d.ts +12 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +15 -0
- package/dist/utils.d.ts +192 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +332 -2
- package/dist/validation/validators.d.ts +11 -0
- package/dist/validation/validators.d.ts.map +1 -0
- package/dist/validation/validators.js +26 -0
- package/dist/validation.d.ts +13 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +14 -0
- package/package.json +360 -9
- package/src/Array.ts +127 -0
- package/src/Chunk.ts +112 -0
- package/src/Config/SecretURL.ts +3 -3
- package/src/Config/internal/configSecretURL.ts +1 -1
- package/src/Context.ts +293 -0
- package/src/Dictionary.ts +669 -0
- package/src/Effect.ts +265 -0
- package/src/Function.ts +175 -0
- package/src/Inputify.type.ts +1 -1
- package/src/NonEmptySet.ts +3 -0
- package/src/NonEmptySetAspects.ts +1 -0
- package/src/NonEmptySetBase.ts +109 -0
- package/src/Object.ts +19 -0
- package/src/Operations.ts +1 -1
- package/src/Option.ts +82 -0
- package/src/Prelude.code.ts +26 -0
- package/src/Prelude.ts +220 -0
- package/src/Pure.ts +37 -30
- package/src/Schema/Class.ts +225 -0
- package/src/Schema/FastCheck.ts +23 -0
- package/src/Schema/Methods.ts +8 -0
- package/src/Schema/brand.ts +50 -0
- package/src/Schema/email.ts +22 -0
- package/src/Schema/ext.ts +273 -0
- package/src/Schema/moreStrings.ts +260 -0
- package/src/Schema/numbers.ts +83 -0
- package/src/Schema/phoneNumber.ts +24 -0
- package/src/Schema/schema.ts +6 -0
- package/src/Schema/strings.ts +60 -0
- package/src/{schema.ts → Schema.ts} +52 -20
- package/src/Set.ts +674 -0
- package/src/Struct.ts +54 -0
- package/src/Tag.ts +20 -0
- package/src/Unify.ts +56 -0
- package/src/Widen.type.ts +1 -1
- package/src/_ext/misc.ts +22 -22
- package/src/_ext/ord.ext.ts +49 -0
- package/src/builtin.ts +64 -0
- package/src/client/clientFor.ts +1 -1
- package/src/client/config.ts +1 -1
- package/src/client/errors.ts +1 -1
- package/src/http/http-client.ts +73 -0
- package/src/ids.ts +3 -3
- package/src/index.ts +1 -1
- package/src/lib.ts +88 -4
- package/src/logger.ts +1 -1
- package/src/transform.ts +80 -0
- package/src/utils/effectify.ts +259 -0
- package/src/utils/extend.ts +9 -0
- package/src/utils/logger.ts +24 -0
- package/src/utils.ts +805 -1
- package/src/validation/validators.ts +32 -0
- package/src/validation.ts +18 -0
- package/tsconfig.src.json +1 -5
- package/_cjs/schema.cjs +0 -110
- package/_cjs/schema.cjs.map +0 -1
- package/dist/schema.d.ts.map +0 -1
- 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_
|