版博士V2.0程序
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Semigroup.d.ts 7.4 KiB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. import * as M from './Magma'
  2. import * as Or from './Ord'
  3. import { ReadonlyRecord } from './ReadonlyRecord'
  4. import Ord = Or.Ord
  5. import Magma = M.Magma
  6. /**
  7. * @category model
  8. * @since 2.0.0
  9. */
  10. export interface Semigroup<A> extends Magma<A> {}
  11. /**
  12. * Get a semigroup where `concat` will return the minimum, based on the provided order.
  13. *
  14. * @example
  15. * import * as N from 'fp-ts/number'
  16. * import * as S from 'fp-ts/Semigroup'
  17. *
  18. * const S1 = S.min(N.Ord)
  19. *
  20. * assert.deepStrictEqual(S1.concat(1, 2), 1)
  21. *
  22. * @category constructors
  23. * @since 2.10.0
  24. */
  25. export declare const min: <A>(O: Or.Ord<A>) => Semigroup<A>
  26. /**
  27. * Get a semigroup where `concat` will return the maximum, based on the provided order.
  28. *
  29. * @example
  30. * import * as N from 'fp-ts/number'
  31. * import * as S from 'fp-ts/Semigroup'
  32. *
  33. * const S1 = S.max(N.Ord)
  34. *
  35. * assert.deepStrictEqual(S1.concat(1, 2), 2)
  36. *
  37. * @category constructors
  38. * @since 2.10.0
  39. */
  40. export declare const max: <A>(O: Or.Ord<A>) => Semigroup<A>
  41. /**
  42. * @category constructors
  43. * @since 2.10.0
  44. */
  45. export declare const constant: <A>(a: A) => Semigroup<A>
  46. /**
  47. * The dual of a `Semigroup`, obtained by swapping the arguments of `concat`.
  48. *
  49. * @example
  50. * import { reverse } from 'fp-ts/Semigroup'
  51. * import * as S from 'fp-ts/string'
  52. *
  53. * assert.deepStrictEqual(reverse(S.Semigroup).concat('a', 'b'), 'ba')
  54. *
  55. * @since 2.10.0
  56. */
  57. export declare const reverse: <A>(S: Semigroup<A>) => Semigroup<A>
  58. /**
  59. * Given a struct of semigroups returns a semigroup for the struct.
  60. *
  61. * @example
  62. * import { struct } from 'fp-ts/Semigroup'
  63. * import * as N from 'fp-ts/number'
  64. *
  65. * interface Point {
  66. * readonly x: number
  67. * readonly y: number
  68. * }
  69. *
  70. * const S = struct<Point>({
  71. * x: N.SemigroupSum,
  72. * y: N.SemigroupSum
  73. * })
  74. *
  75. * assert.deepStrictEqual(S.concat({ x: 1, y: 2 }, { x: 3, y: 4 }), { x: 4, y: 6 })
  76. *
  77. * @since 2.10.0
  78. */
  79. export declare const struct: <A>(semigroups: { [K in keyof A]: Semigroup<A[K]> }) => Semigroup<{
  80. readonly [K_1 in keyof A]: A[K_1]
  81. }>
  82. /**
  83. * Given a tuple of semigroups returns a semigroup for the tuple.
  84. *
  85. * @example
  86. * import { tuple } from 'fp-ts/Semigroup'
  87. * import * as B from 'fp-ts/boolean'
  88. * import * as N from 'fp-ts/number'
  89. * import * as S from 'fp-ts/string'
  90. *
  91. * const S1 = tuple(S.Semigroup, N.SemigroupSum)
  92. * assert.deepStrictEqual(S1.concat(['a', 1], ['b', 2]), ['ab', 3])
  93. *
  94. * const S2 = tuple(S.Semigroup, N.SemigroupSum, B.SemigroupAll)
  95. * assert.deepStrictEqual(S2.concat(['a', 1, true], ['b', 2, false]), ['ab', 3, false])
  96. *
  97. * @since 2.10.0
  98. */
  99. export declare const tuple: <A extends readonly unknown[]>(
  100. ...semigroups: { [K in keyof A]: Semigroup<A[K]> }
  101. ) => Semigroup<Readonly<A>>
  102. /**
  103. * Between each pair of elements insert `middle`.
  104. *
  105. * @example
  106. * import { intercalate } from 'fp-ts/Semigroup'
  107. * import * as S from 'fp-ts/string'
  108. * import { pipe } from 'fp-ts/function'
  109. *
  110. * const S1 = pipe(S.Semigroup, intercalate(' + '))
  111. *
  112. * assert.strictEqual(S1.concat('a', 'b'), 'a + b')
  113. *
  114. * @since 2.10.0
  115. */
  116. export declare const intercalate: <A>(middle: A) => (S: Semigroup<A>) => Semigroup<A>
  117. /**
  118. * Always return the first argument.
  119. *
  120. * @example
  121. * import * as S from 'fp-ts/Semigroup'
  122. *
  123. * assert.deepStrictEqual(S.first<number>().concat(1, 2), 1)
  124. *
  125. * @category instances
  126. * @since 2.10.0
  127. */
  128. export declare const first: <A = never>() => Semigroup<A>
  129. /**
  130. * Always return the last argument.
  131. *
  132. * @example
  133. * import * as S from 'fp-ts/Semigroup'
  134. *
  135. * assert.deepStrictEqual(S.last<number>().concat(1, 2), 2)
  136. *
  137. * @category instances
  138. * @since 2.10.0
  139. */
  140. export declare const last: <A = never>() => Semigroup<A>
  141. /**
  142. * Given a sequence of `as`, concat them and return the total.
  143. *
  144. * If `as` is empty, return the provided `startWith` value.
  145. *
  146. * @example
  147. * import { concatAll } from 'fp-ts/Semigroup'
  148. * import * as N from 'fp-ts/number'
  149. *
  150. * const sum = concatAll(N.SemigroupSum)(0)
  151. *
  152. * assert.deepStrictEqual(sum([1, 2, 3]), 6)
  153. * assert.deepStrictEqual(sum([]), 0)
  154. *
  155. * @since 2.10.0
  156. */
  157. export declare const concatAll: <A>(S: Semigroup<A>) => (startWith: A) => (as: ReadonlyArray<A>) => A
  158. /**
  159. * Use `void` module instead.
  160. *
  161. * @category zone of death
  162. * @since 2.0.0
  163. * @deprecated
  164. */
  165. export declare const semigroupVoid: Semigroup<void>
  166. /**
  167. * Use [`getAssignSemigroup`](./struct.ts.html#getAssignSemigroup) instead.
  168. *
  169. * @category zone of death
  170. * @since 2.0.0
  171. * @deprecated
  172. */
  173. export declare const getObjectSemigroup: <A extends object = never>() => Semigroup<A>
  174. /**
  175. * Use [`last`](#last) instead.
  176. *
  177. * @category zone of death
  178. * @since 2.0.0
  179. * @deprecated
  180. */
  181. export declare const getLastSemigroup: <A = never>() => Semigroup<A>
  182. /**
  183. * Use [`first`](#first) instead.
  184. *
  185. * @category zone of death
  186. * @since 2.0.0
  187. * @deprecated
  188. */
  189. export declare const getFirstSemigroup: <A = never>() => Semigroup<A>
  190. /**
  191. * Use [`tuple`](#tuple) instead.
  192. *
  193. * @category zone of death
  194. * @since 2.0.0
  195. * @deprecated
  196. */
  197. export declare const getTupleSemigroup: <T extends ReadonlyArray<Semigroup<any>>>(
  198. ...semigroups: T
  199. ) => Semigroup<{
  200. [K in keyof T]: T[K] extends Semigroup<infer A> ? A : never
  201. }>
  202. /**
  203. * Use [`struct`](#struct) instead.
  204. *
  205. * @category zone of death
  206. * @since 2.0.0
  207. * @deprecated
  208. */
  209. export declare const getStructSemigroup: <O extends ReadonlyRecord<string, any>>(semigroups: {
  210. [K in keyof O]: Semigroup<O[K]>
  211. }) => Semigroup<O>
  212. /**
  213. * Use [`reverse`](#reverse) instead.
  214. *
  215. * @category zone of death
  216. * @since 2.0.0
  217. * @deprecated
  218. */
  219. export declare const getDualSemigroup: <A>(S: Semigroup<A>) => Semigroup<A>
  220. /**
  221. * Use [`max`](#max) instead.
  222. *
  223. * @category zone of death
  224. * @since 2.0.0
  225. * @deprecated
  226. */
  227. export declare const getJoinSemigroup: <A>(O: Or.Ord<A>) => Semigroup<A>
  228. /**
  229. * Use [`min`](#min) instead.
  230. *
  231. * @category zone of death
  232. * @since 2.0.0
  233. * @deprecated
  234. */
  235. export declare const getMeetSemigroup: <A>(O: Or.Ord<A>) => Semigroup<A>
  236. /**
  237. * Use [`intercalate`](#intercalate) instead.
  238. *
  239. * @category zone of death
  240. * @since 2.5.0
  241. * @deprecated
  242. */
  243. export declare const getIntercalateSemigroup: <A>(middle: A) => (S: Semigroup<A>) => Semigroup<A>
  244. /**
  245. * Use [`concatAll`](#concatall) instead.
  246. *
  247. * @category zone of death
  248. * @since 2.0.0
  249. * @deprecated
  250. */
  251. export declare function fold<A>(S: Semigroup<A>): {
  252. (startWith: A): (as: ReadonlyArray<A>) => A
  253. (startWith: A, as: ReadonlyArray<A>): A
  254. }
  255. /**
  256. * Use [`SemigroupAll`](./boolean.ts.html#SemigroupAll) instead.
  257. *
  258. * @category zone of death
  259. * @since 2.0.0
  260. * @deprecated
  261. */
  262. export declare const semigroupAll: Semigroup<boolean>
  263. /**
  264. * Use [`SemigroupAny`](./boolean.ts.html#SemigroupAny) instead.
  265. *
  266. * @category zone of death
  267. * @since 2.0.0
  268. * @deprecated
  269. */
  270. export declare const semigroupAny: Semigroup<boolean>
  271. /**
  272. * Use [`getSemigroup`](./function.ts.html#getSemigroup) instead.
  273. *
  274. * @category zone of death
  275. * @since 2.0.0
  276. * @deprecated
  277. */
  278. export declare const getFunctionSemigroup: <S>(S: Semigroup<S>) => <A = never>() => Semigroup<(a: A) => S>
  279. /**
  280. * Use [`Semigroup`](./string.ts.html#Semigroup) instead.
  281. *
  282. * @category zone of death
  283. * @since 2.0.0
  284. * @deprecated
  285. */
  286. export declare const semigroupString: Semigroup<string>
  287. /**
  288. * Use [`SemigroupSum`](./number.ts.html#SemigroupSum) instead.
  289. *
  290. * @category zone of death
  291. * @since 2.0.0
  292. * @deprecated
  293. */
  294. export declare const semigroupSum: Semigroup<number>
  295. /**
  296. * Use [`SemigroupProduct`](./number.ts.html#SemigroupProduct) instead.
  297. *
  298. * @category zone of death
  299. * @since 2.0.0
  300. * @deprecated
  301. */
  302. export declare const semigroupProduct: Semigroup<number>