@effect-app/infra 0.198.2 → 0.199.2

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 (360) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/_cjs/RequestContext.cjs +14 -9
  3. package/_cjs/RequestContext.cjs.map +1 -1
  4. package/_cjs/_ext/Array.cjs +3 -7
  5. package/_cjs/_ext/Array.cjs.map +1 -1
  6. package/_cjs/api/reportError.cjs +3 -6
  7. package/_cjs/api/reportError.cjs.map +1 -1
  8. package/_cjs/api/routing/base.cjs +27 -61
  9. package/_cjs/api/routing/base.cjs.map +1 -1
  10. package/_cjs/api/routing/defaultErrorHandler.cjs +14 -21
  11. package/_cjs/api/routing/defaultErrorHandler.cjs.map +1 -1
  12. package/_cjs/api/routing/makeRequestHandler.cjs +44 -51
  13. package/_cjs/api/routing/makeRequestHandler.cjs.map +1 -1
  14. package/_cjs/api/routing/match.cjs +6 -13
  15. package/_cjs/api/routing/match.cjs.map +1 -1
  16. package/_cjs/api/{express → routing}/schema/jwt.cjs +3 -4
  17. package/_cjs/api/routing/schema/jwt.cjs.map +1 -0
  18. package/_cjs/api/routing/schema/routing.cjs +136 -0
  19. package/_cjs/api/routing/schema/routing.cjs.map +1 -0
  20. package/_cjs/api/setupRequest.cjs +16 -22
  21. package/_cjs/api/setupRequest.cjs.map +1 -1
  22. package/_cjs/errorReporter.cjs +16 -17
  23. package/_cjs/errorReporter.cjs.map +1 -1
  24. package/_cjs/errors.cjs +2 -4
  25. package/_cjs/errors.cjs.map +1 -1
  26. package/_cjs/filter/types/path/index.cjs +0 -2
  27. package/_cjs/filter/types/path/index.cjs.map +1 -1
  28. package/_cjs/filter.cjs +35 -0
  29. package/_cjs/filter.cjs.map +1 -1
  30. package/_cjs/logger/jsonLogger.cjs +9 -15
  31. package/_cjs/logger/jsonLogger.cjs.map +1 -1
  32. package/_cjs/logger/logFmtLogger.cjs +7 -11
  33. package/_cjs/logger/logFmtLogger.cjs.map +1 -1
  34. package/_cjs/logger/shared.cjs +6 -8
  35. package/_cjs/logger/shared.cjs.map +1 -1
  36. package/_cjs/rateLimit.cjs +9 -12
  37. package/_cjs/rateLimit.cjs.map +1 -1
  38. package/_cjs/services/Emailer/Sendgrid.cjs +9 -16
  39. package/_cjs/services/Emailer/Sendgrid.cjs.map +1 -1
  40. package/_cjs/services/Emailer/fake.cjs +5 -8
  41. package/_cjs/services/Emailer/fake.cjs.map +1 -1
  42. package/_cjs/services/Emailer/service.cjs +2 -4
  43. package/_cjs/services/Emailer/service.cjs.map +1 -1
  44. package/_cjs/services/Operations/live.cjs +29 -42
  45. package/_cjs/services/Operations/live.cjs.map +1 -1
  46. package/_cjs/services/Operations/service.cjs +15 -15
  47. package/_cjs/services/Operations/service.cjs.map +1 -1
  48. package/_cjs/services/QueueMaker/errors.cjs +8 -12
  49. package/_cjs/services/QueueMaker/errors.cjs.map +1 -1
  50. package/_cjs/services/QueueMaker/memQueue.cjs +27 -33
  51. package/_cjs/services/QueueMaker/memQueue.cjs.map +1 -1
  52. package/_cjs/services/QueueMaker/sbqueue.cjs +31 -40
  53. package/_cjs/services/QueueMaker/sbqueue.cjs.map +1 -1
  54. package/_cjs/services/QueueMaker/service.cjs +7 -9
  55. package/_cjs/services/QueueMaker/service.cjs.map +1 -1
  56. package/_cjs/services/Repository/dsl.cjs +11 -14
  57. package/_cjs/services/Repository/dsl.cjs.map +1 -1
  58. package/_cjs/services/Repository/ext.cjs +62 -71
  59. package/_cjs/services/Repository/ext.cjs.map +1 -1
  60. package/_cjs/services/RepositoryBase.cjs +212 -197
  61. package/_cjs/services/RepositoryBase.cjs.map +1 -1
  62. package/_cjs/services/RequestContextContainer.cjs +17 -23
  63. package/_cjs/services/RequestContextContainer.cjs.map +1 -1
  64. package/_cjs/services/Store/ContextMapContainer.cjs +10 -16
  65. package/_cjs/services/Store/ContextMapContainer.cjs.map +1 -1
  66. package/_cjs/services/Store/Cosmos/query.cjs +5 -9
  67. package/_cjs/services/Store/Cosmos/query.cjs.map +1 -1
  68. package/_cjs/services/Store/Cosmos.cjs +58 -68
  69. package/_cjs/services/Store/Cosmos.cjs.map +1 -1
  70. package/_cjs/services/Store/Disk.cjs +34 -36
  71. package/_cjs/services/Store/Disk.cjs.map +1 -1
  72. package/_cjs/services/Store/Memory.cjs +55 -65
  73. package/_cjs/services/Store/Memory.cjs.map +1 -1
  74. package/_cjs/services/Store/codeFilter.cjs +2 -4
  75. package/_cjs/services/Store/codeFilter.cjs.map +1 -1
  76. package/_cjs/services/Store/codeFilter.test.cjs +13 -12
  77. package/_cjs/services/Store/codeFilter.test.cjs.map +1 -1
  78. package/_cjs/services/Store/filterApi/query.cjs +2 -4
  79. package/_cjs/services/Store/filterApi/query.cjs.map +1 -1
  80. package/_cjs/services/Store/index.cjs +6 -9
  81. package/_cjs/services/Store/index.cjs.map +1 -1
  82. package/_cjs/services/Store/service.cjs +5 -7
  83. package/_cjs/services/Store/service.cjs.map +1 -1
  84. package/_cjs/services/Store/utils.cjs +16 -20
  85. package/_cjs/services/Store/utils.cjs.map +1 -1
  86. package/_cjs/services/query.cjs +4 -1
  87. package/_cjs/services/query.cjs.map +1 -1
  88. package/_cjs/test.arbs.cjs +3 -4
  89. package/_cjs/test.arbs.cjs.map +1 -1
  90. package/dist/RequestContext.d.ts +20 -20
  91. package/dist/RequestContext.d.ts.map +1 -1
  92. package/dist/RequestContext.js +15 -8
  93. package/dist/_ext/Array.d.ts +2 -3
  94. package/dist/_ext/Array.d.ts.map +1 -1
  95. package/dist/_ext/Array.js +5 -5
  96. package/dist/api/reportError.d.ts +5 -5
  97. package/dist/api/reportError.d.ts.map +1 -1
  98. package/dist/api/reportError.js +6 -6
  99. package/dist/api/routing/base.d.ts +11 -15
  100. package/dist/api/routing/base.d.ts.map +1 -1
  101. package/dist/api/routing/base.js +48 -67
  102. package/dist/api/routing/defaultErrorHandler.d.ts +4 -6
  103. package/dist/api/routing/defaultErrorHandler.d.ts.map +1 -1
  104. package/dist/api/routing/defaultErrorHandler.js +26 -28
  105. package/dist/api/routing/makeRequestHandler.d.ts +6 -7
  106. package/dist/api/routing/makeRequestHandler.d.ts.map +1 -1
  107. package/dist/api/routing/makeRequestHandler.js +69 -59
  108. package/dist/api/routing/match.d.ts +7 -8
  109. package/dist/api/routing/match.d.ts.map +1 -1
  110. package/dist/api/routing/match.js +7 -11
  111. package/dist/api/routing/schema/jwt.d.ts +4 -0
  112. package/dist/api/routing/schema/jwt.d.ts.map +1 -0
  113. package/dist/api/routing/schema/jwt.js +11 -0
  114. package/dist/api/{express → routing}/schema/routing.d.ts +2 -2
  115. package/dist/api/routing/schema/routing.d.ts.map +1 -0
  116. package/dist/api/routing/schema/routing.js +123 -0
  117. package/dist/api/routing.js +3 -1
  118. package/dist/api/setupRequest.d.ts +3 -5
  119. package/dist/api/setupRequest.d.ts.map +1 -1
  120. package/dist/api/setupRequest.js +20 -24
  121. package/dist/errorReporter.d.ts +4 -4
  122. package/dist/errorReporter.d.ts.map +1 -1
  123. package/dist/errorReporter.js +20 -17
  124. package/dist/errors.d.ts +1 -1
  125. package/dist/errors.d.ts.map +1 -1
  126. package/dist/errors.js +3 -3
  127. package/dist/filter/types/path/index.d.ts +2 -2
  128. package/dist/filter/types/path/index.d.ts.map +1 -1
  129. package/dist/filter/types/path/index.js +2 -3
  130. package/dist/filter/types.js +2 -1
  131. package/dist/filter.d.ts.map +1 -1
  132. package/dist/filter.js +36 -1
  133. package/dist/logger/jsonLogger.d.ts +2 -1
  134. package/dist/logger/jsonLogger.d.ts.map +1 -1
  135. package/dist/logger/jsonLogger.js +9 -13
  136. package/dist/logger/logFmtLogger.d.ts +2 -1
  137. package/dist/logger/logFmtLogger.d.ts.map +1 -1
  138. package/dist/logger/logFmtLogger.js +9 -11
  139. package/dist/logger/shared.d.ts +2 -1
  140. package/dist/logger/shared.d.ts.map +1 -1
  141. package/dist/logger/shared.js +7 -9
  142. package/dist/rateLimit.d.ts +7 -10
  143. package/dist/rateLimit.d.ts.map +1 -1
  144. package/dist/rateLimit.js +17 -16
  145. package/dist/services/Emailer/Sendgrid.d.ts +1 -2
  146. package/dist/services/Emailer/Sendgrid.d.ts.map +1 -1
  147. package/dist/services/Emailer/Sendgrid.js +16 -20
  148. package/dist/services/Emailer/fake.d.ts +2 -2
  149. package/dist/services/Emailer/fake.d.ts.map +1 -1
  150. package/dist/services/Emailer/fake.js +10 -8
  151. package/dist/services/Emailer/service.d.ts +7 -10
  152. package/dist/services/Emailer/service.d.ts.map +1 -1
  153. package/dist/services/Emailer/service.js +3 -3
  154. package/dist/services/Operations/live.d.ts +2 -3
  155. package/dist/services/Operations/live.d.ts.map +1 -1
  156. package/dist/services/Operations/live.js +44 -51
  157. package/dist/services/Operations/service.d.ts +14 -19
  158. package/dist/services/Operations/service.d.ts.map +1 -1
  159. package/dist/services/Operations/service.js +23 -28
  160. package/dist/services/QueueMaker/errors.d.ts +5 -7
  161. package/dist/services/QueueMaker/errors.d.ts.map +1 -1
  162. package/dist/services/QueueMaker/errors.js +11 -11
  163. package/dist/services/QueueMaker/memQueue.d.ts +6 -9
  164. package/dist/services/QueueMaker/memQueue.d.ts.map +1 -1
  165. package/dist/services/QueueMaker/memQueue.js +37 -39
  166. package/dist/services/QueueMaker/sbqueue.d.ts +6 -9
  167. package/dist/services/QueueMaker/sbqueue.d.ts.map +1 -1
  168. package/dist/services/QueueMaker/sbqueue.js +41 -39
  169. package/dist/services/QueueMaker/service.d.ts +2 -4
  170. package/dist/services/QueueMaker/service.d.ts.map +1 -1
  171. package/dist/services/QueueMaker/service.js +8 -8
  172. package/dist/services/Repository/dsl.d.ts +11 -13
  173. package/dist/services/Repository/dsl.d.ts.map +1 -1
  174. package/dist/services/Repository/dsl.js +12 -13
  175. package/dist/services/Repository/ext.d.ts +34 -62
  176. package/dist/services/Repository/ext.d.ts.map +1 -1
  177. package/dist/services/Repository/ext.js +59 -70
  178. package/dist/services/RepositoryBase.d.ts +101 -71
  179. package/dist/services/RepositoryBase.d.ts.map +1 -1
  180. package/dist/services/RepositoryBase.js +229 -226
  181. package/dist/services/RequestContextContainer.d.ts +13 -21
  182. package/dist/services/RequestContextContainer.d.ts.map +1 -1
  183. package/dist/services/RequestContextContainer.js +21 -25
  184. package/dist/services/Store/ContextMapContainer.d.ts +11 -18
  185. package/dist/services/Store/ContextMapContainer.d.ts.map +1 -1
  186. package/dist/services/Store/ContextMapContainer.js +17 -18
  187. package/dist/services/Store/Cosmos/query.d.ts +3 -2
  188. package/dist/services/Store/Cosmos/query.d.ts.map +1 -1
  189. package/dist/services/Store/Cosmos/query.js +10 -11
  190. package/dist/services/Store/Cosmos.d.ts +2 -3
  191. package/dist/services/Store/Cosmos.d.ts.map +1 -1
  192. package/dist/services/Store/Cosmos.js +107 -90
  193. package/dist/services/Store/Disk.d.ts +4 -4
  194. package/dist/services/Store/Disk.d.ts.map +1 -1
  195. package/dist/services/Store/Disk.js +54 -50
  196. package/dist/services/Store/Memory.d.ts +6 -8
  197. package/dist/services/Store/Memory.d.ts.map +1 -1
  198. package/dist/services/Store/Memory.js +93 -89
  199. package/dist/services/Store/codeFilter.d.ts.map +1 -1
  200. package/dist/services/Store/codeFilter.js +3 -3
  201. package/dist/services/Store/codeFilter.test.d.ts.map +1 -1
  202. package/dist/services/Store/filterApi/query.d.ts +1 -1
  203. package/dist/services/Store/filterApi/query.d.ts.map +1 -1
  204. package/dist/services/Store/filterApi/query.js +3 -3
  205. package/dist/services/Store/index.d.ts +1 -2
  206. package/dist/services/Store/index.d.ts.map +1 -1
  207. package/dist/services/Store/index.js +7 -8
  208. package/dist/services/Store/service.d.ts +20 -23
  209. package/dist/services/Store/service.d.ts.map +1 -1
  210. package/dist/services/Store/service.js +6 -6
  211. package/dist/services/Store/utils.d.ts +3 -3
  212. package/dist/services/Store/utils.d.ts.map +1 -1
  213. package/dist/services/Store/utils.js +26 -28
  214. package/dist/services/query.d.ts +6 -6
  215. package/dist/services/query.d.ts.map +1 -1
  216. package/dist/services/query.js +5 -3
  217. package/dist/test.arbs.d.ts +0 -2
  218. package/dist/test.arbs.d.ts.map +1 -1
  219. package/dist/test.arbs.js +3 -4
  220. package/package.json +28 -168
  221. package/src/RequestContext.ts +1 -0
  222. package/src/_ext/Array.ts +5 -2
  223. package/src/api/reportError.ts +14 -10
  224. package/src/api/routing/base.ts +77 -110
  225. package/src/api/routing/defaultErrorHandler.ts +64 -54
  226. package/src/api/routing/makeRequestHandler.ts +165 -135
  227. package/src/api/routing/match.ts +14 -8
  228. package/src/api/{express → routing}/schema/jwt.ts +6 -5
  229. package/src/api/{express → routing}/schema/routing.ts +2 -1
  230. package/src/api/setupRequest.ts +30 -24
  231. package/src/errorReporter.ts +12 -11
  232. package/src/errors.ts +1 -0
  233. package/src/filter/types/path/index.ts +2 -2
  234. package/src/logger/jsonLogger.ts +6 -5
  235. package/src/logger/logFmtLogger.ts +4 -5
  236. package/src/logger/shared.ts +4 -3
  237. package/src/rateLimit.ts +37 -34
  238. package/src/services/Emailer/Sendgrid.ts +12 -10
  239. package/src/services/Emailer/fake.ts +7 -4
  240. package/src/services/Emailer/service.ts +4 -1
  241. package/src/services/Operations/live.ts +66 -59
  242. package/src/services/Operations/service.ts +41 -34
  243. package/src/services/QueueMaker/errors.ts +15 -11
  244. package/src/services/QueueMaker/memQueue.ts +59 -40
  245. package/src/services/QueueMaker/sbqueue.ts +54 -33
  246. package/src/services/QueueMaker/service.ts +7 -6
  247. package/src/services/Repository/dsl.ts +18 -14
  248. package/src/services/Repository/ext.ts +58 -50
  249. package/src/services/RepositoryBase.ts +478 -351
  250. package/src/services/RequestContextContainer.ts +30 -18
  251. package/src/services/Store/ContextMapContainer.ts +26 -13
  252. package/src/services/Store/Cosmos/query.ts +17 -11
  253. package/src/services/Store/Cosmos.ts +209 -168
  254. package/src/services/Store/Disk.ts +69 -53
  255. package/src/services/Store/Memory.ts +138 -97
  256. package/src/services/Store/{Redis.ts → Redis.ts.bak} +7 -5
  257. package/src/services/Store/codeFilter.test.ts +61 -36
  258. package/src/services/Store/codeFilter.ts +1 -0
  259. package/src/services/Store/filterApi/query.ts +1 -0
  260. package/src/services/Store/index.ts +7 -6
  261. package/src/services/Store/service.ts +4 -1
  262. package/src/services/Store/utils.ts +25 -23
  263. package/src/services/query.ts +3 -2
  264. package/src/services/simpledb/{cosmosdb.ts → cosmosdb.ts.bak} +1 -0
  265. package/src/services/simpledb/{diskdb.ts → diskdb.ts.bak} +2 -1
  266. package/src/services/simpledb/{memdb.ts → memdb.ts.bak} +3 -2
  267. package/src/services/simpledb/{mongodb.ts → mongodb.ts.bak} +1 -0
  268. package/src/services/simpledb/{redisdb.ts → redisdb.ts.bak} +17 -14
  269. package/src/services/simpledb/{shared.ts → shared.ts.bak} +2 -1
  270. package/src/services/simpledb/{simpledb.ts → simpledb.ts.bak} +6 -2
  271. package/tsconfig.json +4 -21
  272. package/tsconfig.json.bak +0 -4
  273. package/_cjs/_global.cjs +0 -6
  274. package/_cjs/_global.cjs.map +0 -1
  275. package/_cjs/_global.ext.cjs +0 -5
  276. package/_cjs/_global.ext.cjs.map +0 -1
  277. package/_cjs/_global.schema.cjs +0 -5
  278. package/_cjs/_global.schema.cjs.map +0 -1
  279. package/_cjs/api/defaultErrorHandler.cjs +0 -37
  280. package/_cjs/api/defaultErrorHandler.cjs.map +0 -1
  281. package/_cjs/api/express/schema/jwt.cjs.map +0 -1
  282. package/_cjs/api/express/schema/routing.cjs +0 -23
  283. package/_cjs/api/express/schema/routing.cjs.map +0 -1
  284. package/_cjs/api/http.cjs +0 -42
  285. package/_cjs/api/http.cjs.map +0 -1
  286. package/_cjs/services/Store/Redis.cjs +0 -73
  287. package/_cjs/services/Store/Redis.cjs.map +0 -1
  288. package/_cjs/services/simpledb/cosmosdb.cjs +0 -109
  289. package/_cjs/services/simpledb/cosmosdb.cjs.map +0 -1
  290. package/_cjs/services/simpledb/diskdb.cjs +0 -125
  291. package/_cjs/services/simpledb/diskdb.cjs.map +0 -1
  292. package/_cjs/services/simpledb/index.cjs +0 -38
  293. package/_cjs/services/simpledb/index.cjs.map +0 -1
  294. package/_cjs/services/simpledb/memdb.cjs +0 -72
  295. package/_cjs/services/simpledb/memdb.cjs.map +0 -1
  296. package/_cjs/services/simpledb/mongodb.cjs +0 -99
  297. package/_cjs/services/simpledb/mongodb.cjs.map +0 -1
  298. package/_cjs/services/simpledb/redisdb.cjs +0 -135
  299. package/_cjs/services/simpledb/redisdb.cjs.map +0 -1
  300. package/_cjs/services/simpledb/shared.cjs +0 -79
  301. package/_cjs/services/simpledb/shared.cjs.map +0 -1
  302. package/_cjs/services/simpledb/simpledb.cjs +0 -85
  303. package/_cjs/services/simpledb/simpledb.cjs.map +0 -1
  304. package/dist/_global.d.ts +0 -10
  305. package/dist/_global.d.ts.map +0 -1
  306. package/dist/_global.ext.d.ts +0 -34
  307. package/dist/_global.ext.d.ts.map +0 -1
  308. package/dist/_global.ext.js +0 -6
  309. package/dist/_global.js +0 -12
  310. package/dist/_global.schema.d.ts +0 -6
  311. package/dist/_global.schema.d.ts.map +0 -1
  312. package/dist/_global.schema.js +0 -9
  313. package/dist/api/defaultErrorHandler.d.ts +0 -6
  314. package/dist/api/defaultErrorHandler.d.ts.map +0 -1
  315. package/dist/api/defaultErrorHandler.js +0 -34
  316. package/dist/api/express/schema/jwt.d.ts +0 -6
  317. package/dist/api/express/schema/jwt.d.ts.map +0 -1
  318. package/dist/api/express/schema/jwt.js +0 -11
  319. package/dist/api/express/schema/routing.d.ts.map +0 -1
  320. package/dist/api/express/schema/routing.js +0 -10
  321. package/dist/api/http.d.ts +0 -16
  322. package/dist/api/http.d.ts.map +0 -1
  323. package/dist/api/http.js +0 -12
  324. package/dist/services/Store/Redis.d.ts +0 -6
  325. package/dist/services/Store/Redis.d.ts.map +0 -1
  326. package/dist/services/Store/Redis.js +0 -76
  327. package/dist/services/simpledb/cosmosdb.d.ts +0 -14
  328. package/dist/services/simpledb/cosmosdb.d.ts.map +0 -1
  329. package/dist/services/simpledb/cosmosdb.js +0 -103
  330. package/dist/services/simpledb/diskdb.d.ts +0 -12
  331. package/dist/services/simpledb/diskdb.d.ts.map +0 -1
  332. package/dist/services/simpledb/diskdb.js +0 -109
  333. package/dist/services/simpledb/index.d.ts +0 -7
  334. package/dist/services/simpledb/index.d.ts.map +0 -1
  335. package/dist/services/simpledb/index.js +0 -7
  336. package/dist/services/simpledb/memdb.d.ts +0 -11
  337. package/dist/services/simpledb/memdb.d.ts.map +0 -1
  338. package/dist/services/simpledb/memdb.js +0 -58
  339. package/dist/services/simpledb/mongodb.d.ts +0 -13
  340. package/dist/services/simpledb/mongodb.d.ts.map +0 -1
  341. package/dist/services/simpledb/mongodb.js +0 -68
  342. package/dist/services/simpledb/redisdb.d.ts +0 -35
  343. package/dist/services/simpledb/redisdb.d.ts.map +0 -1
  344. package/dist/services/simpledb/redisdb.js +0 -126
  345. package/dist/services/simpledb/shared.d.ts +0 -87
  346. package/dist/services/simpledb/shared.d.ts.map +0 -1
  347. package/dist/services/simpledb/shared.js +0 -52
  348. package/dist/services/simpledb/simpledb.d.ts +0 -23
  349. package/dist/services/simpledb/simpledb.d.ts.map +0 -1
  350. package/dist/services/simpledb/simpledb.js +0 -69
  351. package/src/_global.ext.ts +0 -36
  352. package/src/_global.schema.ts +0 -10
  353. package/src/_global.ts +0 -14
  354. package/src/api/defaultErrorHandler.ts +0 -59
  355. package/src/api/express/makeJsonSchema.test.ts.bak +0 -76
  356. package/src/api/express/makeJsonSchema.ts.bak +0 -166
  357. package/src/api/express/makeOpenApiSpecs.ts.bak +0 -62
  358. package/src/api/http.ts +0 -26
  359. package/tsplus.config.json +0 -9
  360. /package/src/services/simpledb/{index.ts → index.ts.bak} +0 -0
@@ -17,14 +17,20 @@ import { StoreMaker } from "./Store.js"
17
17
  import type { Filter, FilterArgs, FilterFunc, PersistenceModelType, StoreConfig, Where } from "./Store.js"
18
18
  import type {} from "effect/Equal"
19
19
  import type {} from "effect/Hash"
20
+ import { toNonEmptyArray } from "@effect-app/core/Array"
20
21
  import { flatMapOption } from "@effect-app/core/Effect"
21
- import type { Opt } from "@effect-app/core/Option"
22
22
  import { makeFilters } from "@effect-app/infra/filter"
23
- import { Effect, S } from "effect-app"
24
- import { type FixEnv, runTerm } from "effect-app/Pure"
23
+ import type { ParseResult, Schema } from "@effect-app/schema"
24
+ import { NonNegativeInt } from "@effect-app/schema"
25
+ import type { Context, NonEmptyArray, NonEmptyReadonlyArray } from "effect-app"
26
+ import { Chunk, Effect, flow, Option, pipe, PubSub, ReadonlyArray, S } from "effect-app"
27
+ import { runTerm } from "effect-app/Pure"
28
+ import type { FixEnv, PureEnv } from "effect-app/Pure"
29
+ import { assignTag } from "effect-app/service"
25
30
  import { type InvalidStateError, NotFoundError, type OptimisticConcurrencyException } from "../errors.js"
26
31
  import type { FieldValues } from "../filter/types.js"
27
- import { make as makeQuery, type QAll, type Query, query, type QueryProjection } from "./query.js"
32
+ import { make as makeQuery, page, query } from "./query.js"
33
+ import type { QAll, Query, QueryEnd, QueryProjection, QueryWhere } from "./query.js"
28
34
  import { ContextMapContainer } from "./Store/ContextMapContainer.js"
29
35
  import * as Q from "./Store/filterApi/query.js"
30
36
 
@@ -67,7 +73,7 @@ export abstract class RepositoryBaseC<
67
73
  ItemType extends string
68
74
  > {
69
75
  abstract readonly itemType: ItemType
70
- abstract readonly find: (id: T["id"]) => Effect<Opt<T>>
76
+ abstract readonly find: (id: T["id"]) => Effect<Option<T>>
71
77
  abstract readonly all: Effect<T[]>
72
78
  abstract readonly saveAndPublish: (
73
79
  items: Iterable<T>,
@@ -83,12 +89,13 @@ export abstract class RepositoryBaseC<
83
89
  filter: FilterFunc<PM>
84
90
  // count: (filter?: Filter<PM>) => Effect<never, never, NonNegativeInt>
85
91
  }
86
- abstract readonly changeFeed: PubSub<[T[], "save" | "remove"]>
92
+ abstract readonly changeFeed: PubSub.PubSub<[T[], "save" | "remove"]>
87
93
  abstract readonly removeAndPublish: (
88
94
  items: Iterable<T>,
89
95
  events?: Iterable<Evt>
90
96
  ) => Effect<void>
91
97
 
98
+ /** @deprecated use q2 */
92
99
  abstract readonly mapped: Mapped<PM, Omit<PM, "_etag">>
93
100
  abstract readonly q2: {
94
101
  <A, R, From extends FieldValues>(
@@ -158,18 +165,108 @@ export class RepositoryBaseC3<
158
165
  ItemType extends string
159
166
  > extends RepositoryBaseC2<T, PM, Evt, ItemType> {
160
167
  get(id: T["id"]) {
161
- return this
162
- .find(id)
163
- .flatMap((_) => _.encaseInEffect(() => new NotFoundError<ItemType>({ type: this.itemType, id })))
168
+ return Effect.andThen(
169
+ this
170
+ .find(id),
171
+ (_) => Effect.mapError(_, () => new NotFoundError<ItemType>({ type: this.itemType, id }))
172
+ )
164
173
  }
165
174
 
166
175
  readonly log = (evt: Evt) => AnyPureDSL.log(evt)
167
176
 
168
177
  removeById(id: T["id"]) {
169
- return this.get(id).andThen((_) => this.removeAndPublish([_]))
178
+ return Effect.andThen(this.get(id), (_) => this.removeAndPublish([_]))
179
+ }
180
+
181
+ count(filter?: Filter<PM>) {
182
+ return Effect.map(
183
+ this.projectEffect(Effect.sync(() => ({ filter }))),
184
+ (_) => NonNegativeInt(_.length)
185
+ )
170
186
  }
171
187
 
172
- // TODO: project inside the db.
188
+ readonly save = (...items: NonEmptyArray<T>) => this.saveAndPublish(items)
189
+
190
+ readonly saveWithEvents = (events: Iterable<Evt>) => (...items: NonEmptyArray<T>) =>
191
+ this.saveAndPublish(items, events)
192
+
193
+ readonly q2AndSaveOnePure = <A, E2, R2, T2 extends T>(
194
+ q: (q: Query<Omit<PM, "_etag">>) => Query<Omit<PM, "_etag">> | QueryEnd<Omit<PM, "_etag">>,
195
+ pure: Effect<A, E2, FixEnv<R2, Evt, T, T2>>
196
+ ) =>
197
+ this.q2(flow(q, page({ limit: 1 }))).pipe(
198
+ Effect.map(ReadonlyArray.toNonEmptyArray),
199
+ Effect.flatMap(Effect.mapError(() => new NotFoundError({ type: this.itemType, id: q }))),
200
+ Effect.andThen((_) => saveWithPure_(this, _[0], pure))
201
+ )
202
+
203
+ readonly q2AndSavePure = <A, E2, R2, T2 extends T>(
204
+ q: (q: Query<Omit<PM, "_etag">>) => Query<Omit<PM, "_etag">> | QueryEnd<Omit<PM, "_etag">>,
205
+ pure: Effect<A, E2, FixEnv<R2, Evt, readonly T[], readonly T2[]>>,
206
+ batchSize?: number
207
+ ) =>
208
+ this.q2(flow(q, page({ limit: 1 }))).pipe(
209
+ Effect.andThen((_) =>
210
+ batchSize === undefined
211
+ ? saveManyWithPure_(this, _, pure)
212
+ : saveManyWithPureBatched_(this, _, pure, batchSize)
213
+ )
214
+ )
215
+
216
+ /**
217
+ * NOTE: it's not as composable, only useful when the request is simple, and only this part needs request args.
218
+ */
219
+ readonly handleByIdAndSaveWithPure = <Req extends { id: T["id"] }, Context, R, A, E, S2 extends T>(
220
+ pure: (req: Req, ctx: Context) => Effect<A, E, FixEnv<R, Evt, T, S2>>
221
+ ) =>
222
+ (req: Req, ctx: Context) => byIdAndSaveWithPure(this, req.id)(pure(req, ctx))
223
+
224
+ saveManyWithPure = <
225
+ R,
226
+ A,
227
+ E,
228
+ S1 extends T,
229
+ S2 extends T
230
+ >(
231
+ items: Iterable<S1>,
232
+ pure: Effect<A, E, FixEnv<R, Evt, readonly S1[], readonly S2[]>>
233
+ ) =>
234
+ saveAllWithEffectInt(
235
+ this,
236
+ runTerm(pure, [...items])
237
+ )
238
+
239
+ byIdAndSaveWithPure: {
240
+ <R, A, E, S2 extends T>(
241
+ id: T["id"],
242
+ pure: Effect<A, E, FixEnv<R, Evt, T, S2>>
243
+ ): Effect<
244
+ A,
245
+ InvalidStateError | OptimisticConcurrencyException | NotFoundError<ItemType> | E,
246
+ Exclude<R, {
247
+ env: PureEnv<Evt, T, S2>
248
+ }>
249
+ >
250
+ } = (id, pure): any => get(this, id).pipe(Effect.flatMap((item) => saveWithPure_(this, item, pure)))
251
+
252
+ saveWithPure<
253
+ R,
254
+ A,
255
+ E,
256
+ S1 extends T,
257
+ S2 extends T
258
+ >(
259
+ item: S1,
260
+ pure: Effect<A, E, FixEnv<R, Evt, S1, S2>>
261
+ ) {
262
+ return saveAllWithEffectInt(
263
+ this,
264
+ runTerm(pure, item)
265
+ .pipe(Effect.map(([item, events, a]) => [[item], events, a]))
266
+ )
267
+ }
268
+
269
+ /** @deprecated use q2 */
173
270
  projectEffect<
174
271
  R,
175
272
  E,
@@ -186,6 +283,7 @@ export class RepositoryBaseC3<
186
283
  R
187
284
  >
188
285
  ): Effect<S[], E, R>
286
+ /** @deprecated use q2 */
189
287
  projectEffect<
190
288
  R,
191
289
  E,
@@ -203,6 +301,7 @@ export class RepositoryBaseC3<
203
301
  R
204
302
  >
205
303
  ): Effect<Pick<PM, U>[], E, R>
304
+ /** @deprecated use q2 */
206
305
  projectEffect<
207
306
  R,
208
307
  E,
@@ -222,14 +321,16 @@ export class RepositoryBaseC3<
222
321
  >
223
322
  ): Effect<S[], E, R> {
224
323
  // TODO: a projection that gets sent to the db instead.
225
- return map.flatMap((f) =>
226
- this
227
- .utils
228
- .filter(f)
229
- .map((_) => f.collect ? _.filterMap(f.collect) : _ as unknown as S[])
230
- )
324
+ return Effect.flatMap(map, (f) =>
325
+ Effect.map(
326
+ this
327
+ .utils
328
+ .filter(f),
329
+ (_) => f.collect ? ReadonlyArray.filterMap(_, f.collect) : _ as unknown as S[]
330
+ ))
231
331
  }
232
332
 
333
+ /** @deprecated use q2 */
233
334
  project<S = PM>(
234
335
  map: {
235
336
  filter?: Filter<PM>
@@ -238,6 +339,7 @@ export class RepositoryBaseC3<
238
339
  skip?: number
239
340
  }
240
341
  ): Effect<S[]>
342
+ /** @deprecated use q2 */
241
343
  project<U extends keyof PM>(
242
344
  map: {
243
345
  filter?: Q.QueryBuilder<PM>
@@ -246,6 +348,7 @@ export class RepositoryBaseC3<
246
348
  skip?: number
247
349
  }
248
350
  ): Effect<Pick<PM, U>[]>
351
+ /** @deprecated use q2 */
249
352
  project<
250
353
  U extends keyof PM,
251
354
  S = Pick<PM, U>
@@ -261,12 +364,7 @@ export class RepositoryBaseC3<
261
364
  return this.projectEffect(Effect.sync(() => map))
262
365
  }
263
366
 
264
- count(filter?: Filter<PM>) {
265
- return this
266
- .projectEffect(Effect.sync(() => ({ filter })))
267
- .map((_) => NonNegativeInt(_.length))
268
- }
269
-
367
+ /** @deprecated use q2 */
270
368
  queryEffect<
271
369
  R,
272
370
  E,
@@ -275,17 +373,20 @@ export class RepositoryBaseC3<
275
373
  // TODO: think about collectPM, collectE, and collect(Parsed)
276
374
  map: Effect<{ filter?: Filter<PM>; collect?: (t: T) => Option<S>; limit?: number; skip?: number }, E, R>
277
375
  ) {
278
- return map.flatMap((f) =>
376
+ return Effect.flatMap(map, (f) =>
279
377
  (f.filter ? this.utils.filter(f) : this.utils.all)
280
- .flatMap((_) => this.utils.parseMany(_))
281
- .map((_) => f.collect ? _.filterMap(f.collect) : _ as any as S[])
282
- )
378
+ .pipe(
379
+ Effect.flatMap((_) => this.utils.parseMany(_)),
380
+ Effect.map((_) => f.collect ? ReadonlyArray.filterMap(_, f.collect) : _ as unknown[] as S[])
381
+ ))
283
382
  }
284
383
 
384
+ /** @deprecated use q2 */
285
385
  queryOneEffect<R, E>(
286
386
  // TODO: think about collectPM, collectE, and collect(Parsed)
287
387
  map: Effect<{ filter?: Filter<PM> }, E, R>
288
388
  ): Effect<T, E | NotFoundError<ItemType>, R>
389
+ /** @deprecated use q2 */
289
390
  queryOneEffect<
290
391
  R,
291
392
  E,
@@ -294,6 +395,7 @@ export class RepositoryBaseC3<
294
395
  // TODO: think about collectPM, collectE, and collect(Parsed)
295
396
  map: Effect<{ filter?: Filter<PM>; collect: (t: T) => Option<S> }, E, R>
296
397
  ): Effect<S, E | NotFoundError<ItemType>, R>
398
+ /** @deprecated use q2 */
297
399
  queryOneEffect<
298
400
  R,
299
401
  E,
@@ -302,18 +404,26 @@ export class RepositoryBaseC3<
302
404
  // TODO: think about collectPM, collectE, and collect(Parsed)
303
405
  map: Effect<{ filter?: Filter<PM>; collect?: (t: T) => Option<S> }, E, R>
304
406
  ): Effect<S, E | NotFoundError<ItemType>, R> {
305
- return map.flatMap((f) =>
407
+ return Effect.flatMap(map, (f) =>
306
408
  (f.filter ? this.utils.filter({ filter: f.filter, limit: 1 }) : this.utils.all)
307
- .flatMap((_) => this.utils.parseMany(_))
308
- .flatMap((_) =>
309
- (f.collect ? _.filterMap(f.collect) : _ as any as S[])
310
- .toNonEmpty
311
- .encaseInEffect(() => new NotFoundError<ItemType>({ type: this.itemType, id: f.filter }))
312
- .map((_) => _[0])
313
- )
314
- )
409
+ .pipe(
410
+ Effect.flatMap((_) => this.utils.parseMany(_)),
411
+ Effect
412
+ .flatMap((_) =>
413
+ toNonEmptyArray(
414
+ f.collect
415
+ ? ReadonlyArray.filterMap(_, f.collect)
416
+ : _ as unknown[] as S[]
417
+ )
418
+ .pipe(
419
+ Effect.mapError(() => new NotFoundError<ItemType>({ type: this.itemType, id: f.filter })),
420
+ Effect.map((_) => _[0])
421
+ )
422
+ )
423
+ ))
315
424
  }
316
425
 
426
+ /** @deprecated use q2 */
317
427
  queryLegacy<S = T>(
318
428
  // TODO: think about collectPM, collectE, and collect(Parsed)
319
429
  map: { filter?: Filter<PM>; collect?: (t: T) => Option<S>; limit?: number; skip?: number }
@@ -321,24 +431,29 @@ export class RepositoryBaseC3<
321
431
  return this.queryEffect(Effect.sync(() => map))
322
432
  }
323
433
 
434
+ /** @deprecated use q2 */
324
435
  query(
325
436
  b: (fn: Q.FilterTest<PM>, fields: Q.Filter<PM, never>) => Q.QueryBuilder<PM>
326
437
  ) {
327
438
  return this.queryEffect(Effect.sync(() => ({ filter: anyQb((_, fields) => b(_, fields as any)) })))
328
439
  }
329
440
 
441
+ /** @deprecated use q2 */
330
442
  queryOne<S = T>(
331
443
  map: { filter?: Filter<PM>; collect: (t: T) => Option<S> }
332
444
  ): Effect<S, NotFoundError<ItemType>>
445
+ /** @deprecated use q2 */
333
446
  queryOne(
334
447
  map: { filter?: Filter<PM> }
335
448
  ): Effect<T, NotFoundError<ItemType>>
449
+ /** @deprecated use q2 */
336
450
  queryOne<S = T>(
337
451
  map: { filter?: Filter<PM>; collect?: (t: T) => Option<S> }
338
452
  ) {
339
453
  return this.queryOneEffect(Effect.sync(() => map))
340
454
  }
341
455
 
456
+ /** @deprecated */
342
457
  queryAndSaveOnePureEffect<
343
458
  R,
344
459
  E,
@@ -355,6 +470,7 @@ export class RepositoryBaseC3<
355
470
  env: PureEnv<Evt, S, S2>
356
471
  }>
357
472
  >
473
+ /** @deprecated */
358
474
  queryAndSaveOnePureEffect<
359
475
  R,
360
476
  E
@@ -370,14 +486,13 @@ export class RepositoryBaseC3<
370
486
  env: PureEnv<Evt, T, T2>
371
487
  }>
372
488
  >
489
+ /** @deprecated */
373
490
  queryAndSaveOnePureEffect(
374
491
  map: any
375
492
  ) {
376
- return (pure: any) =>
377
- queryOneEffect(this, map)
378
- .flatMap((_) => saveWithPure_(this, _, pure))
493
+ return (pure: any) => Effect.flatMap(queryOneEffect(this, map), (_) => saveWithPure_(this, _, pure))
379
494
  }
380
-
495
+ /** @deprecated */
381
496
  queryAndSaveOnePure<
382
497
  S extends T = T
383
498
  >(
@@ -389,6 +504,7 @@ export class RepositoryBaseC3<
389
504
  env: PureEnv<Evt, S, S2>
390
505
  }>
391
506
  >
507
+ /** @deprecated */
392
508
  queryAndSaveOnePure(
393
509
  map: { filter: Filter<PM> }
394
510
  ): <R2, A, E2, T2>(pure: Effect<A, E2, FixEnv<R2, Evt, T, T2>>) => Effect<
@@ -398,12 +514,13 @@ export class RepositoryBaseC3<
398
514
  env: PureEnv<Evt, T, T2>
399
515
  }>
400
516
  >
517
+ /** @deprecated */
401
518
  queryAndSaveOnePure<S = T>(
402
519
  map: { filter: Filter<PM>; collect: (t: T) => Option<S> }
403
520
  ) {
404
521
  return this.queryAndSaveOnePureEffect(Effect.sync(() => map))
405
522
  }
406
-
523
+ /** @deprecated */
407
524
  queryAndSavePureEffect<
408
525
  R,
409
526
  E,
@@ -411,11 +528,10 @@ export class RepositoryBaseC3<
411
528
  >(
412
529
  map: Effect<{ filter: Filter<PM>; collect?: (t: T) => Option<S>; limit?: number; skip?: number }, E, R>
413
530
  ) {
414
- return <R2, A, E2, S2 extends T>(pure: Effect<A, E2, FixEnv<R2, Evt, S[], S2[]>>) =>
415
- queryEffect(this, map)
416
- .flatMap((_) => this.saveManyWithPure_(_, pure))
531
+ return <R2, A, E2, S2 extends T>(pure: Effect<A, E2, FixEnv<R2, Evt, readonly S[], readonly S2[]>>) =>
532
+ Effect.flatMap(queryEffect(this, map), (_) => this.saveManyWithPure(_, pure))
417
533
  }
418
-
534
+ /** @deprecated */
419
535
  queryAndSavePure<
420
536
  S extends T = T
421
537
  >(
@@ -424,95 +540,7 @@ export class RepositoryBaseC3<
424
540
  return this.queryAndSavePureEffect(Effect.sync(() => map))
425
541
  }
426
542
 
427
- get saveManyWithPure() {
428
- return <R, A, E, S1 extends T, S2 extends T>(pure: Effect<A, E, FixEnv<R, Evt, S1[], S2[]>>) =>
429
- (items: Iterable<S1>) => saveManyWithPure_(this, items, pure)
430
- }
431
-
432
- byIdAndSaveWithPure(
433
- id: T["id"]
434
- ): <R, A, E, S2 extends T>(
435
- pure: Effect<A, E, FixEnv<R, Evt, T, S2>>
436
- ) => Effect<
437
- A,
438
- InvalidStateError | OptimisticConcurrencyException | NotFoundError<ItemType> | E,
439
- Exclude<R, {
440
- env: PureEnv<Evt, T, S2>
441
- }>
442
- >
443
- byIdAndSaveWithPure<R, A, E, S2 extends T>(
444
- id: T["id"],
445
- pure: Effect<A, E, FixEnv<R, Evt, T, S2>>
446
- ): Effect<
447
- A,
448
- InvalidStateError | OptimisticConcurrencyException | NotFoundError<ItemType> | E,
449
- Exclude<R, {
450
- env: PureEnv<Evt, T, S2>
451
- }>
452
- >
453
- byIdAndSaveWithPure<R, A, E, S2 extends T>(id: T["id"], pure?: Effect<A, E, FixEnv<R, Evt, T, S2>>) {
454
- if (pure) return get(this, id).flatMap((item) => saveWithPure_(this, item, pure))
455
- return (pure: Effect<A, E, FixEnv<R, Evt, T, S2>>) =>
456
- get(this, id).flatMap((item) => saveWithPure_(this, item, pure))
457
- }
458
-
459
- /**
460
- * NOTE: it's not as composable, only useful when the request is simple, and only this part needs request args.
461
- */
462
- get handleByIdAndSaveWithPure() {
463
- return <Req extends { id: T["id"] }, Context, R, A, E, S2 extends T>(
464
- pure: (req: Req, ctx: Context) => Effect<A, E, FixEnv<R, Evt, T, S2>>
465
- ) =>
466
- (req: Req, ctx: Context) => byIdAndSaveWithPure(this, req.id)(pure(req, ctx))
467
- }
468
-
469
- saveManyWithPure_<
470
- R,
471
- A,
472
- E,
473
- S1 extends T,
474
- S2 extends T
475
- >(
476
- items: Iterable<S1>,
477
- pure: Effect<A, E, FixEnv<R, Evt, S1[], S2[]>>
478
- ) {
479
- return saveAllWithEffectInt(
480
- this,
481
- runTerm(pure, [...items])
482
- )
483
- }
484
-
485
- saveWithPure_<
486
- R,
487
- A,
488
- E,
489
- S1 extends T,
490
- S2 extends T
491
- >(
492
- item: S1,
493
- pure: Effect<A, E, FixEnv<R, Evt, S1, S2>>
494
- ) {
495
- return saveAllWithEffectInt(
496
- this,
497
- runTerm(pure, item)
498
- .map(([item, events, a]) => [[item], events, a])
499
- )
500
- }
501
-
502
- saveAllWithEffectInt<
503
- P extends T,
504
- R,
505
- E,
506
- A
507
- >(
508
- gen: Effect<readonly [Iterable<P>, Iterable<Evt>, A], E, R>
509
- ) {
510
- return gen
511
- .flatMap(
512
- ([items, events, a]) => this.saveAndPublish(items, events).map(() => a)
513
- )
514
- }
515
-
543
+ /** @deprecated use q2 */
516
544
  queryAndSavePureEffectBatched<
517
545
  R,
518
546
  E,
@@ -522,11 +550,11 @@ export class RepositoryBaseC3<
522
550
  map: Effect<{ filter: Filter<PM>; collect?: (t: T) => Option<S>; limit?: number; skip?: number }, E, R>,
523
551
  batchSize = 100
524
552
  ) {
525
- return <R2, A, E2, S2 extends T>(pure: Effect<A, E2, FixEnv<R2, Evt, S[], S2[]>>) =>
526
- queryEffect(this, map)
527
- .flatMap((_) => this.saveManyWithPureBatched_(_, pure, batchSize))
553
+ return <R2, A, E2, S2 extends T>(pure: Effect<A, E2, FixEnv<R2, Evt, readonly S[], readonly S2[]>>) =>
554
+ Effect.flatMap(queryEffect(this, map), (_) => this.saveManyWithPureBatched(_, pure, batchSize))
528
555
  }
529
556
 
557
+ /** @deprecated use q2 */
530
558
  queryAndSavePureBatched<
531
559
  S extends T = T
532
560
  >(
@@ -537,12 +565,8 @@ export class RepositoryBaseC3<
537
565
  return this.queryAndSavePureEffectBatched(Effect.sync(() => map), batchSize)
538
566
  }
539
567
 
540
- saveManyWithPureBatched(batchSize = 100) {
541
- return <R, A, E, S1 extends T, S2 extends T>(pure: Effect<A, E, FixEnv<R, Evt, S1[], S2[]>>) =>
542
- (items: Iterable<S1>) => saveManyWithPureBatched_(this, items, pure, batchSize)
543
- }
544
-
545
- saveManyWithPureBatched_<
568
+ /** @deprecated use q2 */
569
+ saveManyWithPureBatched<
546
570
  R,
547
571
  A,
548
572
  E,
@@ -550,25 +574,18 @@ export class RepositoryBaseC3<
550
574
  S2 extends T
551
575
  >(
552
576
  items: Iterable<S1>,
553
- pure: Effect<A, E, FixEnv<R, Evt, S1[], S2[]>>,
577
+ pure: Effect<A, E, FixEnv<R, Evt, readonly S1[], readonly S2[]>>,
554
578
  batchSize = 100
555
579
  ) {
556
- return items
557
- .chunk(batchSize)
558
- .forEachEffect((batch) =>
580
+ return Effect.forEach(
581
+ ReadonlyArray.chunk_(items, batchSize),
582
+ (batch) =>
559
583
  saveAllWithEffectInt(
560
584
  this,
561
585
  runTerm(pure, batch)
562
586
  )
563
- )
587
+ )
564
588
  }
565
-
566
- readonly save = (...items: NonEmptyArray<T>) => this.saveAndPublish(items)
567
-
568
- readonly saveWithEvents = (
569
- events: Iterable<Evt>
570
- ) =>
571
- (...items: NonEmptyArray<T>) => this.saveAndPublish(items, events)
572
589
  }
573
590
 
574
591
  type Exact<A, B> = [A] extends [B] ? [B] extends [A] ? true : false : false
@@ -624,188 +641,214 @@ export function makeRepo<
624
641
  }
625
642
  }
626
643
  ) {
627
- return Do(($) => {
628
- const rctx = $(Effect.context<R>())
629
- const encode = flow(schema.encode, Effect.provide(rctx))
630
- const decode = flow(schema.decode, Effect.provide(rctx))
631
-
632
- const store = $(mkStore(args.makeInitial, args.config))
633
- const { get } = $(ContextMapContainer)
634
- const cms = get.andThen((_) => ({
635
- get: (id: string) => _.get(`${name}.${id}`),
636
- set: (id: string, etag: string | undefined) => _.set(`${name}.${id}`, etag)
637
- }))
638
-
639
- const pubCfg = $(Effect.context<R2>())
640
- const pub = "publishEvents" in args ? flow(args.publishEvents, (_) => _.provide(pubCfg)) : () => Effect.unit
641
- const changeFeed = $(PubSub.unbounded<[T[], "save" | "remove"]>())
642
-
643
- const allE = store.all.flatMap((items) =>
644
- Do(($) => {
645
- const { set } = $(cms)
646
- return items.map((_) => mapReverse(_, set))
647
- })
648
- )
649
-
650
- const all = allE.flatMap((_) =>
651
- _.forEachEffect((_) => decode(_), { concurrency: "inherit", batching: true }).orDie
652
- )
644
+ return Effect
645
+ .gen(function*($) {
646
+ const rctx = yield* $(Effect.context<R>())
647
+ const encode = flow(S.encode(schema), Effect.provide(rctx))
648
+ const decode = flow(S.decode(schema), Effect.provide(rctx))
649
+
650
+ const store = yield* $(mkStore(args.makeInitial, args.config))
651
+ const { get } = yield* $(ContextMapContainer)
652
+ const cms = Effect.andThen(get, (_) => ({
653
+ get: (id: string) => _.get(`${name}.${id}`),
654
+ set: (id: string, etag: string | undefined) => _.set(`${name}.${id}`, etag)
655
+ }))
656
+
657
+ const pubCfg = yield* $(Effect.context<R2>())
658
+ const pub = "publishEvents" in args
659
+ ? flow(args.publishEvents, Effect.provide(pubCfg))
660
+ : () => Effect.unit
661
+ const changeFeed = yield* $(PubSub.unbounded<[T[], "save" | "remove"]>())
662
+
663
+ const allE = store.all.pipe(Effect.flatMap((items) =>
664
+ Effect.gen(function*($) {
665
+ const { set } = yield* $(cms)
666
+ return items.map((_) => mapReverse(_, set))
667
+ })
668
+ ))
669
+
670
+ const all = Effect.flatMap(
671
+ allE,
672
+ (_) => Effect.forEach(_, (_) => decode(_), { concurrency: "inherit", batching: true }).pipe(Effect.orDie)
673
+ )
653
674
 
654
- const structSchema = schema as unknown as { struct: typeof schema }
655
- const i = ("struct" in structSchema ? structSchema["struct"] : schema).pipe((_) =>
656
- _.ast._tag === "Union"
657
- // we need to get the TypeLiteral, incase of class it's behind a transform...
658
- ? S.union(..._.ast.types.map((_) =>
659
- (S.make(_._tag === "Transform" ? _.from : _) as unknown as Schema<T, From>)
660
- .pipe(S.pick("id"))
661
- ))
662
- : _
663
- .ast
664
- ._tag === "Transform"
665
- ? (S
666
- .make(
667
- _
675
+ const structSchema = schema as unknown as { struct: typeof schema }
676
+ const i = ("struct" in structSchema ? structSchema["struct"] : schema).pipe((_) =>
677
+ _.ast._tag === "Union"
678
+ // we need to get the TypeLiteral, incase of class it's behind a transform...
679
+ ? S.union(..._.ast.types.map((_) =>
680
+ (S.make(_._tag === "Transform" ? _.from : _) as unknown as Schema<T, From>)
681
+ .pipe(S.pick("id"))
682
+ ))
683
+ : _
668
684
  .ast
669
- .from
670
- ) as unknown as Schema<T, From>)
671
- .pipe(S
672
- .pick("id"))
673
- : _
674
- .pipe(S
675
- .pick("id"))
676
- )
677
- const encodeId = flow(i.encode, Effect.provide(rctx))
678
- function findEId(id: From["id"]) {
679
- return store
680
- .find(id)
681
- .flatMap((item) =>
682
- Do(($) => {
683
- const { set } = $(cms)
684
- return item.map((_) => mapReverse(_, set))
685
- })
685
+ ._tag === "Transform"
686
+ ? (S
687
+ .make(
688
+ _
689
+ .ast
690
+ .from
691
+ ) as unknown as Schema<T, From>)
692
+ .pipe(S
693
+ .pick("id"))
694
+ : _
695
+ .pipe(S
696
+ .pick("id"))
697
+ )
698
+ const encodeId = flow(S.encode(i), Effect.provide(rctx))
699
+ function findEId(id: From["id"]) {
700
+ return Effect.flatMap(
701
+ store.find(id),
702
+ (item) =>
703
+ Effect.gen(function*($) {
704
+ const { set } = yield* $(cms)
705
+ return item.pipe(Option.map((_) => mapReverse(_, set)))
706
+ })
686
707
  )
687
- }
688
- function findE(id: T["id"]) {
689
- return encodeId({ id })
690
- .orDie
691
- .map((_) => _.id)
692
- .flatMap(findEId)
693
- }
694
-
695
- function find(id: T["id"]) {
696
- return findE(id).flatMapOpt((_) => decode(_).orDie)
697
- }
698
-
699
- const saveAllE = (a: Iterable<From>) =>
700
- Effect
701
- .sync(() => a.toNonEmptyArray)
702
- .flatMapOpt((a) =>
703
- Do(($) => {
704
- const { get, set } = $(cms)
705
- const items = a.map((_) => mapToPersistenceModel(_, get))
706
- const ret = $(store.batchSet(items))
707
- ret.forEach((_) => set(_.id, _._etag))
708
- })
708
+ }
709
+ function findE(id: T["id"]) {
710
+ return pipe(
711
+ encodeId({ id }),
712
+ Effect.orDie,
713
+ Effect.map((_) => _.id),
714
+ Effect.flatMap(findEId)
709
715
  )
710
- .asUnit
711
-
712
- const saveAll = (a: Iterable<T>) =>
713
- a.toChunk.forEachEffect((_) => encode(_), { concurrency: "inherit", batching: true }).orDie.andThen(saveAllE)
714
-
715
- const saveAndPublish = (items: Iterable<T>, events: Iterable<Evt> = []) => {
716
- const it = items.toChunk
717
- return saveAll(it)
718
- .andThen(Effect.sync(() => events.toNonEmptyArray))
719
- // TODO: for full consistency the events should be stored within the same database transaction, and then picked up.
720
- .flatMapOpt(pub)
721
- .andThen(changeFeed
722
- .publish([it.toArray, "save"]))
723
- .asUnit
724
- }
716
+ }
725
717
 
726
- function removeAndPublish(a: Iterable<T>, events: Iterable<Evt> = []) {
727
- return Effect.gen(function*($) {
728
- const { get, set } = yield* $(cms)
729
- const it = a.toChunk
730
- const items = yield* $(it.forEachEffect((_) => encode(_), { concurrency: "inherit", batching: true }).orDie)
731
- // TODO: we should have a batchRemove on store so the adapter can actually batch...
732
- for (const e of items) {
733
- yield* $(store.remove(mapToPersistenceModel(e, get)))
734
- set(e.id, undefined)
735
- }
736
- yield* $(
737
- Effect
738
- .sync(() => events.toNonEmptyArray)
718
+ function find(id: T["id"]) {
719
+ return Effect.flatMapOption(findE(id), (_) => Effect.orDie(decode(_)))
720
+ }
721
+
722
+ const saveAllE = (a: Iterable<From>) =>
723
+ Effect
724
+ .flatMapOption(
725
+ Effect
726
+ .sync(() => toNonEmptyArray([...a])),
727
+ (a) =>
728
+ Effect.gen(function*($) {
729
+ const { get, set } = yield* $(cms)
730
+ const items = a.map((_) => mapToPersistenceModel(_, get))
731
+ const ret = yield* $(store.batchSet(items))
732
+ ret.forEach((_) => set(_.id, _._etag))
733
+ })
734
+ )
735
+ .pipe(Effect.asUnit)
736
+
737
+ const saveAll = (a: Iterable<T>) =>
738
+ Effect
739
+ .forEach(
740
+ Array.from(a),
741
+ (_) => encode(_),
742
+ { concurrency: "inherit", batching: true }
743
+ )
744
+ .pipe(
745
+ Effect.orDie,
746
+ Effect.andThen(saveAllE)
747
+ )
748
+
749
+ const saveAndPublish = (items: Iterable<T>, events: Iterable<Evt> = []) => {
750
+ const it = Chunk.fromIterable(items)
751
+ return saveAll(it)
752
+ .pipe(
753
+ Effect.andThen(Effect.sync(() => toNonEmptyArray([...events]))),
739
754
  // TODO: for full consistency the events should be stored within the same database transaction, and then picked up.
740
- .flatMapOpt(pub)
741
- )
755
+ (_) => Effect.flatMapOption(_, pub),
756
+ Effect.andThen(changeFeed.publish([Chunk.toArray(it), "save"])),
757
+ Effect.asUnit
758
+ )
759
+ }
742
760
 
743
- yield* $(changeFeed.publish([it.toArray, "remove"]))
744
- })
745
- }
761
+ function removeAndPublish(a: Iterable<T>, events: Iterable<Evt> = []) {
762
+ return Effect.gen(function*($) {
763
+ const { get, set } = yield* $(cms)
764
+ const it = [...a]
765
+ const items = yield* $(
766
+ Effect.forEach(it, (_) => encode(_), { concurrency: "inherit", batching: true }).pipe(Effect.orDie)
767
+ )
768
+ // TODO: we should have a batchRemove on store so the adapter can actually batch...
769
+ for (const e of items) {
770
+ yield* $(store.remove(mapToPersistenceModel(e, get)))
771
+ set(e.id, undefined)
772
+ }
773
+ yield* $(
774
+ Effect
775
+ .sync(() => toNonEmptyArray([...events]))
776
+ // TODO: for full consistency the events should be stored within the same database transaction, and then picked up.
777
+ .pipe((_) => Effect.flatMapOption(_, pub))
778
+ )
779
+
780
+ yield* $(changeFeed.publish([it, "remove"]))
781
+ })
782
+ }
746
783
 
747
- const r: Repository<T, PM, Evt, ItemType> = {
748
- /**
749
- * @internal
750
- */
751
- utils: {
752
- parseMany: (items) =>
753
- cms.flatMap((cm) =>
754
- items
755
- .forEachEffect((_) => decode(mapReverse(_, cm.set)), { concurrency: "inherit", batching: true })
756
- .orDie
757
- ),
758
- parseMany2: (items, schema) =>
759
- cms.flatMap((cm) =>
760
- items
761
- .forEachEffect((_) => schema.decode(mapReverse(_, cm.set) as any), {
762
- concurrency: "inherit",
763
- batching: true
764
- })
765
- .orDie
766
- ),
767
- filter: <U extends keyof PM = keyof PM>(args: FilterArgs<PM, U>) =>
768
- store
769
- .filter(args)
770
- .tap((items) =>
771
- args.select
772
- ? Effect.unit
773
- : cms.map(({ set }) => items.forEach((_) => set((_ as PM).id, (_ as PM)._etag)))
774
- ),
775
- all: store.all.tap((items) => cms.map(({ set }) => items.forEach((_) => set(_.id, _._etag))))
776
- },
777
- mapped: <A, R>(schema: S.Schema<A, any, R>) => {
778
- // const enc = S.encode(schema)
779
- const dec = S.decode(schema)
780
- const encMany = S.encode(S.array(schema))
781
- const decMany = S.decode(S.array(schema))
782
- return {
783
- all: cms
784
- .flatMap((cm) => r.utils.all.map((_) => _.map((_) => mapReverse(_, cm.set))))
785
- .flatMap(decMany)
786
- .map((_) => _ as any[]),
787
- find: (id: PM["id"]) => flatMapOption(findE(id), dec),
788
- query: (b: any) =>
789
- r
790
- .utils
791
- .filter({ filter: b })
792
- .flatMap(decMany)
793
- .map((_) => _ as any[]),
794
- save: (...xes: any[]) => encMany(xes).flatMap((_) => saveAllE(_ as any))
795
- }
796
- },
797
- changeFeed,
798
- itemType: name,
799
- find,
800
- all,
801
- saveAndPublish,
802
- removeAndPublish,
803
- q2: (q: any) => query(r, typeof q === "function" ? q(makeQuery()) : q) as any
804
- }
805
- return r
806
- })
807
- // .withSpan("Repository.make [effect-app/infra]", { attributes: { "repository.model_name": name } })
808
- .withLogSpan("Repository.make: " + name)
784
+ const r: Repository<T, PM, Evt, ItemType> = {
785
+ /**
786
+ * @internal
787
+ */
788
+ utils: {
789
+ parseMany: (items) =>
790
+ Effect.flatMap(cms, (cm) =>
791
+ Effect
792
+ .forEach(items, (_) => decode(mapReverse(_, cm.set)), { concurrency: "inherit", batching: true })
793
+ .pipe(Effect.orDie)),
794
+ parseMany2: (items, schema) =>
795
+ Effect.flatMap(cms, (cm) =>
796
+ Effect
797
+ .forEach(items, (_) => S.decode(schema)(mapReverse(_, cm.set) as any), {
798
+ concurrency: "inherit",
799
+ batching: true
800
+ })
801
+ .pipe(Effect.orDie)),
802
+ filter: <U extends keyof PM = keyof PM>(args: FilterArgs<PM, U>) =>
803
+ store
804
+ .filter(args)
805
+ .pipe(Effect.tap((items) =>
806
+ args.select
807
+ ? Effect.unit
808
+ : Effect.map(cms, ({ set }) => items.forEach((_) => set((_ as PM).id, (_ as PM)._etag)))
809
+ )),
810
+ all: Effect.tap(
811
+ store.all,
812
+ (items) => Effect.map(cms, ({ set }) => items.forEach((_) => set(_.id, _._etag)))
813
+ )
814
+ },
815
+ mapped: <A, R>(schema: S.Schema<A, any, R>) => {
816
+ // const enc = S.encode(schema)
817
+ const dec = S.decode(schema)
818
+ const encMany = S.encode(S.array(schema))
819
+ const decMany = S.decode(S.array(schema))
820
+ return {
821
+ all: cms
822
+ .pipe(
823
+ Effect.flatMap((cm) => Effect.map(r.utils.all, (_) => _.map((_) => mapReverse(_, cm.set)))),
824
+ Effect.flatMap(decMany),
825
+ Effect.map((_) => _ as any[])
826
+ ),
827
+ find: (id: PM["id"]) => flatMapOption(findE(id), dec),
828
+ query: (b: any) =>
829
+ r
830
+ .utils
831
+ .filter({ filter: b })
832
+ .pipe(
833
+ Effect.flatMap(decMany),
834
+ Effect.map((_) => _ as any[])
835
+ ),
836
+ save: (...xes: any[]) => Effect.flatMap(encMany(xes), (_) => saveAllE(_))
837
+ }
838
+ },
839
+ changeFeed,
840
+ itemType: name,
841
+ find,
842
+ all,
843
+ saveAndPublish,
844
+ removeAndPublish,
845
+ q2: (q: any) => query(r, typeof q === "function" ? q(makeQuery()) : q) as any
846
+ }
847
+ return r
848
+ })
849
+ .pipe(Effect
850
+ // .withSpan("Repository.make [effect-app/infra]", { attributes: { "repository.model_name": name } })
851
+ .withLogSpan("Repository.make: " + name))
809
852
  }
810
853
 
811
854
  return {
@@ -829,7 +872,7 @@ export function removeById<
829
872
  self: Repository<T, PM, Evt, ItemType>,
830
873
  id: T["id"]
831
874
  ) {
832
- return self.get(id).flatMap((_) => self.removeAndPublish([_]))
875
+ return get(self, id).pipe(Effect.flatMap((_) => self.removeAndPublish([_])))
833
876
  }
834
877
 
835
878
  export function makeWhere<PM extends { id: string; _etag: string | undefined }>() {
@@ -880,10 +923,10 @@ export function makeStore<
880
923
  function encodeToPM() {
881
924
  const getEtag = () => undefined
882
925
  return (t: T) =>
883
- schema
884
- .encode(t)
885
- .orDie
886
- .map((_) => mapToPersistenceModel(_, getEtag))
926
+ S.encode(schema)(t).pipe(
927
+ Effect.orDie,
928
+ Effect.map((_) => mapToPersistenceModel(_, getEtag))
929
+ )
887
930
  }
888
931
 
889
932
  function mapToPersistenceModel(
@@ -899,18 +942,20 @@ export function makeStore<
899
942
  partitionValue?: (a: PM) => string
900
943
  }
901
944
  ) {
902
- return Do(($) => {
903
- const { make } = $(StoreMaker)
945
+ return Effect.gen(function*($) {
946
+ const { make } = yield* $(StoreMaker)
904
947
 
905
- const store = $(
948
+ const store = yield* $(
906
949
  make<PM, string, R | RInitial, EInitial>(
907
950
  pluralize(name),
908
951
  makeInitial
909
- ? (makeInitial
910
- .flatMap((_) => _.forEachEffect(encodeToPM())))
911
- .withSpan("Repository.makeInitial [effect-app/infra]", {
912
- attributes: { "repository.model_name": name }
913
- })
952
+ ? makeInitial
953
+ .pipe(
954
+ Effect.flatMap(Effect.forEach(encodeToPM())),
955
+ Effect.withSpan("Repository.makeInitial [effect-app/infra]", {
956
+ attributes: { "repository.model_name": name }
957
+ })
958
+ )
914
959
  : undefined,
915
960
  {
916
961
  ...config,
@@ -988,6 +1033,7 @@ export interface RepoFunctions<T extends { id: unknown }, PM extends { id: strin
988
1033
  save: (...items: T[]) => Effect<void, InvalidStateError | OptimisticConcurrencyException, Service>
989
1034
  get: (id: T["id"]) => Effect<T, NotFoundError<ItemType>, Service>
990
1035
 
1036
+ /** @deprecated use q2 */
991
1037
  query: (b: (fn: Q.FilterTest<PM>, fields: Q.Filter<PM, never>) => Q.QueryBuilder<PM>) => Effect<T[], never, Service>
992
1038
  queryLegacy: <S = T>(map: {
993
1039
  filter?: Filter<PM>
@@ -996,8 +1042,64 @@ export interface RepoFunctions<T extends { id: unknown }, PM extends { id: strin
996
1042
  skip?: number
997
1043
  }) => Effect<S[], never, Service>
998
1044
 
1045
+ /** @deprecated use q2 */
999
1046
  mapped: MM<Service, PM, Omit<PM, "_etag">>
1000
1047
 
1048
+ byIdAndSaveWithPure: {
1049
+ <R, A, E, S2 extends T>(
1050
+ id: T["id"],
1051
+ pure: Effect<A, E, FixEnv<R, never, T, S2>>
1052
+ ): Effect<
1053
+ A,
1054
+ InvalidStateError | OptimisticConcurrencyException | E | NotFoundError<ItemType>,
1055
+ | Service
1056
+ | Exclude<R, {
1057
+ env: PureEnv<never, T, S2>
1058
+ }>
1059
+ >
1060
+ }
1061
+
1062
+ q2AndSaveOnePure: {
1063
+ <
1064
+ R2,
1065
+ A,
1066
+ E2,
1067
+ T2 extends T
1068
+ >(
1069
+ q: (initial: Query<Omit<PM, "_etag">>) =>
1070
+ | Query<Omit<PM, "_etag">>
1071
+ | QueryWhere<Omit<PM, "_etag">>,
1072
+ pure: Effect<A, E2, FixEnv<R2, Evt, T, T2>>
1073
+ ): Effect<
1074
+ A,
1075
+ InvalidStateError | OptimisticConcurrencyException | E2 | NotFoundError<ItemType>,
1076
+ | Service
1077
+ | Exclude<R2, {
1078
+ env: PureEnv<Evt, T, T2>
1079
+ }>
1080
+ >
1081
+ }
1082
+ q2AndSavePure: {
1083
+ <
1084
+ R2,
1085
+ A,
1086
+ E2,
1087
+ T2 extends T
1088
+ >(
1089
+ q: (initial: Query<Omit<PM, "_etag">>) =>
1090
+ | Query<Omit<PM, "_etag">>
1091
+ | QueryWhere<Omit<PM, "_etag">>,
1092
+ pure: Effect<A, E2, FixEnv<R2, Evt, readonly T[], readonly T2[]>>
1093
+ ): Effect<
1094
+ A,
1095
+ InvalidStateError | OptimisticConcurrencyException | E2,
1096
+ | Service
1097
+ | Exclude<R2, {
1098
+ env: PureEnv<Evt, readonly T[], readonly T2[]>
1099
+ }>
1100
+ >
1101
+ }
1102
+
1001
1103
  readonly q2: {
1002
1104
  <A, R, From extends FieldValues>(
1003
1105
  q: (initial: Query<Omit<PM, "_etag">>) => QueryProjection<Omit<PM, "_etag"> extends From ? From : never, A, R>
@@ -1015,14 +1117,39 @@ export interface RepoFunctions<T extends { id: unknown }, PM extends { id: strin
1015
1117
 
1016
1118
  const makeRepoFunctions = (tag: any) => {
1017
1119
  const { all } = Effect.serviceConstants(tag) as any
1018
- const { find, get, q2, query, queryLegacy, removeAndPublish, removeById, save, saveAndPublish } = Effect
1019
- .serviceFunctions(
1020
- tag
1021
- ) as any
1120
+ const {
1121
+ byIdAndSaveWithPure,
1122
+ find,
1123
+ get,
1124
+ q2,
1125
+ q2AndSaveOnePure,
1126
+ q2AndSavePure,
1127
+ query,
1128
+ queryLegacy,
1129
+ removeAndPublish,
1130
+ removeById,
1131
+ save,
1132
+ saveAndPublish
1133
+ } = Effect.serviceFunctions(tag) as any
1022
1134
 
1023
1135
  const mapped = (s: any) => tag.map((_: any) => _.mapped(s))
1024
1136
 
1025
- return { all, find, removeById, saveAndPublish, removeAndPublish, save, get, query, queryLegacy, q2, mapped }
1137
+ return {
1138
+ all,
1139
+ byIdAndSaveWithPure,
1140
+ find,
1141
+ removeById,
1142
+ saveAndPublish,
1143
+ removeAndPublish,
1144
+ save,
1145
+ get,
1146
+ query,
1147
+ queryLegacy,
1148
+ q2,
1149
+ mapped,
1150
+ q2AndSaveOnePure,
1151
+ q2AndSavePure
1152
+ }
1026
1153
  }
1027
1154
 
1028
1155
  export const RepositoryBaseImpl = <Service>() => {
@@ -1036,7 +1163,7 @@ export const RepositoryBaseImpl = <Service>() => {
1036
1163
  jitM?: (pm: From) => From
1037
1164
  ): Exact<PM, From & { _etag: string | undefined }> extends true ?
1038
1165
  & (abstract new() => RepositoryBaseC1<T, PM, Evt, ItemType>)
1039
- & Tag<Service, Service>
1166
+ & Context.Tag<Service, Service>
1040
1167
  & Repos<
1041
1168
  T,
1042
1169
  PM,
@@ -1058,7 +1185,7 @@ export const RepositoryBaseImpl = <Service>() => {
1058
1185
  super(itemType)
1059
1186
  }
1060
1187
  static readonly make = mkRepo.make
1061
- static readonly makeWith = ((a: any, b: any) => mkRepo.make(a).map(b)) as any
1188
+ static readonly makeWith = ((a: any, b: any) => Effect.map(mkRepo.make(a), b)) as any
1062
1189
 
1063
1190
  static readonly Where = makeWhere<PM>()
1064
1191
  static readonly Query = Q.QueryBuilder.make<PM>()
@@ -1082,7 +1209,7 @@ export const RepositoryDefaultImpl = <Service>() => {
1082
1209
  & (abstract new(
1083
1210
  impl: Repository<T, PM, Evt, ItemType>
1084
1211
  ) => RepositoryBaseC3<T, PM, Evt, ItemType>)
1085
- & Tag<Service, Service>
1212
+ & Context.Tag<Service, Service>
1086
1213
  & Repos<
1087
1214
  T,
1088
1215
  PM,
@@ -1106,7 +1233,7 @@ export const RepositoryDefaultImpl = <Service>() => {
1106
1233
  super(itemType, impl)
1107
1234
  }
1108
1235
  static readonly make = mkRepo.make
1109
- static readonly makeWith = ((a: any, b: any) => mkRepo.make(a).map(b)) as any
1236
+ static readonly makeWith = ((a: any, b: any) => Effect.map(mkRepo.make(a), b)) as any
1110
1237
 
1111
1238
  static readonly Where = makeWhere<PM>()
1112
1239
  static readonly Query = Q.QueryBuilder.make<PM>()