@livestore/utils 0.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 (322) hide show
  1. package/dist/.tsbuildinfo.json +1 -0
  2. package/dist/Deferred.d.ts +10 -0
  3. package/dist/Deferred.d.ts.map +1 -0
  4. package/dist/Deferred.js +18 -0
  5. package/dist/Deferred.js.map +1 -0
  6. package/dist/NoopTracer.d.ts +9 -0
  7. package/dist/NoopTracer.d.ts.map +1 -0
  8. package/dist/NoopTracer.js +54 -0
  9. package/dist/NoopTracer.js.map +1 -0
  10. package/dist/base64.d.ts +12 -0
  11. package/dist/base64.d.ts.map +1 -0
  12. package/dist/base64.js +114 -0
  13. package/dist/base64.js.map +1 -0
  14. package/dist/binary.d.ts +4 -0
  15. package/dist/binary.d.ts.map +1 -0
  16. package/dist/binary.js +23 -0
  17. package/dist/binary.js.map +1 -0
  18. package/dist/browser.d.ts +3 -0
  19. package/dist/browser.d.ts.map +1 -0
  20. package/dist/browser.js +28 -0
  21. package/dist/browser.js.map +1 -0
  22. package/dist/effect/Debounce.d.ts +5 -0
  23. package/dist/effect/Debounce.d.ts.map +1 -0
  24. package/dist/effect/Debounce.js +33 -0
  25. package/dist/effect/Debounce.js.map +1 -0
  26. package/dist/effect/Effect.d.ts +7 -0
  27. package/dist/effect/Effect.d.ts.map +1 -0
  28. package/dist/effect/Effect.js +17 -0
  29. package/dist/effect/Effect.js.map +1 -0
  30. package/dist/effect/EndableQueue.d.ts +11 -0
  31. package/dist/effect/EndableQueue.d.ts.map +1 -0
  32. package/dist/effect/EndableQueue.js +22 -0
  33. package/dist/effect/EndableQueue.js.map +1 -0
  34. package/dist/effect/EnvVar.d.ts +16 -0
  35. package/dist/effect/EnvVar.d.ts.map +1 -0
  36. package/dist/effect/EnvVar.js +21 -0
  37. package/dist/effect/EnvVar.js.map +1 -0
  38. package/dist/effect/Error.d.ts +12 -0
  39. package/dist/effect/Error.d.ts.map +1 -0
  40. package/dist/effect/Error.js +13 -0
  41. package/dist/effect/Error.js.map +1 -0
  42. package/dist/effect/Gate.d.ts +14 -0
  43. package/dist/effect/Gate.d.ts.map +1 -0
  44. package/dist/effect/Gate.js +17 -0
  45. package/dist/effect/Gate.js.map +1 -0
  46. package/dist/effect/Layer.d.ts +6 -0
  47. package/dist/effect/Layer.d.ts.map +1 -0
  48. package/dist/effect/Layer.js +11 -0
  49. package/dist/effect/Layer.js.map +1 -0
  50. package/dist/effect/Otel/Dummy.d.ts +5 -0
  51. package/dist/effect/Otel/Dummy.d.ts.map +1 -0
  52. package/dist/effect/Otel/Dummy.js +22 -0
  53. package/dist/effect/Otel/Dummy.js.map +1 -0
  54. package/dist/effect/Otel/Meter.d.ts +20 -0
  55. package/dist/effect/Otel/Meter.d.ts.map +1 -0
  56. package/dist/effect/Otel/Meter.js +76 -0
  57. package/dist/effect/Otel/Meter.js.map +1 -0
  58. package/dist/effect/Otel/OtlpGrpc.d.ts +6 -0
  59. package/dist/effect/Otel/OtlpGrpc.d.ts.map +1 -0
  60. package/dist/effect/Otel/OtlpGrpc.js +42 -0
  61. package/dist/effect/Otel/OtlpGrpc.js.map +1 -0
  62. package/dist/effect/Otel/OtlpHttp.d.ts +6 -0
  63. package/dist/effect/Otel/OtlpHttp.d.ts.map +1 -0
  64. package/dist/effect/Otel/OtlpHttp.js +42 -0
  65. package/dist/effect/Otel/OtlpHttp.js.map +1 -0
  66. package/dist/effect/Otel/OtlpWebsocket.d.ts +6 -0
  67. package/dist/effect/Otel/OtlpWebsocket.d.ts.map +1 -0
  68. package/dist/effect/Otel/OtlpWebsocket.js +42 -0
  69. package/dist/effect/Otel/OtlpWebsocket.js.map +1 -0
  70. package/dist/effect/Otel/Span.d.ts +32 -0
  71. package/dist/effect/Otel/Span.d.ts.map +1 -0
  72. package/dist/effect/Otel/Span.js +97 -0
  73. package/dist/effect/Otel/Span.js.map +1 -0
  74. package/dist/effect/Otel/Tracer.d.ts +15 -0
  75. package/dist/effect/Otel/Tracer.d.ts.map +1 -0
  76. package/dist/effect/Otel/Tracer.js +17 -0
  77. package/dist/effect/Otel/Tracer.js.map +1 -0
  78. package/dist/effect/Otel/index.d.ts +8 -0
  79. package/dist/effect/Otel/index.d.ts.map +1 -0
  80. package/dist/effect/Otel/index.js +9 -0
  81. package/dist/effect/Otel/index.js.map +1 -0
  82. package/dist/effect/Otel/lib-metrics/ExporterMetricsOltpGrpc.d.ts +14 -0
  83. package/dist/effect/Otel/lib-metrics/ExporterMetricsOltpGrpc.d.ts.map +1 -0
  84. package/dist/effect/Otel/lib-metrics/ExporterMetricsOltpGrpc.js +15 -0
  85. package/dist/effect/Otel/lib-metrics/ExporterMetricsOltpGrpc.js.map +1 -0
  86. package/dist/effect/Otel/lib-metrics/ExporterMetricsOltpHttp.d.ts +14 -0
  87. package/dist/effect/Otel/lib-metrics/ExporterMetricsOltpHttp.d.ts.map +1 -0
  88. package/dist/effect/Otel/lib-metrics/ExporterMetricsOltpHttp.js +15 -0
  89. package/dist/effect/Otel/lib-metrics/ExporterMetricsOltpHttp.js.map +1 -0
  90. package/dist/effect/Otel/lib-metrics/ExporterMetricsOltpWebsocket.d.ts +19 -0
  91. package/dist/effect/Otel/lib-metrics/ExporterMetricsOltpWebsocket.d.ts.map +1 -0
  92. package/dist/effect/Otel/lib-metrics/ExporterMetricsOltpWebsocket.js +17 -0
  93. package/dist/effect/Otel/lib-metrics/ExporterMetricsOltpWebsocket.js.map +1 -0
  94. package/dist/effect/Otel/lib-metrics/MetricsProvider.d.ts +10 -0
  95. package/dist/effect/Otel/lib-metrics/MetricsProvider.d.ts.map +1 -0
  96. package/dist/effect/Otel/lib-metrics/MetricsProvider.js +4 -0
  97. package/dist/effect/Otel/lib-metrics/MetricsProvider.js.map +1 -0
  98. package/dist/effect/Otel/lib-metrics/OTLPMetricsProviderGrpc.d.ts +16 -0
  99. package/dist/effect/Otel/lib-metrics/OTLPMetricsProviderGrpc.d.ts.map +1 -0
  100. package/dist/effect/Otel/lib-metrics/OTLPMetricsProviderGrpc.js +39 -0
  101. package/dist/effect/Otel/lib-metrics/OTLPMetricsProviderGrpc.js.map +1 -0
  102. package/dist/effect/Otel/lib-metrics/OTLPMetricsProviderHttp.d.ts +16 -0
  103. package/dist/effect/Otel/lib-metrics/OTLPMetricsProviderHttp.d.ts.map +1 -0
  104. package/dist/effect/Otel/lib-metrics/OTLPMetricsProviderHttp.js +39 -0
  105. package/dist/effect/Otel/lib-metrics/OTLPMetricsProviderHttp.js.map +1 -0
  106. package/dist/effect/Otel/lib-metrics/OTLPMetricsProviderWebsocket.d.ts +16 -0
  107. package/dist/effect/Otel/lib-metrics/OTLPMetricsProviderWebsocket.d.ts.map +1 -0
  108. package/dist/effect/Otel/lib-metrics/OTLPMetricsProviderWebsocket.js +39 -0
  109. package/dist/effect/Otel/lib-metrics/OTLPMetricsProviderWebsocket.js.map +1 -0
  110. package/dist/effect/Otel/lib-metrics/PeriodicMetricsProvider.d.ts +17 -0
  111. package/dist/effect/Otel/lib-metrics/PeriodicMetricsProvider.d.ts.map +1 -0
  112. package/dist/effect/Otel/lib-metrics/PeriodicMetricsProvider.js +27 -0
  113. package/dist/effect/Otel/lib-metrics/PeriodicMetricsProvider.js.map +1 -0
  114. package/dist/effect/Otel/lib-tracer/BatchSpanProcessor.d.ts +18 -0
  115. package/dist/effect/Otel/lib-tracer/BatchSpanProcessor.d.ts.map +1 -0
  116. package/dist/effect/Otel/lib-tracer/BatchSpanProcessor.js +31 -0
  117. package/dist/effect/Otel/lib-tracer/BatchSpanProcessor.js.map +1 -0
  118. package/dist/effect/Otel/lib-tracer/ExporterTraceOtlpGrpc.d.ts +19 -0
  119. package/dist/effect/Otel/lib-tracer/ExporterTraceOtlpGrpc.d.ts.map +1 -0
  120. package/dist/effect/Otel/lib-tracer/ExporterTraceOtlpGrpc.js +36 -0
  121. package/dist/effect/Otel/lib-tracer/ExporterTraceOtlpGrpc.js.map +1 -0
  122. package/dist/effect/Otel/lib-tracer/ExporterTraceOtlpHttp.d.ts +19 -0
  123. package/dist/effect/Otel/lib-tracer/ExporterTraceOtlpHttp.d.ts.map +1 -0
  124. package/dist/effect/Otel/lib-tracer/ExporterTraceOtlpHttp.js +36 -0
  125. package/dist/effect/Otel/lib-tracer/ExporterTraceOtlpHttp.js.map +1 -0
  126. package/dist/effect/Otel/lib-tracer/ExporterTraceOtlpWebsocket.d.ts +9 -0
  127. package/dist/effect/Otel/lib-tracer/ExporterTraceOtlpWebsocket.d.ts.map +1 -0
  128. package/dist/effect/Otel/lib-tracer/ExporterTraceOtlpWebsocket.js +29 -0
  129. package/dist/effect/Otel/lib-tracer/ExporterTraceOtlpWebsocket.js.map +1 -0
  130. package/dist/effect/Otel/lib-tracer/SimpleProcessor.d.ts +19 -0
  131. package/dist/effect/Otel/lib-tracer/SimpleProcessor.d.ts.map +1 -0
  132. package/dist/effect/Otel/lib-tracer/SimpleProcessor.js +25 -0
  133. package/dist/effect/Otel/lib-tracer/SimpleProcessor.js.map +1 -0
  134. package/dist/effect/Otel/lib-tracer/TracerProvider.d.ts +10 -0
  135. package/dist/effect/Otel/lib-tracer/TracerProvider.d.ts.map +1 -0
  136. package/dist/effect/Otel/lib-tracer/TracerProvider.js +7 -0
  137. package/dist/effect/Otel/lib-tracer/TracerProvider.js.map +1 -0
  138. package/dist/effect/Otel/lib-tracer/WebProvider.d.ts +18 -0
  139. package/dist/effect/Otel/lib-tracer/WebProvider.d.ts.map +1 -0
  140. package/dist/effect/Otel/lib-tracer/WebProvider.js +25 -0
  141. package/dist/effect/Otel/lib-tracer/WebProvider.js.map +1 -0
  142. package/dist/effect/ReadonlyArray.d.ts +4 -0
  143. package/dist/effect/ReadonlyArray.d.ts.map +1 -0
  144. package/dist/effect/ReadonlyArray.js +11 -0
  145. package/dist/effect/ReadonlyArray.js.map +1 -0
  146. package/dist/effect/RequestResolver.d.ts +11 -0
  147. package/dist/effect/RequestResolver.d.ts.map +1 -0
  148. package/dist/effect/RequestResolver.js +18 -0
  149. package/dist/effect/RequestResolver.js.map +1 -0
  150. package/dist/effect/STM.d.ts +3 -0
  151. package/dist/effect/STM.d.ts.map +1 -0
  152. package/dist/effect/STM.js +3 -0
  153. package/dist/effect/STM.js.map +1 -0
  154. package/dist/effect/Schedule.d.ts +5 -0
  155. package/dist/effect/Schedule.d.ts.map +1 -0
  156. package/dist/effect/Schedule.js +7 -0
  157. package/dist/effect/Schedule.js.map +1 -0
  158. package/dist/effect/Scheduler.d.ts +49 -0
  159. package/dist/effect/Scheduler.d.ts.map +1 -0
  160. package/dist/effect/Scheduler.js +168 -0
  161. package/dist/effect/Scheduler.js.map +1 -0
  162. package/dist/effect/Schema/SchemaHash.d.ts +3 -0
  163. package/dist/effect/Schema/SchemaHash.d.ts.map +1 -0
  164. package/dist/effect/Schema/SchemaHash.js +15 -0
  165. package/dist/effect/Schema/SchemaHash.js.map +1 -0
  166. package/dist/effect/Schema/SchemaHash.test.d.ts +2 -0
  167. package/dist/effect/Schema/SchemaHash.test.d.ts.map +1 -0
  168. package/dist/effect/Schema/SchemaHash.test.js +13 -0
  169. package/dist/effect/Schema/SchemaHash.test.js.map +1 -0
  170. package/dist/effect/Schema/SchemaJsonWrapper.d.ts +11 -0
  171. package/dist/effect/Schema/SchemaJsonWrapper.d.ts.map +1 -0
  172. package/dist/effect/Schema/SchemaJsonWrapper.js +38 -0
  173. package/dist/effect/Schema/SchemaJsonWrapper.js.map +1 -0
  174. package/dist/effect/Schema/SchemaJsonWrapper.test.d.ts +2 -0
  175. package/dist/effect/Schema/SchemaJsonWrapper.test.d.ts.map +1 -0
  176. package/dist/effect/Schema/SchemaJsonWrapper.test.js +42 -0
  177. package/dist/effect/Schema/SchemaJsonWrapper.test.js.map +1 -0
  178. package/dist/effect/Schema/index.d.ts +15 -0
  179. package/dist/effect/Schema/index.d.ts.map +1 -0
  180. package/dist/effect/Schema/index.js +14 -0
  181. package/dist/effect/Schema/index.js.map +1 -0
  182. package/dist/effect/ServiceContext.d.ts +39 -0
  183. package/dist/effect/ServiceContext.d.ts.map +1 -0
  184. package/dist/effect/ServiceContext.js +61 -0
  185. package/dist/effect/ServiceContext.js.map +1 -0
  186. package/dist/effect/SmartQueue.d.ts +38 -0
  187. package/dist/effect/SmartQueue.d.ts.map +1 -0
  188. package/dist/effect/SmartQueue.js +123 -0
  189. package/dist/effect/SmartQueue.js.map +1 -0
  190. package/dist/effect/Stream/chainSwitch.d.ts +3 -0
  191. package/dist/effect/Stream/chainSwitch.d.ts.map +1 -0
  192. package/dist/effect/Stream/chainSwitch.js +48 -0
  193. package/dist/effect/Stream/chainSwitch.js.map +1 -0
  194. package/dist/effect/Stream/index.d.ts +37 -0
  195. package/dist/effect/Stream/index.d.ts.map +1 -0
  196. package/dist/effect/Stream/index.js +82 -0
  197. package/dist/effect/Stream/index.js.map +1 -0
  198. package/dist/effect/SubscriptionRef.d.ts +10 -0
  199. package/dist/effect/SubscriptionRef.d.ts.map +1 -0
  200. package/dist/effect/SubscriptionRef.js +8 -0
  201. package/dist/effect/SubscriptionRef.js.map +1 -0
  202. package/dist/effect/TimeoutGate.d.ts +13 -0
  203. package/dist/effect/TimeoutGate.d.ts.map +1 -0
  204. package/dist/effect/TimeoutGate.js +41 -0
  205. package/dist/effect/TimeoutGate.js.map +1 -0
  206. package/dist/effect/WebCrypto.d.ts +18 -0
  207. package/dist/effect/WebCrypto.d.ts.map +1 -0
  208. package/dist/effect/WebCrypto.js +56 -0
  209. package/dist/effect/WebCrypto.js.map +1 -0
  210. package/dist/effect/WebLock.d.ts +5 -0
  211. package/dist/effect/WebLock.d.ts.map +1 -0
  212. package/dist/effect/WebLock.js +20 -0
  213. package/dist/effect/WebLock.js.map +1 -0
  214. package/dist/effect/browser.d.ts +19 -0
  215. package/dist/effect/browser.d.ts.map +1 -0
  216. package/dist/effect/browser.js +82 -0
  217. package/dist/effect/browser.js.map +1 -0
  218. package/dist/effect/fetch.d.ts +89 -0
  219. package/dist/effect/fetch.d.ts.map +1 -0
  220. package/dist/effect/fetch.js +142 -0
  221. package/dist/effect/fetch.js.map +1 -0
  222. package/dist/effect/index.d.ts +50 -0
  223. package/dist/effect/index.d.ts.map +1 -0
  224. package/dist/effect/index.js +58 -0
  225. package/dist/effect/index.js.map +1 -0
  226. package/dist/global.d.ts +5 -0
  227. package/dist/global.d.ts.map +1 -0
  228. package/dist/global.js +2 -0
  229. package/dist/global.js.map +1 -0
  230. package/dist/guards.d.ts +6 -0
  231. package/dist/guards.d.ts.map +1 -0
  232. package/dist/guards.js +6 -0
  233. package/dist/guards.js.map +1 -0
  234. package/dist/index.d.ts +69 -0
  235. package/dist/index.d.ts.map +1 -0
  236. package/dist/index.js +162 -0
  237. package/dist/index.js.map +1 -0
  238. package/dist/object/index.d.ts +10 -0
  239. package/dist/object/index.d.ts.map +1 -0
  240. package/dist/object/index.js +10 -0
  241. package/dist/object/index.js.map +1 -0
  242. package/dist/object/omit.d.ts +3 -0
  243. package/dist/object/omit.d.ts.map +1 -0
  244. package/dist/object/omit.js +14 -0
  245. package/dist/object/omit.js.map +1 -0
  246. package/dist/object/pick.d.ts +14 -0
  247. package/dist/object/pick.d.ts.map +1 -0
  248. package/dist/object/pick.js +17 -0
  249. package/dist/object/pick.js.map +1 -0
  250. package/dist/promise.d.ts +6 -0
  251. package/dist/promise.d.ts.map +1 -0
  252. package/dist/promise.js +27 -0
  253. package/dist/promise.js.map +1 -0
  254. package/dist/set.d.ts +2 -0
  255. package/dist/set.d.ts.map +1 -0
  256. package/dist/set.js +10 -0
  257. package/dist/set.js.map +1 -0
  258. package/dist/single-item.d.ts +8 -0
  259. package/dist/single-item.d.ts.map +1 -0
  260. package/dist/single-item.js +9 -0
  261. package/dist/single-item.js.map +1 -0
  262. package/dist/string.d.ts +3 -0
  263. package/dist/string.d.ts.map +1 -0
  264. package/dist/string.js +3 -0
  265. package/dist/string.js.map +1 -0
  266. package/dist/time.d.ts +12 -0
  267. package/dist/time.d.ts.map +1 -0
  268. package/dist/time.js +22 -0
  269. package/dist/time.js.map +1 -0
  270. package/dist/types/index.d.ts +2 -0
  271. package/dist/types/index.d.ts.map +1 -0
  272. package/dist/types/index.js +2 -0
  273. package/dist/types/index.js.map +1 -0
  274. package/dist/types/json.d.ts +27 -0
  275. package/dist/types/json.d.ts.map +1 -0
  276. package/dist/types/json.js +2 -0
  277. package/dist/types/json.js.map +1 -0
  278. package/package.json +58 -0
  279. package/src/Deferred.ts +24 -0
  280. package/src/NoopTracer.ts +75 -0
  281. package/src/base64.ts +118 -0
  282. package/src/browser.ts +32 -0
  283. package/src/effect/Effect.ts +27 -0
  284. package/src/effect/Error.ts +12 -0
  285. package/src/effect/Otel/Dummy.ts +32 -0
  286. package/src/effect/Otel/Meter.ts +145 -0
  287. package/src/effect/Otel/OtlpGrpc.ts +75 -0
  288. package/src/effect/Otel/OtlpHttp.ts +75 -0
  289. package/src/effect/Otel/OtlpWebsocket.ts +75 -0
  290. package/src/effect/Otel/Span.ts +222 -0
  291. package/src/effect/Otel/Tracer.ts +30 -0
  292. package/src/effect/Otel/index.ts +8 -0
  293. package/src/effect/Otel/lib-metrics/ExporterMetricsOltpGrpc.ts +39 -0
  294. package/src/effect/Otel/lib-metrics/ExporterMetricsOltpHttp.ts +39 -0
  295. package/src/effect/Otel/lib-metrics/ExporterMetricsOltpWebsocket.ts +47 -0
  296. package/src/effect/Otel/lib-metrics/MetricsProvider.ts +12 -0
  297. package/src/effect/Otel/lib-metrics/OTLPMetricsProviderGrpc.ts +77 -0
  298. package/src/effect/Otel/lib-metrics/OTLPMetricsProviderHttp.ts +77 -0
  299. package/src/effect/Otel/lib-metrics/OTLPMetricsProviderWebsocket.ts +80 -0
  300. package/src/effect/Otel/lib-metrics/PeriodicMetricsProvider.ts +55 -0
  301. package/src/effect/Otel/lib-tracer/BatchSpanProcessor.ts +58 -0
  302. package/src/effect/Otel/lib-tracer/ExporterTraceOtlpGrpc.ts +64 -0
  303. package/src/effect/Otel/lib-tracer/ExporterTraceOtlpHttp.ts +64 -0
  304. package/src/effect/Otel/lib-tracer/ExporterTraceOtlpWebsocket.ts +38 -0
  305. package/src/effect/Otel/lib-tracer/README.md +1 -0
  306. package/src/effect/Otel/lib-tracer/SimpleProcessor.ts +46 -0
  307. package/src/effect/Otel/lib-tracer/TracerProvider.ts +16 -0
  308. package/src/effect/Otel/lib-tracer/WebProvider.ts +48 -0
  309. package/src/effect/Schedule.ts +12 -0
  310. package/src/effect/ServiceContext.ts +116 -0
  311. package/src/effect/index.ts +65 -0
  312. package/src/global.ts +5 -0
  313. package/src/guards.ts +8 -0
  314. package/src/index.ts +217 -0
  315. package/src/object/index.ts +24 -0
  316. package/src/object/omit.ts +17 -0
  317. package/src/object/pick.ts +27 -0
  318. package/src/promise.ts +43 -0
  319. package/src/set.ts +10 -0
  320. package/src/string.ts +2 -0
  321. package/src/time.ts +25 -0
  322. package/tsconfig.json +13 -0
@@ -0,0 +1,16 @@
1
+ import * as Context from '@effect/data/Context'
2
+ import type { BasicTracerProvider } from '@opentelemetry/sdk-trace-base'
3
+
4
+ //
5
+ // ets_tracing Provider
6
+ //
7
+
8
+ export const TracerProviderSymbol = Symbol.for('effect-otel/TracerProvider')
9
+ export type TracerProviderSymbol = typeof TracerProviderSymbol
10
+
11
+ export interface TracerProvider {
12
+ readonly [TracerProviderSymbol]: TracerProviderSymbol
13
+ readonly tracerProvider: BasicTracerProvider
14
+ }
15
+
16
+ export const TracerProvider = Context.Tag<TracerProvider>(TracerProviderSymbol)
@@ -0,0 +1,48 @@
1
+ import * as Context from '@effect/data/Context'
2
+ import { identity, pipe } from '@effect/data/Function'
3
+ import * as Option from '@effect/data/Option'
4
+ import * as Effect from '@effect/io/Effect'
5
+ import * as Layer from '@effect/io/Layer'
6
+ import type { WebTracerConfig } from '@opentelemetry/sdk-trace-web'
7
+ import { WebTracerProvider } from '@opentelemetry/sdk-trace-web'
8
+
9
+ import { TracerProvider, TracerProviderSymbol } from './TracerProvider.js'
10
+
11
+ export const WebTracerProviderConfigSymbol = Symbol.for('effect-otel/WebTracerProviderConfig')
12
+ type WebTracerProviderConfigSymbol = typeof WebTracerProviderConfigSymbol
13
+
14
+ export interface WebTracerProviderConfig {
15
+ [WebTracerProviderConfigSymbol]: WebTracerProviderConfigSymbol
16
+
17
+ readonly config: WebTracerConfig
18
+ }
19
+
20
+ export const WebTracerProviderConfig = Context.Tag<WebTracerProviderConfig>(WebTracerProviderConfigSymbol)
21
+
22
+ export const LiveWebTracerProviderConfig = (config: WebTracerConfig) =>
23
+ Layer.succeed(WebTracerProviderConfig, {
24
+ [WebTracerProviderConfigSymbol]: WebTracerProviderConfigSymbol,
25
+ config,
26
+ })
27
+
28
+ export const makeWebTracingProvider = Effect.gen(function* ($) {
29
+ const ctx = yield* $(Effect.context<never>())
30
+
31
+ const config = pipe(
32
+ Context.getOption(ctx, WebTracerProviderConfig),
33
+ Option.map((_) => _.config),
34
+ Option.getOrUndefined,
35
+ )
36
+
37
+ const tracerProvider = yield* $(Effect.sync(() => new WebTracerProvider(config)))
38
+
39
+ return identity<TracerProvider>({
40
+ [TracerProviderSymbol]: TracerProviderSymbol,
41
+ tracerProvider,
42
+ })
43
+ })
44
+
45
+ export const WebProviderLayer = Layer.scoped(TracerProvider, makeWebTracingProvider)
46
+
47
+ export const WebProvider = (config?: WebTracerConfig) =>
48
+ config ? Layer.provide(LiveWebTracerProviderConfig(config), WebProviderLayer) : WebProviderLayer
@@ -0,0 +1,12 @@
1
+ import * as Duration from '@effect/data/Duration'
2
+ import { pipe } from '@effect/data/Function'
3
+ import * as Schedule from '@effect/io/Schedule'
4
+
5
+ export * from '@effect/io/Schedule'
6
+
7
+ export const exponentialBackoff10Sec: Schedule.Schedule<never, unknown, Duration.DurationInput> = pipe(
8
+ Schedule.exponential(Duration.millis(10), 4), // 10ms, 40ms, 160ms, 640ms, 2560ms, ...
9
+ Schedule.andThenEither(Schedule.spaced(Duration.seconds(1))),
10
+ Schedule.compose(Schedule.elapsed),
11
+ Schedule.whileOutput(Duration.lessThanOrEqualTo(Duration.seconds(10))), // max 10 seconds
12
+ )
@@ -0,0 +1,116 @@
1
+ import { pipe } from '@effect/data/Function'
2
+ import * as Cause from '@effect/io/Cause'
3
+ import * as Effect from '@effect/io/Effect'
4
+ import * as Exit from '@effect/io/Exit'
5
+ import * as Fiber from '@effect/io/Fiber'
6
+ import * as Layer from '@effect/io/Layer'
7
+ import type * as Runtime from '@effect/io/Runtime'
8
+ import * as Scope from '@effect/io/Scope'
9
+
10
+ export interface MainLayer<Ctx> {
11
+ layer: Layer.Layer<never, never, Ctx>
12
+ close: Effect.Effect<never, never, void>
13
+ }
14
+
15
+ export const unsafeMainLayer = <Ctx>(original: Layer.Layer<never, never, Ctx>): MainLayer<Ctx> => {
16
+ const scope = Effect.runSync(Scope.make())
17
+ const layer = pipe(
18
+ original,
19
+ Layer.memoize,
20
+ Effect.parallelFinalizers, // NOTE this runs the layer teardown in parallel
21
+ Effect.provideService(Scope.Scope, scope),
22
+ Effect.runSync,
23
+ )
24
+ return { layer, close: Scope.close(scope, Exit.unit) }
25
+ }
26
+
27
+ export const make = <TStaticData, Ctx>(
28
+ staticData: TStaticData,
29
+ runtime: Runtime.Runtime<Ctx>,
30
+ close: Effect.Effect<never, never, void> = Effect.dieMessage('close not implemented'),
31
+ ): ServiceContext<Ctx, TStaticData> => {
32
+ return {
33
+ provide: (self) => Effect.provideSomeRuntime(runtime)(self),
34
+ runWithErrorLog: <E, A>(self: Effect.Effect<Ctx, E, A>) =>
35
+ runWithErrorLog(Effect.provideSomeRuntime(runtime)(self)),
36
+ runSync: <E, A>(self: Effect.Effect<Ctx, E, A>) => Effect.runSync(Effect.provideSomeRuntime(runtime)(self)),
37
+ runPromiseWithErrorLog: <E, A>(self: Effect.Effect<Ctx, E, A>) =>
38
+ runPromiseWithErrorLog(Effect.provideSomeRuntime(runtime)(self)),
39
+ runPromiseExit: <E, A>(self: Effect.Effect<Ctx, E, A>) =>
40
+ Effect.runPromiseExit(Effect.provideSomeRuntime(runtime)(self)),
41
+ runPromise: <E, A>(self: Effect.Effect<Ctx, E, A>) => Effect.runPromise(Effect.provideSomeRuntime(runtime)(self)),
42
+ withRuntime: (fn) => fn(runtime),
43
+ close: close,
44
+ closePromise: () => Effect.runPromise(close),
45
+ staticData,
46
+ }
47
+ }
48
+
49
+ export interface ServiceContext<Ctx, TStaticData> {
50
+ readonly provide: <E, A>(self: Effect.Effect<Ctx, E, A>) => Effect.Effect<never, E, A>
51
+
52
+ /**
53
+ * Fire and Forget. Errors are logged however.
54
+ */
55
+ readonly runWithErrorLog: <E, A>(self: Effect.Effect<Ctx, E, A>) => AbortCallback
56
+
57
+ readonly runSync: <E, A>(self: Effect.Effect<Ctx, E, A>) => A
58
+
59
+ /**
60
+ * Fire and Forget. A promise that never fails nor returns any value.
61
+ * Errors are logged however.
62
+ */
63
+ readonly runPromiseWithErrorLog: <E, A>(self: Effect.Effect<Ctx, E, A>) => Promise<A | undefined>
64
+
65
+ /**
66
+ * A Promise that never fails, the Resolved value is an Exit result that can be either Success or Failed
67
+ */
68
+ readonly runPromiseExit: <E, A>(self: Effect.Effect<Ctx, E, A>) => Promise<Exit.Exit<E, A>>
69
+ readonly runPromise: <E, A>(self: Effect.Effect<Ctx, E, A>) => Promise<A>
70
+
71
+ readonly withRuntime: (fn: (runtime: Runtime.Runtime<Ctx>) => void) => void
72
+
73
+ /** Closes the ServiceContext and closing all its layers */
74
+ readonly close: Effect.Effect<never, never, void>
75
+ readonly closePromise: () => Promise<void>
76
+ readonly staticData: TStaticData
77
+ }
78
+
79
+ export type AbortCallback = () => void
80
+
81
+ export const runWithErrorLog = <E, A>(self: Effect.Effect<never, E, A>) => {
82
+ const fiber = Effect.runFork(self)
83
+ fiber.unsafeAddObserver((ex) => {
84
+ if (ex._tag === 'Failure' && Cause.isInterruptedOnly(ex.cause) === false) {
85
+ console.error(Cause.pretty(ex.cause))
86
+ }
87
+ })
88
+ return () => {
89
+ Effect.runFork(Fiber.interrupt(fiber))
90
+ }
91
+ }
92
+
93
+ export const runPromiseWithErrorLog = <E, A>(self: Effect.Effect<never, E, A>) =>
94
+ Effect.runPromiseExit(self).then((ex) => {
95
+ if (ex._tag === 'Failure') {
96
+ console.error(Cause.pretty(ex.cause))
97
+ return undefined
98
+ } else {
99
+ return ex.value
100
+ }
101
+ })
102
+
103
+ export const MissingContext = Effect.die('service context not provided, wrap your app in LiveServiceContext')
104
+
105
+ export const empty = <Ctx, TStaticData>(): ServiceContext<Ctx, TStaticData> => ({
106
+ provide: () => MissingContext,
107
+ runWithErrorLog: () => runWithErrorLog(MissingContext),
108
+ runSync: () => Effect.runSync(MissingContext),
109
+ runPromiseWithErrorLog: () => runPromiseWithErrorLog(MissingContext),
110
+ runPromiseExit: () => Effect.runPromiseExit(MissingContext),
111
+ runPromise: () => Effect.runPromise(MissingContext),
112
+ withRuntime: () => Effect.runSync(MissingContext),
113
+ close: Effect.dieMessage('Empty ServiceContext cannot be closed'),
114
+ closePromise: () => Promise.reject('Empty ServiceContext cannot be closed'),
115
+ staticData: {} as TStaticData,
116
+ })
@@ -0,0 +1,65 @@
1
+ import '../global.js'
2
+
3
+ // io
4
+ export * as Effect from './Effect.js'
5
+ export * as Scope from '@effect/io/Scope'
6
+ export * as Schedule from './Schedule.js'
7
+ export * as Layer from '@effect/io/Layer'
8
+ export * as Ref from '@effect/io/Ref'
9
+ export * as SynchronizedRef from '@effect/io/SynchronizedRef'
10
+ export * as Queue from '@effect/io/Queue'
11
+ export * as Fiber from '@effect/io/Fiber'
12
+ export * as FiberId from '@effect/io/FiberId'
13
+ export * as RuntimeFlags from '@effect/io/RuntimeFlags'
14
+ export * as Hub from '@effect/io/Hub'
15
+ export * as Exit from '@effect/io/Exit'
16
+ export * as Cause from '@effect/io/Cause'
17
+ export * as Runtime from '@effect/io/Runtime'
18
+ export * as Scheduler from '@effect/io/Scheduler'
19
+ export * as FiberRef from '@effect/io/FiberRef'
20
+ export * as FiberRefs from '@effect/io/FiberRefs'
21
+ export * as FiberRefsPatch from '@effect/io/FiberRefsPatch'
22
+ export * as Deferred from '@effect/io/Deferred'
23
+ export * as Metric from '@effect/io/Metric'
24
+ export * as MetricState from '@effect/io/MetricState'
25
+ export * as Request from '@effect/io/Request'
26
+
27
+ // data
28
+ export * as Context from '@effect/data/Context'
29
+ export * as Data from '@effect/data/Data'
30
+ export { TaggedClass as Tagged } from '@effect/data/Data'
31
+ export * as Either from '@effect/data/Either'
32
+ export * as Brand from '@effect/data/Brand'
33
+ export * as Hash from '@effect/data/Hash'
34
+ export * as Equal from '@effect/data/Equal'
35
+ export * as Ord from '@effect/data/Order'
36
+ export * as Chunk from '@effect/data/Chunk'
37
+ export * as Duration from '@effect/data/Duration'
38
+ export * as ReadonlyArray from '@effect/data/ReadonlyArray'
39
+ export * as ReadonlyRecord from '@effect/data/ReadonlyRecord'
40
+ export * as SortedMap from '@effect/data/SortedMap'
41
+ export * as HashMap from '@effect/data/HashMap'
42
+ export * as HashSet from '@effect/data/HashSet'
43
+ export * as MutableHashSet from '@effect/data/MutableHashSet'
44
+ export * as Option from '@effect/data/Option'
45
+ export { pipe, identity } from '@effect/data/Function'
46
+
47
+ // stream
48
+ export * as Stream from '@effect/stream/Stream'
49
+ export * as Channel from '@effect/stream/Channel'
50
+ export * as SubscriptionRef from '@effect/stream/SubscriptionRef'
51
+
52
+ // schema
53
+ export * as Schema from '@effect/schema/Schema'
54
+
55
+ // match
56
+ export * as Match from '@effect/match'
57
+
58
+ // otel
59
+ export * as Otel from './Otel/index.js'
60
+
61
+ // error
62
+ export * from './Error.js'
63
+
64
+ // ServiceContext
65
+ export * as ServiceContext from './ServiceContext.js'
package/src/global.ts ADDED
@@ -0,0 +1,5 @@
1
+ declare global {
2
+ export type TODO = any
3
+ }
4
+
5
+ export {}
package/src/guards.ts ADDED
@@ -0,0 +1,8 @@
1
+ export const isNotUndefined = <T>(_: T | undefined): _ is T => _ !== undefined
2
+
3
+ export const isNotNull = <T>(_: T | null): _ is T => _ !== null
4
+ export const isUndefined = <T>(_: T | undefined): _ is undefined => _ === undefined
5
+
6
+ export const isNil = (val: any): val is null | undefined => val === null || val === undefined
7
+
8
+ export const isNotNil = <T>(val: T | undefined | null): val is T => val !== null && val !== undefined
package/src/index.ts ADDED
@@ -0,0 +1,217 @@
1
+ export * from './string.js'
2
+ export * from './guards.js'
3
+ export * from './object/index.js'
4
+ export * from './promise.js'
5
+ export * from './time.js'
6
+ export * from './NoopTracer.js'
7
+ export * from './set.js'
8
+ export * from './browser.js'
9
+ export * from './Deferred.js'
10
+ export * as base64 from './base64.js'
11
+ export { default as prettyBytes } from 'pretty-bytes'
12
+
13
+ export { v4 as uuid } from 'uuid'
14
+
15
+ import type * as otel from '@opentelemetry/api'
16
+
17
+ export * as dateFns from 'date-fns'
18
+
19
+ export type Prettify<T> = T extends infer U ? { [K in keyof U]: Prettify<U[K]> } : never
20
+ export type PrettifyFlat<T> = T extends infer U ? { [K in keyof U]: U[K] } : never
21
+
22
+ export type TypeEq<A, B> = (<T>() => T extends A ? 1 : 2) extends <T>() => T extends B ? 1 : 2 ? true : false
23
+
24
+ /** `A` is subtype of `B` */
25
+ export type IsSubtype<A, B> = A extends B ? true : false
26
+ export type AssertTrue<T extends true> = T
27
+
28
+ export type Writeable<T> = { -readonly [P in keyof T]: T[P] }
29
+ export type DeepWriteable<T> = { -readonly [P in keyof T]: DeepWriteable<T[P]> }
30
+
31
+ export type Primitive = null | undefined | string | number | boolean | symbol | bigint
32
+
33
+ export type LiteralUnion<LiteralType, BaseType extends Primitive> = LiteralType | (BaseType & Record<never, never>)
34
+
35
+ export const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms))
36
+
37
+ export const times = (n: number, fn: (index: number) => {}): void => {
38
+ for (let i = 0; i < n; i++) {
39
+ fn(i)
40
+ }
41
+ }
42
+
43
+ export const debugCatch = <T>(try_: () => T): T => {
44
+ try {
45
+ return try_()
46
+ } catch (e: any) {
47
+ debugger
48
+ throw e
49
+ }
50
+ }
51
+
52
+ export const recRemoveUndefinedValues = (val: any): void => {
53
+ if (Array.isArray(val)) {
54
+ val.forEach(recRemoveUndefinedValues)
55
+ } else if (typeof val === 'object') {
56
+ Object.keys(val).forEach((key) => {
57
+ if (val[key] === undefined) {
58
+ delete val[key]
59
+ } else {
60
+ recRemoveUndefinedValues(val[key])
61
+ }
62
+ })
63
+ }
64
+ }
65
+
66
+ export const debugDeepCopy = <T>(val: T): T => JSON.parse(JSON.stringify(val))
67
+
68
+ export const prop =
69
+ <T extends {}, K extends keyof T>(key: K) =>
70
+ (obj: T): T[K] =>
71
+ obj[key]
72
+
73
+ export const objectToString = (error: any): string => {
74
+ const stack = typeof process !== 'undefined' && process.env.CL_DEBUG ? error.stack : undefined
75
+ const str = error.toString()
76
+ const stackStr = stack ? `\n${stack}` : ''
77
+ if (str !== '[object Object]') return str + stackStr
78
+
79
+ try {
80
+ return JSON.stringify({ ...error, stack }, null, 2)
81
+ } catch (e: any) {
82
+ console.log(error)
83
+
84
+ return 'Error while printing error: ' + e
85
+ }
86
+ }
87
+
88
+ export const errorToString = objectToString
89
+
90
+ export const capitalizeFirstLetter = (str: string): string => str.charAt(0).toUpperCase() + str.slice(1)
91
+
92
+ /**
93
+ * Use this to make assertion at end of if-else chain that all members of a
94
+ * union have been accounted for.
95
+ */
96
+ /* eslint-disable-next-line prefer-arrow/prefer-arrow-functions */
97
+ export function casesHandled(unexpectedCase: never): never {
98
+ debugger
99
+ throw new Error(`A case was not handled for value: ${truncate(objectToString(unexpectedCase), 1000)}`)
100
+ }
101
+
102
+ export const shouldNeverHappen = (msg?: string): never => {
103
+ debugger
104
+ throw new Error(`This should never happen ${msg}`)
105
+ }
106
+
107
+ export const assertNever = (failIfFalse: boolean, msg?: string): void => {
108
+ if (failIfFalse === false) {
109
+ debugger
110
+ throw new Error(`This should never happen ${msg}`)
111
+ }
112
+ }
113
+
114
+ export const debuggerPipe = <T>(val: T): T => {
115
+ debugger
116
+ return val
117
+ }
118
+
119
+ const truncate = (str: string, length: number): string => {
120
+ if (str.length > length) {
121
+ return str.slice(0, length) + '...'
122
+ } else {
123
+ return str
124
+ }
125
+ }
126
+
127
+ export const notYetImplemented = (msg?: string): never => {
128
+ debugger
129
+ throw new Error(`Not yet implemented ${msg}`)
130
+ }
131
+
132
+ export const noop = () => {}
133
+
134
+ export type Thunk<T> = () => T
135
+
136
+ export const unwrapThunk = <T>(_: T | (() => T)): T => {
137
+ if (typeof _ === 'function') {
138
+ return (_ as any)()
139
+ } else {
140
+ return _
141
+ }
142
+ }
143
+
144
+ export type NullableFieldsToOptional<T> = PrettifyFlat<
145
+ Partial<T> & {
146
+ [K in keyof T as null extends T[K] ? K : never]?: Exclude<T[K], null>
147
+ } & {
148
+ [K in keyof T as null extends T[K] ? never : K]: T[K]
149
+ }
150
+ >
151
+
152
+ /** `end` is not included */
153
+ export const range = (start: number, end: number): number[] => {
154
+ const length = end - start
155
+ return Array.from({ length }, (_, i) => start + i)
156
+ }
157
+
158
+ export const throttle = (fn: () => void, ms: number) => {
159
+ let shouldWait = false
160
+ let shouldCallAgain = false
161
+
162
+ const timeoutFunc = () => {
163
+ if (shouldCallAgain) {
164
+ fn()
165
+ shouldCallAgain = false
166
+ setTimeout(timeoutFunc, ms)
167
+ } else {
168
+ shouldWait = false
169
+ }
170
+ }
171
+
172
+ return () => {
173
+ if (shouldWait) {
174
+ shouldCallAgain = true
175
+ return
176
+ }
177
+
178
+ fn()
179
+ shouldWait = true
180
+ setTimeout(timeoutFunc, ms)
181
+ }
182
+ }
183
+
184
+ export const getTraceParentHeader = (parentSpan: otel.Span) => {
185
+ const spanContext = parentSpan.spanContext()
186
+ // Format: {version}-{trace_id}-{span_id}-{trace_flags}
187
+ // https://www.w3.org/TR/trace-context/#examples-of-http-traceparent-headers
188
+ return `00-${spanContext.traceId}-${spanContext.spanId}-01`
189
+ }
190
+
191
+ export const assertTag = <TObj extends { _tag: string }, TTag extends TObj['_tag']>(
192
+ obj: TObj,
193
+ tag: TTag,
194
+ ): Extract<TObj, { _tag: TTag }> => {
195
+ if (obj._tag !== tag) {
196
+ throw new Error(`Expected tag ${tag} but got ${obj._tag}`)
197
+ }
198
+
199
+ return obj as any
200
+ }
201
+
202
+ export const getEnv = (varName: string) => {
203
+ let value: string | undefined
204
+
205
+ // @ts-expect-error `import.meta.env` might not be defined
206
+ if (import.meta.env !== undefined) {
207
+ // @ts-expect-error `import.meta.env` might not be defined
208
+ value = import.meta.env[varName]
209
+ // eslint-disable-next-line unicorn/no-negated-condition
210
+ } else if (globalThis.process?.env !== undefined) {
211
+ value = globalThis.process.env[varName]
212
+ } else {
213
+ throw new Error(`No environment variables found (neither import.meta.env nor process.env)`)
214
+ }
215
+
216
+ return value
217
+ }
@@ -0,0 +1,24 @@
1
+ import { pipe } from '@effect/data/Function'
2
+
3
+ export * from './pick.js'
4
+ export * from './omit.js'
5
+
6
+ type ValueOfRecord<R extends Record<any, any>> = R extends Record<any, infer V> ? V : never
7
+
8
+ export const mapObjectValues = <O_In extends Record<string, any>, V_Out>(
9
+ obj: O_In,
10
+ mapValue: (key: keyof O_In, val: ValueOfRecord<O_In>) => V_Out,
11
+ ): { [K in keyof O_In]: V_Out } => {
12
+ const mappedEntries = Object.entries(obj).map(([key, val]) => [key, mapValue(key as keyof O_In, val)] as const)
13
+ return Object.fromEntries(mappedEntries) as any
14
+ }
15
+
16
+ export type Entries<T> = { [K in keyof T]: [K, T[K]] }[keyof T][]
17
+
18
+ export const objectEntries = <T extends Record<string, any>>(obj: T): Entries<T> => Object.entries(obj) as Entries<T>
19
+
20
+ export const keyObjectFromObject = <TObj extends Record<string, any>>(obj: TObj): { [K in keyof TObj]: K } =>
21
+ pipe(
22
+ objectEntries(obj).map(([k]) => [k, k]),
23
+ Object.fromEntries,
24
+ ) as any
@@ -0,0 +1,17 @@
1
+ // type ConvertUndefined<T> = OrUndefined<{ [K in keyof T as undefined extends T[K] ? K : never]-?: T[K] }>
2
+ // type OrUndefined<T> = { [K in keyof T]: T[K] | undefined }
3
+ // type PickRequired<T> = { [K in keyof T as undefined extends T[K] ? never : K]: T[K] }
4
+ // type ConvertPick<T> = ConvertUndefined<T> & PickRequired<T>
5
+
6
+ /** Returns a shallowly cloned object with the provided keys omitted */
7
+ export const omit = <Obj extends Record<string, any>, Keys extends keyof Obj>(
8
+ obj: Obj,
9
+ keys: Keys[],
10
+ ): Omit<Obj, Keys> => {
11
+ return Object.keys(obj).reduce((acc, key: any) => {
12
+ if (!keys.includes(key)) {
13
+ acc[key] = (obj as any)[key]
14
+ }
15
+ return acc
16
+ }, {} as any)
17
+ }
@@ -0,0 +1,27 @@
1
+ type ConvertUndefined<T> = OrUndefined<{ [K in keyof T as undefined extends T[K] ? K : never]-?: T[K] }>
2
+ type OrUndefined<T> = { [K in keyof T]: T[K] | undefined }
3
+ type PickRequired<T> = { [K in keyof T as undefined extends T[K] ? never : K]: T[K] }
4
+ type ConvertPick<T> = ConvertUndefined<T> & PickRequired<T>
5
+
6
+ export const pick = <Obj, Keys extends keyof Obj>(obj: Obj, keys: Keys[]): ConvertPick<{ [K in Keys]: Obj[K] }> => {
7
+ return keys.reduce((acc, key) => {
8
+ acc[key] = obj[key]
9
+ return acc
10
+ }, {} as any)
11
+ }
12
+
13
+ export const pickAllOrElse = <Obj, Keys extends keyof Obj, TElse>(
14
+ obj: Obj,
15
+ keys: Keys[],
16
+ elseValue: TElse,
17
+ ): ConvertPick<{ [K in Keys]: NonNullable<Obj[K]> }> | TElse => {
18
+ const ret = {} as any
19
+ for (const key of keys) {
20
+ if (obj[key] === undefined) {
21
+ return elseValue
22
+ }
23
+ ret[key] = obj[key]
24
+ }
25
+
26
+ return ret
27
+ }
package/src/promise.ts ADDED
@@ -0,0 +1,43 @@
1
+ /** Promise.all + Array.map */
2
+ export const promiseMap = <T, Res>(arr: T[], map: (el: T, index?: number) => Res | Promise<Res>) =>
3
+ Promise.all(arr.map(map))
4
+
5
+ export const promiseMapDict = async <T, Res>(
6
+ dict: Record<string, T>,
7
+ map: (el: T, index?: number) => Res | Promise<Res>,
8
+ ): Promise<Record<string, Res>> => {
9
+ const mappedEntries = await Promise.all(Object.entries(dict).map(async ([key, val]) => [key, await map(val)]))
10
+ return Object.fromEntries(mappedEntries)
11
+ }
12
+
13
+ export const promiseMapToDict = async <T, Res>(
14
+ arr: T[],
15
+ mapValue: (el: T, index?: number) => Res | Promise<Res>,
16
+ mapKey: (el: T, index?: number) => string,
17
+ ): Promise<Record<string, Res>> => {
18
+ const mappedEntries = await Promise.all(arr.map(async (el, index) => [mapKey(el, index), await mapValue(el, index)]))
19
+
20
+ return Object.fromEntries(mappedEntries)
21
+ }
22
+
23
+ export const promiseMapPool = async <T, Res>(
24
+ arr: T[],
25
+ map: (el: T, index?: number) => Promise<Res>,
26
+ poolLimit: number,
27
+ ): Promise<Res[]> => {
28
+ const ret: Promise<Res>[] = []
29
+ const executing: Promise<Res>[] = []
30
+ for (const [index, item] of arr.entries()) {
31
+ const p = Promise.resolve().then(() => map(item, index))
32
+ ret.push(p)
33
+
34
+ if (poolLimit <= arr.length) {
35
+ const e: any = p.then(() => executing.splice(executing.indexOf(e), 1))
36
+ executing.push(e)
37
+ if (executing.length >= poolLimit) {
38
+ await Promise.race(executing)
39
+ }
40
+ }
41
+ }
42
+ return Promise.all(ret)
43
+ }
package/src/set.ts ADDED
@@ -0,0 +1,10 @@
1
+ export const difference = <T>(a: Set<T>, b: Set<T>) => {
2
+ const diff = new Set<T>()
3
+ for (const item of a) {
4
+ if (!b.has(item)) {
5
+ diff.add(item)
6
+ }
7
+ }
8
+
9
+ return diff
10
+ }
package/src/string.ts ADDED
@@ -0,0 +1,2 @@
1
+ export const lowercaseFirstChar = (str: string) => str.charAt(0).toLowerCase() + str.slice(1)
2
+ export const uppercaseFirstChar = (str: string) => str.charAt(0).toUpperCase() + str.slice(1)
package/src/time.ts ADDED
@@ -0,0 +1,25 @@
1
+ export const minuteInMs = 1000 * 60
2
+
3
+ export const time = {
4
+ ms: 1,
5
+ sec: 1000,
6
+ min: 60 * 1000,
7
+ hour: 60 * 60 * 1000,
8
+ day: 24 * 60 * 60 * 1000,
9
+ week: 7 * 24 * 60 * 60 * 1000,
10
+ }
11
+
12
+ /** Returns a string of format `m:ss` / `mm:ss` / `h:mm:ss` / ... */
13
+ export const msAsTimeString = (ms: number) => {
14
+ const seconds = Math.floor(ms / 1000)
15
+ const minutes = Math.floor(seconds / 60)
16
+ const hours = Math.floor(minutes / 60)
17
+ const remainingSeconds = (seconds % 60).toString().padStart(2, '0')
18
+ const remainingMinutes = hours > 0 ? (minutes % 60).toString().padStart(2, '0') : minutes % 60
19
+
20
+ const timeString = [hours > 0 ? `${hours}:` : '', `${remainingMinutes}:`, `${remainingSeconds}`]
21
+ .filter((val) => val !== '')
22
+ .join('')
23
+
24
+ return timeString
25
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,13 @@
1
+ {
2
+ "extends": "../../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "module": "ES2020",
5
+ "rootDir": "./src",
6
+ "outDir": "./dist",
7
+ "tsBuildInfoFile": "./dist/.tsbuildinfo.json"
8
+ },
9
+ "include": [
10
+ "./src"
11
+ ],
12
+ "references": []
13
+ }