@thomasfosterau/effect-rdf 0.0.0 → 0.1.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 (776) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +2250 -1
  3. package/dist/Algebra-CGG4oae3.mjs +433 -0
  4. package/dist/Algebra-CGG4oae3.mjs.map +1 -0
  5. package/dist/Algebra-uGsIEOUA.d.mts +446 -0
  6. package/dist/Ast-CPRZmBvk.mjs +552 -0
  7. package/dist/Ast-CPRZmBvk.mjs.map +1 -0
  8. package/dist/Ast-vcw2W-lf.d.mts +827 -0
  9. package/dist/Bindings-Ck3m7JRC.mjs +249 -0
  10. package/dist/Bindings-Ck3m7JRC.mjs.map +1 -0
  11. package/dist/Bindings-DiKpBd7f.d.mts +153 -0
  12. package/dist/ClientErrors-CpXdFX5u.mjs +128 -0
  13. package/dist/ClientErrors-CpXdFX5u.mjs.map +1 -0
  14. package/dist/ClientErrors-D4IZHUM-.d.mts +101 -0
  15. package/dist/ClientFormats-CXomkXLV.mjs +73 -0
  16. package/dist/ClientFormats-CXomkXLV.mjs.map +1 -0
  17. package/dist/ClientFormats-Dm57ZPwR.d.mts +36 -0
  18. package/dist/Csv2Json-DynEcwCh.mjs +194 -0
  19. package/dist/Csv2Json-DynEcwCh.mjs.map +1 -0
  20. package/dist/Csv2Json-aXNVDoXQ.d.mts +40 -0
  21. package/dist/Csv2Rdf-8maXP6mt.d.mts +41 -0
  22. package/dist/Csv2Rdf-DuSEkaKE.mjs +161 -0
  23. package/dist/Csv2Rdf-DuSEkaKE.mjs.map +1 -0
  24. package/dist/Dataset-BlmlcI7J.mjs +782 -0
  25. package/dist/Dataset-BlmlcI7J.mjs.map +1 -0
  26. package/dist/Dataset-DS3ESOcO.d.mts +426 -0
  27. package/dist/Dataset.d.mts +2 -0
  28. package/dist/Dataset.mjs +1 -0
  29. package/dist/Datatype-CxMpamHC.d.mts +212 -0
  30. package/dist/Datatype-DQvkNkiH.mjs +1001 -0
  31. package/dist/Datatype-DQvkNkiH.mjs.map +1 -0
  32. package/dist/Dialect-8ChFj5EX.d.mts +113 -0
  33. package/dist/Dialect-CzVH38uo.mjs +165 -0
  34. package/dist/Dialect-CzVH38uo.mjs.map +1 -0
  35. package/dist/DocumentLoader-D3lZREnB.mjs +346 -0
  36. package/dist/DocumentLoader-D3lZREnB.mjs.map +1 -0
  37. package/dist/DocumentLoader-ZUCEVrW5.d.mts +178 -0
  38. package/dist/DublinCore-AnwqxRx6.mjs +137 -0
  39. package/dist/DublinCore-AnwqxRx6.mjs.map +1 -0
  40. package/dist/DublinCore-Dq-tVA5d.d.mts +119 -0
  41. package/dist/Engine-CYPB3g4h.d.mts +144 -0
  42. package/dist/Engine-DF8PN7g-.mjs +872 -0
  43. package/dist/Engine-DF8PN7g-.mjs.map +1 -0
  44. package/dist/Errors-CMdV1RhU.mjs +37 -0
  45. package/dist/Errors-CMdV1RhU.mjs.map +1 -0
  46. package/dist/Errors-u2bDjUeM.d.mts +30 -0
  47. package/dist/Evaluator-DEsU4d1o.d.mts +50 -0
  48. package/dist/Evaluator-DOY2-guC.mjs +281 -0
  49. package/dist/Evaluator-DOY2-guC.mjs.map +1 -0
  50. package/dist/Exif-CpqniYQd.d.mts +78 -0
  51. package/dist/Exif-DjkCfEB-.mjs +89 -0
  52. package/dist/Exif-DjkCfEB-.mjs.map +1 -0
  53. package/dist/Expression-BIMMvduQ.mjs +230 -0
  54. package/dist/Expression-BIMMvduQ.mjs.map +1 -0
  55. package/dist/Expression-W8A9cyX7.d.mts +89 -0
  56. package/dist/Extract-Bop85jES.mjs +220 -0
  57. package/dist/Extract-Bop85jES.mjs.map +1 -0
  58. package/dist/Extract-C_pCvuTC.d.mts +88 -0
  59. package/dist/Federation-BcNrozc1.d.mts +52 -0
  60. package/dist/Federation-CHScBkaK.mjs +130 -0
  61. package/dist/Federation-CHScBkaK.mjs.map +1 -0
  62. package/dist/Functions-AvjNcId_.mjs +1346 -0
  63. package/dist/Functions-AvjNcId_.mjs.map +1 -0
  64. package/dist/Functions-OQJZP-F6.d.mts +111 -0
  65. package/dist/Generator-C52mmq01.d.mts +50 -0
  66. package/dist/Generator-D3utCJC7.mjs +205 -0
  67. package/dist/Generator-D3utCJC7.mjs.map +1 -0
  68. package/dist/Grammar-CPlSxGH6.mjs +200 -0
  69. package/dist/Grammar-CPlSxGH6.mjs.map +1 -0
  70. package/dist/Grammar-CRhnRoCu.d.mts +148 -0
  71. package/dist/Grammar-D6jZdJQ3.d.mts +169 -0
  72. package/dist/Grammar-mQ8CgE1M.mjs +258 -0
  73. package/dist/Grammar-mQ8CgE1M.mjs.map +1 -0
  74. package/dist/GraphStore-DhUa4nFO.d.mts +45 -0
  75. package/dist/GraphStore-DvbqwKy1.mjs +212 -0
  76. package/dist/GraphStore-DvbqwKy1.mjs.map +1 -0
  77. package/dist/Iri-BB8Ks-BF.d.mts +84 -0
  78. package/dist/Iri-Cr92gsQV.mjs +232 -0
  79. package/dist/Iri-Cr92gsQV.mjs.map +1 -0
  80. package/dist/Iri.d.mts +2 -0
  81. package/dist/Iri.mjs +1 -0
  82. package/dist/Isomorphism-B6qTY-xy.d.mts +28 -0
  83. package/dist/Isomorphism-BmqxhKyJ.mjs +232 -0
  84. package/dist/Isomorphism-BmqxhKyJ.mjs.map +1 -0
  85. package/dist/Isomorphism-DInKnWIy.mjs +390 -0
  86. package/dist/Isomorphism-DInKnWIy.mjs.map +1 -0
  87. package/dist/Isomorphism-DvSfZXLR.d.mts +37 -0
  88. package/dist/Isomorphism.d.mts +2 -0
  89. package/dist/Isomorphism.mjs +1 -0
  90. package/dist/JsonLd-DOwS2FHg.mjs +2836 -0
  91. package/dist/JsonLd-DOwS2FHg.mjs.map +1 -0
  92. package/dist/JsonLd-DobFrQNa.d.mts +242 -0
  93. package/dist/JsonLdError-C9J-BxfG.mjs +106 -0
  94. package/dist/JsonLdError-C9J-BxfG.mjs.map +1 -0
  95. package/dist/JsonLdError-DSOfHkOy.d.mts +43 -0
  96. package/dist/LanguageTag-BCu8rcmX.d.mts +38 -0
  97. package/dist/LanguageTag-BcOpMGZ4.mjs +89 -0
  98. package/dist/LanguageTag-BcOpMGZ4.mjs.map +1 -0
  99. package/dist/LanguageTag.d.mts +2 -0
  100. package/dist/LanguageTag.mjs +1 -0
  101. package/dist/Lexical-Cg0JHrf6.mjs +243 -0
  102. package/dist/Lexical-Cg0JHrf6.mjs.map +1 -0
  103. package/dist/Lexical-D3zySYVS.d.mts +163 -0
  104. package/dist/Manifest-B6xf6mUc.mjs +148 -0
  105. package/dist/Manifest-B6xf6mUc.mjs.map +1 -0
  106. package/dist/Manifest-DQUMRBFr.d.mts +98 -0
  107. package/dist/Mapping-BgG74x3U.d.mts +63 -0
  108. package/dist/Mapping-Dc1ZGirk.mjs +259 -0
  109. package/dist/Mapping-Dc1ZGirk.mjs.map +1 -0
  110. package/dist/Mcp-1DwTTKOK.mjs +48 -0
  111. package/dist/Mcp-1DwTTKOK.mjs.map +1 -0
  112. package/dist/Mcp-d-pX9erx.d.mts +25 -0
  113. package/dist/Message-CK_DGQuu.mjs +95 -0
  114. package/dist/Message-CK_DGQuu.mjs.map +1 -0
  115. package/dist/Message-fIvTJSXM.d.mts +49 -0
  116. package/dist/Metadata-BbffwGDZ.mjs +445 -0
  117. package/dist/Metadata-BbffwGDZ.mjs.map +1 -0
  118. package/dist/Metadata-CEt3yc1-.d.mts +901 -0
  119. package/dist/Metadata-D4HsQNXr.mjs +1273 -0
  120. package/dist/Metadata-D4HsQNXr.mjs.map +1 -0
  121. package/dist/Metadata-nzS7QKRj.d.mts +350 -0
  122. package/dist/Model-DaMmxurZ.d.mts +293 -0
  123. package/dist/Model-DlPzRYhF.mjs +528 -0
  124. package/dist/Model-DlPzRYhF.mjs.map +1 -0
  125. package/dist/N3-BzyV-KIH.mjs +974 -0
  126. package/dist/N3-BzyV-KIH.mjs.map +1 -0
  127. package/dist/N3-DSLnonDn.d.mts +100 -0
  128. package/dist/NQuads-C1VBOJ3-.mjs +117 -0
  129. package/dist/NQuads-C1VBOJ3-.mjs.map +1 -0
  130. package/dist/NQuads-FjFZikFg.d.mts +76 -0
  131. package/dist/NTriples-D-kLSEAf.mjs +120 -0
  132. package/dist/NTriples-D-kLSEAf.mjs.map +1 -0
  133. package/dist/NTriples-D34OspfW.d.mts +76 -0
  134. package/dist/Namespace-ClTUO_ya.d.mts +42 -0
  135. package/dist/Namespace-DHFIsORd.mjs +75 -0
  136. package/dist/Namespace-DHFIsORd.mjs.map +1 -0
  137. package/dist/Namespace.d.mts +2 -0
  138. package/dist/Namespace.mjs +1 -0
  139. package/dist/Namespaces-Bz85vpjW.mjs +235 -0
  140. package/dist/Namespaces-Bz85vpjW.mjs.map +1 -0
  141. package/dist/Namespaces-C1jW6EDo.d.mts +178 -0
  142. package/dist/Optimizer-BWWQRQPY.mjs +168 -0
  143. package/dist/Optimizer-BWWQRQPY.mjs.map +1 -0
  144. package/dist/Optimizer-DUpUow6k.d.mts +26 -0
  145. package/dist/Options-BLBGL4HE.mjs +72 -0
  146. package/dist/Options-BLBGL4HE.mjs.map +1 -0
  147. package/dist/Options-BommQwP9.d.mts +127 -0
  148. package/dist/Packet-CA76wVX3.mjs +197 -0
  149. package/dist/Packet-CA76wVX3.mjs.map +1 -0
  150. package/dist/Packet-Cy5g6XuW.d.mts +130 -0
  151. package/dist/Parser-p1Gyr0QN.d.mts +85 -0
  152. package/dist/Parser-xARsOWXk.mjs +1317 -0
  153. package/dist/Parser-xARsOWXk.mjs.map +1 -0
  154. package/dist/Path-B20Yp8KE.mjs +284 -0
  155. package/dist/Path-B20Yp8KE.mjs.map +1 -0
  156. package/dist/Path-DRB8e-Zn.d.mts +181 -0
  157. package/dist/Pdf-B9RZn--8.d.mts +77 -0
  158. package/dist/Pdf-CKK6dkZn.mjs +89 -0
  159. package/dist/Pdf-CKK6dkZn.mjs.map +1 -0
  160. package/dist/PdfA-CUjSuntT.d.mts +109 -0
  161. package/dist/PdfA-CleOhuL6.mjs +124 -0
  162. package/dist/PdfA-CleOhuL6.mjs.map +1 -0
  163. package/dist/Photoshop-CiHo80qV.mjs +233 -0
  164. package/dist/Photoshop-CiHo80qV.mjs.map +1 -0
  165. package/dist/Photoshop-udKZ0I3N.d.mts +204 -0
  166. package/dist/PrefixMap-BHFPDLO-.mjs +103 -0
  167. package/dist/PrefixMap-BHFPDLO-.mjs.map +1 -0
  168. package/dist/PrefixMap-BMlXrWNd.d.mts +64 -0
  169. package/dist/PrefixMap.d.mts +2 -0
  170. package/dist/PrefixMap.mjs +1 -0
  171. package/dist/Processor-CMmecFsb.mjs +198 -0
  172. package/dist/Processor-CMmecFsb.mjs.map +1 -0
  173. package/dist/Processor-FJPvO0CB.d.mts +435 -0
  174. package/dist/Protocol-BA7OkNgp.mjs +202 -0
  175. package/dist/Protocol-BA7OkNgp.mjs.map +1 -0
  176. package/dist/Protocol-DlSoiIKB.d.mts +108 -0
  177. package/dist/ProtocolErrors-Ckfejnl6.d.mts +84 -0
  178. package/dist/ProtocolErrors-czDPVcX5.mjs +129 -0
  179. package/dist/ProtocolErrors-czDPVcX5.mjs.map +1 -0
  180. package/dist/Query-D9A6LOpP.mjs +364 -0
  181. package/dist/Query-D9A6LOpP.mjs.map +1 -0
  182. package/dist/Query-KqSkTYyG.d.mts +96 -0
  183. package/dist/QueryBuilder-BLK9Vfbz.mjs +674 -0
  184. package/dist/QueryBuilder-BLK9Vfbz.mjs.map +1 -0
  185. package/dist/QueryBuilder-DUqh4ECe.d.mts +529 -0
  186. package/dist/RdfJs-D6-49XB5.mjs +86 -0
  187. package/dist/RdfJs-D6-49XB5.mjs.map +1 -0
  188. package/dist/RdfJs-DXFqdWrd.d.mts +76 -0
  189. package/dist/RdfJs.d.mts +2 -0
  190. package/dist/RdfJs.mjs +1 -0
  191. package/dist/RdfJson-5aKPDlPS.d.mts +297 -0
  192. package/dist/RdfJson-BNocgW4f.mjs +548 -0
  193. package/dist/RdfJson-BNocgW4f.mjs.map +1 -0
  194. package/dist/RdfXml-DJ9G4gOq.mjs +1014 -0
  195. package/dist/RdfXml-DJ9G4gOq.mjs.map +1 -0
  196. package/dist/RdfXml-_N7yxWEp.d.mts +149 -0
  197. package/dist/Rdfs-BRVPsAjc.d.mts +84 -0
  198. package/dist/Rdfs-CyY2wVHI.mjs +167 -0
  199. package/dist/Rdfs-CyY2wVHI.mjs.map +1 -0
  200. package/dist/Rdfs.d.mts +2 -0
  201. package/dist/Rdfs.mjs +1 -0
  202. package/dist/Reasoner-BxYhx9s7.d.mts +94 -0
  203. package/dist/Reasoner-Cw90zrjv.mjs +798 -0
  204. package/dist/Reasoner-Cw90zrjv.mjs.map +1 -0
  205. package/dist/Reification-BmN4EfnM.d.mts +40 -0
  206. package/dist/Reification-dpqQvjDE.mjs +82 -0
  207. package/dist/Reification-dpqQvjDE.mjs.map +1 -0
  208. package/dist/Reification.d.mts +2 -0
  209. package/dist/Reification.mjs +1 -0
  210. package/dist/Report-XHs8htzK.mjs +121 -0
  211. package/dist/Report-XHs8htzK.mjs.map +1 -0
  212. package/dist/Report-hcXsc_19.d.mts +115 -0
  213. package/dist/Resource-B1cI8FyJ.d.mts +218 -0
  214. package/dist/Resource-sIEeNh15.mjs +374 -0
  215. package/dist/Resource-sIEeNh15.mjs.map +1 -0
  216. package/dist/Resource.d.mts +2 -0
  217. package/dist/Resource.mjs +1 -0
  218. package/dist/Results-BVNEC-Wt.d.mts +277 -0
  219. package/dist/Results-peJjGA2V.mjs +621 -0
  220. package/dist/Results-peJjGA2V.mjs.map +1 -0
  221. package/dist/ResultsStream-BhF0OcNn.mjs +639 -0
  222. package/dist/ResultsStream-BhF0OcNn.mjs.map +1 -0
  223. package/dist/ResultsStream-toYMXrOe.d.mts +100 -0
  224. package/dist/SemAct-CDchtk49.d.mts +96 -0
  225. package/dist/SemAct-CmyT4yI8.mjs +118 -0
  226. package/dist/SemAct-CmyT4yI8.mjs.map +1 -0
  227. package/dist/Serialization-DP9H5bYQ.mjs +514 -0
  228. package/dist/Serialization-DP9H5bYQ.mjs.map +1 -0
  229. package/dist/Serialization-Df8iVauT.d.mts +392 -0
  230. package/dist/Serialization.d.mts +2 -0
  231. package/dist/Serialization.mjs +1 -0
  232. package/dist/ServerFormats-CrRnjjf6.mjs +64 -0
  233. package/dist/ServerFormats-CrRnjjf6.mjs.map +1 -0
  234. package/dist/ServerFormats-DjC9NsO_.d.mts +36 -0
  235. package/dist/ServiceDescription-BERsvg-k.d.mts +54 -0
  236. package/dist/ServiceDescription-Dq5hxeGy.mjs +97 -0
  237. package/dist/ServiceDescription-Dq5hxeGy.mjs.map +1 -0
  238. package/dist/ShExC-Ctf-06CL.d.mts +67 -0
  239. package/dist/ShExC-DJbB19i3.mjs +1181 -0
  240. package/dist/ShExC-DJbB19i3.mjs.map +1 -0
  241. package/dist/ShExError-BeYFD9rv.d.mts +61 -0
  242. package/dist/ShExError-CVtq2NnM.mjs +64 -0
  243. package/dist/ShExError-CVtq2NnM.mjs.map +1 -0
  244. package/dist/ShExJ-C1u_wgyD.d.mts +531 -0
  245. package/dist/ShExJ-COiPd9Xw.mjs +532 -0
  246. package/dist/ShExJ-COiPd9Xw.mjs.map +1 -0
  247. package/dist/ShExR-ByR4mCh-.mjs +480 -0
  248. package/dist/ShExR-ByR4mCh-.mjs.map +1 -0
  249. package/dist/ShExR-CqONNNBz.d.mts +40 -0
  250. package/dist/ShapeMap-C422pxKl.d.mts +140 -0
  251. package/dist/ShapeMap-CsgKxB2G.mjs +181 -0
  252. package/dist/ShapeMap-CsgKxB2G.mjs.map +1 -0
  253. package/dist/Shapes-18GjfyBV.mjs +597 -0
  254. package/dist/Shapes-18GjfyBV.mjs.map +1 -0
  255. package/dist/Shapes-BQFDFc4Q.d.mts +306 -0
  256. package/dist/Sparql-BiYFMSpl.mjs +29 -0
  257. package/dist/Sparql-BiYFMSpl.mjs.map +1 -0
  258. package/dist/Sparql-DecpWTPh.d.mts +97 -0
  259. package/dist/SparqlClient-C_CjXbwj.mjs +333 -0
  260. package/dist/SparqlClient-C_CjXbwj.mjs.map +1 -0
  261. package/dist/SparqlClient-UPc88SHy.d.mts +290 -0
  262. package/dist/SparqlServer-CbUW-pVj.d.mts +71 -0
  263. package/dist/SparqlServer-Db7w7Cll.mjs +308 -0
  264. package/dist/SparqlServer-Db7w7Cll.mjs.map +1 -0
  265. package/dist/SqlStore-BBqFx-Wl.mjs +684 -0
  266. package/dist/SqlStore-BBqFx-Wl.mjs.map +1 -0
  267. package/dist/SqlStore-CCJo5I-e.d.mts +117 -0
  268. package/dist/Store-D0jmVfb3.d.mts +166 -0
  269. package/dist/Store-DH3Ow1GO.mjs +162 -0
  270. package/dist/Store-DH3Ow1GO.mjs.map +1 -0
  271. package/dist/Structure-BjMo4Bkc.mjs +334 -0
  272. package/dist/Structure-BjMo4Bkc.mjs.map +1 -0
  273. package/dist/Structure-n4CmDiab.d.mts +63 -0
  274. package/dist/Table-BGgm9nbM.mjs +538 -0
  275. package/dist/Table-BGgm9nbM.mjs.map +1 -0
  276. package/dist/Table-C3reiVrb.d.mts +261 -0
  277. package/dist/Term-B_4ezyXq.d.mts +619 -0
  278. package/dist/Term-CFLG1qu4.mjs +991 -0
  279. package/dist/Term-CFLG1qu4.mjs.map +1 -0
  280. package/dist/Term.d.mts +2 -0
  281. package/dist/Term.mjs +1 -0
  282. package/dist/TermCodec-CDZiEztW.mjs +397 -0
  283. package/dist/TermCodec-CDZiEztW.mjs.map +1 -0
  284. package/dist/TermCodec-_03bDXr0.d.mts +209 -0
  285. package/dist/TermCodec.d.mts +2 -0
  286. package/dist/TermCodec.mjs +1 -0
  287. package/dist/TermJson-BOPe0yve.d.mts +232 -0
  288. package/dist/TermJson-FAg3lvjl.mjs +142 -0
  289. package/dist/TermJson-FAg3lvjl.mjs.map +1 -0
  290. package/dist/TermJson.d.mts +2 -0
  291. package/dist/TermJson.mjs +1 -0
  292. package/dist/TermSchema-Bn9CoaYA.mjs +30 -0
  293. package/dist/TermSchema-Bn9CoaYA.mjs.map +1 -0
  294. package/dist/TermSchema-DBO6MroX.d.mts +6 -0
  295. package/dist/Testing-B-aPCpmu.mjs +63 -0
  296. package/dist/Testing-B-aPCpmu.mjs.map +1 -0
  297. package/dist/Testing-CF6s8P3O.d.mts +53 -0
  298. package/dist/Tiff-CR-2QeSI.d.mts +148 -0
  299. package/dist/Tiff-DlsOlZPM.mjs +169 -0
  300. package/dist/Tiff-DlsOlZPM.mjs.map +1 -0
  301. package/dist/Tools-7MdRKccr.d.mts +583 -0
  302. package/dist/Tools-ryxphZbI.mjs +329 -0
  303. package/dist/Tools-ryxphZbI.mjs.map +1 -0
  304. package/dist/Translate-B0YKKANS.d.mts +37 -0
  305. package/dist/Translate-gzWPq0Ia.mjs +308 -0
  306. package/dist/Translate-gzWPq0Ia.mjs.map +1 -0
  307. package/dist/Translation-DC9rLm2y.mjs +1535 -0
  308. package/dist/Translation-DC9rLm2y.mjs.map +1 -0
  309. package/dist/Translation-K4L9XBqX.d.mts +103 -0
  310. package/dist/TriG-BkqtqZ6Y.mjs +125 -0
  311. package/dist/TriG-BkqtqZ6Y.mjs.map +1 -0
  312. package/dist/TriG-xDjdDatp.d.mts +86 -0
  313. package/dist/Turtle-Bv1_bisW.d.mts +85 -0
  314. package/dist/Turtle-CZVUOtwl.mjs +133 -0
  315. package/dist/Turtle-CZVUOtwl.mjs.map +1 -0
  316. package/dist/ValidationReport-DBdJshW5.mjs +285 -0
  317. package/dist/ValidationReport-DBdJshW5.mjs.map +1 -0
  318. package/dist/ValidationReport-Dx3WxY0h.d.mts +192 -0
  319. package/dist/Validator-227ff9Rn.d.mts +179 -0
  320. package/dist/Validator-BzXMKDeJ.mjs +1162 -0
  321. package/dist/Validator-BzXMKDeJ.mjs.map +1 -0
  322. package/dist/Validator-Dl8cih5V.d.mts +207 -0
  323. package/dist/Validator-DmUfMbpL.mjs +568 -0
  324. package/dist/Validator-DmUfMbpL.mjs.map +1 -0
  325. package/dist/Vocab-DceKywpq.mjs +168 -0
  326. package/dist/Vocab-DceKywpq.mjs.map +1 -0
  327. package/dist/Vocab-Df-L-IwZ.d.mts +46 -0
  328. package/dist/Vocab-Do56UgBX.d.mts +81 -0
  329. package/dist/Vocab-TfpWG1Ne.mjs +118 -0
  330. package/dist/Vocab-TfpWG1Ne.mjs.map +1 -0
  331. package/dist/Vocab.d.mts +2 -0
  332. package/dist/Vocab.mjs +1 -0
  333. package/dist/Vocabulary-C6-GPOy4.d.mts +22 -0
  334. package/dist/Vocabulary-CnQl-_Z4.mjs +179 -0
  335. package/dist/Vocabulary-CnQl-_Z4.mjs.map +1 -0
  336. package/dist/Xml-B7iihYCS.mjs +976 -0
  337. package/dist/Xml-B7iihYCS.mjs.map +1 -0
  338. package/dist/Xml-CmfHS7SW.d.mts +267 -0
  339. package/dist/Xmp-D7CKA7MZ.d.mts +111 -0
  340. package/dist/Xmp-DCGN9pOD.mjs +307 -0
  341. package/dist/Xmp-DCGN9pOD.mjs.map +1 -0
  342. package/dist/XmpBasic-CP38jpR_.mjs +73 -0
  343. package/dist/XmpBasic-CP38jpR_.mjs.map +1 -0
  344. package/dist/XmpBasic-Cmbe53rQ.d.mts +64 -0
  345. package/dist/XmpMM-BfL_TgJF.mjs +73 -0
  346. package/dist/XmpMM-BfL_TgJF.mjs.map +1 -0
  347. package/dist/XmpMM-Dqm3IX8p.d.mts +63 -0
  348. package/dist/XmpRights-BKPtoI5L.mjs +73 -0
  349. package/dist/XmpRights-BKPtoI5L.mjs.map +1 -0
  350. package/dist/XmpRights-CaALZQz2.d.mts +63 -0
  351. package/dist/Xsd-Cdgx5zRB.mjs +405 -0
  352. package/dist/Xsd-Cdgx5zRB.mjs.map +1 -0
  353. package/dist/Xsd-D2elNhSm.d.mts +187 -0
  354. package/dist/Xsd.d.mts +2 -0
  355. package/dist/Xsd.mjs +1 -0
  356. package/dist/accessors-CEjaojuQ.mjs +28 -0
  357. package/dist/accessors-CEjaojuQ.mjs.map +1 -0
  358. package/dist/codec-Lb2T96rv.d.mts +20 -0
  359. package/dist/codec-QNo7IdJF.mjs +389 -0
  360. package/dist/codec-QNo7IdJF.mjs.map +1 -0
  361. package/dist/csvw/Csv2Json.d.mts +2 -0
  362. package/dist/csvw/Csv2Json.mjs +1 -0
  363. package/dist/csvw/Csv2Rdf.d.mts +2 -0
  364. package/dist/csvw/Csv2Rdf.mjs +1 -0
  365. package/dist/csvw/Datatype.d.mts +2 -0
  366. package/dist/csvw/Datatype.mjs +1 -0
  367. package/dist/csvw/Metadata.d.mts +2 -0
  368. package/dist/csvw/Metadata.mjs +1 -0
  369. package/dist/csvw/Processor.d.mts +2 -0
  370. package/dist/csvw/Processor.mjs +1 -0
  371. package/dist/csvw/Report.d.mts +2 -0
  372. package/dist/csvw/Report.mjs +1 -0
  373. package/dist/csvw/Table.d.mts +2 -0
  374. package/dist/csvw/Table.mjs +1 -0
  375. package/dist/csvw/index.d.mts +8 -0
  376. package/dist/csvw/index.mjs +8 -0
  377. package/dist/index-Cms2TYfC.d.mts +16 -0
  378. package/dist/index-Ct8xFmRs.d.mts +7 -0
  379. package/dist/index-D4QFwOjm.d.mts +28 -0
  380. package/dist/index.d.mts +18 -0
  381. package/dist/index.mjs +17 -0
  382. package/dist/jsonld/DocumentLoader.d.mts +2 -0
  383. package/dist/jsonld/DocumentLoader.mjs +1 -0
  384. package/dist/jsonld/JsonLd.d.mts +2 -0
  385. package/dist/jsonld/JsonLd.mjs +1 -0
  386. package/dist/jsonld/JsonLdError.d.mts +2 -0
  387. package/dist/jsonld/JsonLdError.mjs +1 -0
  388. package/dist/jsonld/index.d.mts +4 -0
  389. package/dist/jsonld/index.mjs +4 -0
  390. package/dist/lists-D-OpQ0Ir.mjs +77 -0
  391. package/dist/lists-D-OpQ0Ir.mjs.map +1 -0
  392. package/dist/loop-D5-gNx9K.mjs +21 -0
  393. package/dist/loop-D5-gNx9K.mjs.map +1 -0
  394. package/dist/loop-DZ2hXlr_.mjs +21 -0
  395. package/dist/loop-DZ2hXlr_.mjs.map +1 -0
  396. package/dist/n3/Isomorphism.d.mts +2 -0
  397. package/dist/n3/Isomorphism.mjs +1 -0
  398. package/dist/n3/Mapping.d.mts +2 -0
  399. package/dist/n3/Mapping.mjs +1 -0
  400. package/dist/n3/Model.d.mts +2 -0
  401. package/dist/n3/Model.mjs +1 -0
  402. package/dist/n3/N3.d.mts +2 -0
  403. package/dist/n3/N3.mjs +1 -0
  404. package/dist/n3/Reasoner.d.mts +2 -0
  405. package/dist/n3/Reasoner.mjs +2 -0
  406. package/dist/n3/Vocab.d.mts +2 -0
  407. package/dist/n3/Vocab.mjs +1 -0
  408. package/dist/n3/index.d.mts +7 -0
  409. package/dist/n3/index.mjs +7 -0
  410. package/dist/ntriples/Grammar.d.mts +2 -0
  411. package/dist/ntriples/Grammar.mjs +1 -0
  412. package/dist/ntriples/Lexical.d.mts +2 -0
  413. package/dist/ntriples/Lexical.mjs +1 -0
  414. package/dist/ntriples/NQuads.d.mts +2 -0
  415. package/dist/ntriples/NQuads.mjs +1 -0
  416. package/dist/ntriples/NTriples.d.mts +2 -0
  417. package/dist/ntriples/NTriples.mjs +1 -0
  418. package/dist/ntriples/index.d.mts +5 -0
  419. package/dist/ntriples/index.mjs +5 -0
  420. package/dist/rdfjson/RdfJson.d.mts +2 -0
  421. package/dist/rdfjson/RdfJson.mjs +1 -0
  422. package/dist/rdfjson/index.d.mts +2 -0
  423. package/dist/rdfjson/index.mjs +1 -0
  424. package/dist/rdfxml/RdfXml.d.mts +2 -0
  425. package/dist/rdfxml/RdfXml.mjs +1 -0
  426. package/dist/rdfxml/Xml.d.mts +2 -0
  427. package/dist/rdfxml/Xml.mjs +1 -0
  428. package/dist/rdfxml/index.d.mts +3 -0
  429. package/dist/rdfxml/index.mjs +3 -0
  430. package/dist/rolldown-runtime-D8jQpDG7.mjs +12 -0
  431. package/dist/serialize-96KBvKaf.mjs +1463 -0
  432. package/dist/serialize-96KBvKaf.mjs.map +1 -0
  433. package/dist/serialize-DsoXdM6n.d.mts +37 -0
  434. package/dist/shacl/Message.d.mts +2 -0
  435. package/dist/shacl/Message.mjs +1 -0
  436. package/dist/shacl/Path.d.mts +2 -0
  437. package/dist/shacl/Path.mjs +1 -0
  438. package/dist/shacl/Shapes.d.mts +2 -0
  439. package/dist/shacl/Shapes.mjs +1 -0
  440. package/dist/shacl/Sparql.d.mts +2 -0
  441. package/dist/shacl/Sparql.mjs +1 -0
  442. package/dist/shacl/ValidationReport.d.mts +2 -0
  443. package/dist/shacl/ValidationReport.mjs +1 -0
  444. package/dist/shacl/Validator.d.mts +2 -0
  445. package/dist/shacl/Validator.mjs +1 -0
  446. package/dist/shacl/Vocabulary.d.mts +2 -0
  447. package/dist/shacl/Vocabulary.mjs +1 -0
  448. package/dist/shacl/index.d.mts +9 -0
  449. package/dist/shacl/index.mjs +8 -0
  450. package/dist/shex/SemAct.d.mts +2 -0
  451. package/dist/shex/SemAct.mjs +1 -0
  452. package/dist/shex/ShExC.d.mts +2 -0
  453. package/dist/shex/ShExC.mjs +1 -0
  454. package/dist/shex/ShExError.d.mts +2 -0
  455. package/dist/shex/ShExError.mjs +1 -0
  456. package/dist/shex/ShExJ.d.mts +2 -0
  457. package/dist/shex/ShExJ.mjs +2 -0
  458. package/dist/shex/ShExR.d.mts +2 -0
  459. package/dist/shex/ShExR.mjs +1 -0
  460. package/dist/shex/ShapeMap.d.mts +2 -0
  461. package/dist/shex/ShapeMap.mjs +1 -0
  462. package/dist/shex/Structure.d.mts +2 -0
  463. package/dist/shex/Structure.mjs +2 -0
  464. package/dist/shex/Validator.d.mts +2 -0
  465. package/dist/shex/Validator.mjs +4 -0
  466. package/dist/shex/index.d.mts +9 -0
  467. package/dist/shex/index.mjs +9 -0
  468. package/dist/sparql/Algebra.d.mts +2 -0
  469. package/dist/sparql/Algebra.mjs +1 -0
  470. package/dist/sparql/Ast.d.mts +2 -0
  471. package/dist/sparql/Ast.mjs +1 -0
  472. package/dist/sparql/Bindings.d.mts +2 -0
  473. package/dist/sparql/Bindings.mjs +1 -0
  474. package/dist/sparql/ClientErrors.d.mts +2 -0
  475. package/dist/sparql/ClientErrors.mjs +1 -0
  476. package/dist/sparql/ClientFormats.d.mts +2 -0
  477. package/dist/sparql/ClientFormats.mjs +1 -0
  478. package/dist/sparql/Engine.d.mts +2 -0
  479. package/dist/sparql/Engine.mjs +1 -0
  480. package/dist/sparql/Errors.d.mts +2 -0
  481. package/dist/sparql/Errors.mjs +1 -0
  482. package/dist/sparql/Expression.d.mts +2 -0
  483. package/dist/sparql/Expression.mjs +1 -0
  484. package/dist/sparql/Federation.d.mts +2 -0
  485. package/dist/sparql/Federation.mjs +1 -0
  486. package/dist/sparql/Functions.d.mts +2 -0
  487. package/dist/sparql/Functions.mjs +1 -0
  488. package/dist/sparql/Generator.d.mts +2 -0
  489. package/dist/sparql/Generator.mjs +1 -0
  490. package/dist/sparql/GraphStore.d.mts +2 -0
  491. package/dist/sparql/GraphStore.mjs +1 -0
  492. package/dist/sparql/Optimizer.d.mts +2 -0
  493. package/dist/sparql/Optimizer.mjs +1 -0
  494. package/dist/sparql/Options.d.mts +2 -0
  495. package/dist/sparql/Options.mjs +1 -0
  496. package/dist/sparql/Parser.d.mts +2 -0
  497. package/dist/sparql/Parser.mjs +1 -0
  498. package/dist/sparql/Protocol.d.mts +2 -0
  499. package/dist/sparql/Protocol.mjs +1 -0
  500. package/dist/sparql/ProtocolErrors.d.mts +2 -0
  501. package/dist/sparql/ProtocolErrors.mjs +1 -0
  502. package/dist/sparql/QueryBuilder.d.mts +2 -0
  503. package/dist/sparql/QueryBuilder.mjs +1 -0
  504. package/dist/sparql/Results.d.mts +2 -0
  505. package/dist/sparql/Results.mjs +1 -0
  506. package/dist/sparql/ResultsStream.d.mts +2 -0
  507. package/dist/sparql/ResultsStream.mjs +1 -0
  508. package/dist/sparql/ServerFormats.d.mts +2 -0
  509. package/dist/sparql/ServerFormats.mjs +1 -0
  510. package/dist/sparql/ServiceDescription.d.mts +2 -0
  511. package/dist/sparql/ServiceDescription.mjs +1 -0
  512. package/dist/sparql/SparqlClient.d.mts +2 -0
  513. package/dist/sparql/SparqlClient.mjs +1 -0
  514. package/dist/sparql/SparqlServer.d.mts +2 -0
  515. package/dist/sparql/SparqlServer.mjs +1 -0
  516. package/dist/sparql/Store.d.mts +2 -0
  517. package/dist/sparql/Store.mjs +1 -0
  518. package/dist/sparql/TermSchema.d.mts +3 -0
  519. package/dist/sparql/TermSchema.mjs +2 -0
  520. package/dist/sparql/Testing.d.mts +2 -0
  521. package/dist/sparql/Testing.mjs +1 -0
  522. package/dist/sparql/Translate.d.mts +2 -0
  523. package/dist/sparql/Translate.mjs +1 -0
  524. package/dist/sparql/ai/Mcp.d.mts +2 -0
  525. package/dist/sparql/ai/Mcp.mjs +1 -0
  526. package/dist/sparql/ai/Tools.d.mts +2 -0
  527. package/dist/sparql/ai/Tools.mjs +1 -0
  528. package/dist/sparql/ai/index.d.mts +3 -0
  529. package/dist/sparql/ai/index.mjs +3 -0
  530. package/dist/sparql/index.d.mts +30 -0
  531. package/dist/sparql/index.mjs +29 -0
  532. package/dist/sparql/shacl/Evaluator.d.mts +2 -0
  533. package/dist/sparql/shacl/Evaluator.mjs +1 -0
  534. package/dist/sparql/shacl/Query.d.mts +2 -0
  535. package/dist/sparql/shacl/Query.mjs +1 -0
  536. package/dist/sparql/shacl/index.d.mts +3 -0
  537. package/dist/sparql/shacl/index.mjs +3 -0
  538. package/dist/sparql/sql/Dialect.d.mts +2 -0
  539. package/dist/sparql/sql/Dialect.mjs +1 -0
  540. package/dist/sparql/sql/SqlStore.d.mts +2 -0
  541. package/dist/sparql/sql/SqlStore.mjs +1 -0
  542. package/dist/sparql/sql/Translation.d.mts +2 -0
  543. package/dist/sparql/sql/Translation.mjs +1 -0
  544. package/dist/sparql/sql/index.d.mts +4 -0
  545. package/dist/sparql/sql/index.mjs +4 -0
  546. package/dist/stringMap-D5YIpYtR.mjs +38 -0
  547. package/dist/stringMap-D5YIpYtR.mjs.map +1 -0
  548. package/dist/tokens-C6BzeodQ.mjs +24 -0
  549. package/dist/tokens-C6BzeodQ.mjs.map +1 -0
  550. package/dist/turtle/Grammar.d.mts +3 -0
  551. package/dist/turtle/Grammar.mjs +3 -0
  552. package/dist/turtle/Manifest.d.mts +2 -0
  553. package/dist/turtle/Manifest.mjs +1 -0
  554. package/dist/turtle/TriG.d.mts +2 -0
  555. package/dist/turtle/TriG.mjs +1 -0
  556. package/dist/turtle/Turtle.d.mts +2 -0
  557. package/dist/turtle/Turtle.mjs +1 -0
  558. package/dist/turtle/index.d.mts +5 -0
  559. package/dist/turtle/index.mjs +5 -0
  560. package/dist/xmp/DublinCore.d.mts +2 -0
  561. package/dist/xmp/DublinCore.mjs +1 -0
  562. package/dist/xmp/Exif.d.mts +2 -0
  563. package/dist/xmp/Exif.mjs +1 -0
  564. package/dist/xmp/Extract.d.mts +2 -0
  565. package/dist/xmp/Extract.mjs +1 -0
  566. package/dist/xmp/Metadata.d.mts +2 -0
  567. package/dist/xmp/Metadata.mjs +1 -0
  568. package/dist/xmp/Namespaces.d.mts +2 -0
  569. package/dist/xmp/Namespaces.mjs +1 -0
  570. package/dist/xmp/Packet.d.mts +2 -0
  571. package/dist/xmp/Packet.mjs +1 -0
  572. package/dist/xmp/Pdf.d.mts +2 -0
  573. package/dist/xmp/Pdf.mjs +1 -0
  574. package/dist/xmp/PdfA.d.mts +2 -0
  575. package/dist/xmp/PdfA.mjs +1 -0
  576. package/dist/xmp/Photoshop.d.mts +2 -0
  577. package/dist/xmp/Photoshop.mjs +1 -0
  578. package/dist/xmp/Tiff.d.mts +2 -0
  579. package/dist/xmp/Tiff.mjs +1 -0
  580. package/dist/xmp/Xmp.d.mts +2 -0
  581. package/dist/xmp/Xmp.mjs +3 -0
  582. package/dist/xmp/XmpBasic.d.mts +2 -0
  583. package/dist/xmp/XmpBasic.mjs +1 -0
  584. package/dist/xmp/XmpMM.d.mts +2 -0
  585. package/dist/xmp/XmpMM.mjs +1 -0
  586. package/dist/xmp/XmpRights.d.mts +2 -0
  587. package/dist/xmp/XmpRights.mjs +1 -0
  588. package/dist/xmp/index.d.mts +15 -0
  589. package/dist/xmp/index.mjs +15 -0
  590. package/package.json +187 -3
  591. package/src/Dataset.ts +1085 -0
  592. package/src/Iri.ts +322 -0
  593. package/src/Isomorphism.ts +319 -0
  594. package/src/LanguageTag.ts +98 -0
  595. package/src/Namespace.ts +100 -0
  596. package/src/PrefixMap.ts +117 -0
  597. package/src/RdfJs.ts +146 -0
  598. package/src/Rdfs.ts +241 -0
  599. package/src/Reification.ts +103 -0
  600. package/src/Resource.ts +873 -0
  601. package/src/Serialization.ts +775 -0
  602. package/src/Term.ts +1300 -0
  603. package/src/TermCodec.ts +505 -0
  604. package/src/TermJson.ts +313 -0
  605. package/src/Vocab.ts +161 -0
  606. package/src/Xsd.ts +573 -0
  607. package/src/csvw/Csv2Json.ts +265 -0
  608. package/src/csvw/Csv2Rdf.ts +268 -0
  609. package/src/csvw/Datatype.ts +589 -0
  610. package/src/csvw/Metadata.ts +1523 -0
  611. package/src/csvw/Processor.ts +276 -0
  612. package/src/csvw/Report.ts +135 -0
  613. package/src/csvw/Table.ts +759 -0
  614. package/src/csvw/index.ts +22 -0
  615. package/src/csvw/internal/dateFormat.ts +202 -0
  616. package/src/csvw/internal/json.ts +104 -0
  617. package/src/csvw/internal/numberFormat.ts +369 -0
  618. package/src/csvw/internal/object.ts +23 -0
  619. package/src/csvw/internal/uriTemplate.ts +130 -0
  620. package/src/csvw/internal/url.ts +93 -0
  621. package/src/csvw/internal/vocab.ts +282 -0
  622. package/src/index.ts +40 -0
  623. package/src/internal/arbitrary.ts +148 -0
  624. package/src/internal/loop.ts +24 -0
  625. package/src/internal/pending.ts +20 -0
  626. package/src/internal/textDecoder.ts +183 -0
  627. package/src/jsonld/DocumentLoader.ts +512 -0
  628. package/src/jsonld/JsonLd.ts +847 -0
  629. package/src/jsonld/JsonLdError.ts +105 -0
  630. package/src/jsonld/index.ts +13 -0
  631. package/src/jsonld/internal/compact.ts +852 -0
  632. package/src/jsonld/internal/context.ts +781 -0
  633. package/src/jsonld/internal/expand.ts +614 -0
  634. package/src/jsonld/internal/flatten.ts +243 -0
  635. package/src/jsonld/internal/frame.ts +559 -0
  636. package/src/jsonld/internal/iri.ts +52 -0
  637. package/src/jsonld/internal/json.ts +19 -0
  638. package/src/jsonld/internal/linkHeader.ts +60 -0
  639. package/src/jsonld/internal/rdf.ts +481 -0
  640. package/src/jsonld/internal/util.ts +367 -0
  641. package/src/n3/Isomorphism.ts +476 -0
  642. package/src/n3/Mapping.ts +332 -0
  643. package/src/n3/Model.ts +696 -0
  644. package/src/n3/N3.ts +237 -0
  645. package/src/n3/Reasoner.ts +568 -0
  646. package/src/n3/Vocab.ts +111 -0
  647. package/src/n3/index.ts +21 -0
  648. package/src/n3/internal/builtins.ts +668 -0
  649. package/src/n3/internal/guards.ts +23 -0
  650. package/src/n3/internal/lists.ts +106 -0
  651. package/src/n3/internal/loop.ts +28 -0
  652. package/src/n3/internal/parser.ts +1032 -0
  653. package/src/n3/internal/writer.ts +344 -0
  654. package/src/ntriples/Grammar.ts +317 -0
  655. package/src/ntriples/Lexical.ts +321 -0
  656. package/src/ntriples/NQuads.ts +140 -0
  657. package/src/ntriples/NTriples.ts +143 -0
  658. package/src/ntriples/index.ts +14 -0
  659. package/src/ntriples/internal/codec.ts +229 -0
  660. package/src/ntriples/internal/lineParser.ts +326 -0
  661. package/src/ntriples/internal/loop.ts +14 -0
  662. package/src/rdfjson/RdfJson.ts +806 -0
  663. package/src/rdfjson/index.ts +9 -0
  664. package/src/rdfjson/internal/json.ts +19 -0
  665. package/src/rdfxml/RdfXml.ts +1408 -0
  666. package/src/rdfxml/Xml.ts +419 -0
  667. package/src/rdfxml/index.ts +11 -0
  668. package/src/rdfxml/internal/chars.ts +73 -0
  669. package/src/rdfxml/internal/loop.ts +24 -0
  670. package/src/rdfxml/internal/parser.ts +1265 -0
  671. package/src/shacl/Message.ts +102 -0
  672. package/src/shacl/Path.ts +483 -0
  673. package/src/shacl/Shapes.ts +913 -0
  674. package/src/shacl/Sparql.ts +128 -0
  675. package/src/shacl/ValidationReport.ts +438 -0
  676. package/src/shacl/Validator.ts +1156 -0
  677. package/src/shacl/Vocabulary.ts +180 -0
  678. package/src/shacl/index.ts +22 -0
  679. package/src/shacl/internal/compare.ts +128 -0
  680. package/src/shacl/internal/regex.ts +56 -0
  681. package/src/shex/SemAct.ts +197 -0
  682. package/src/shex/ShExC.ts +415 -0
  683. package/src/shex/ShExError.ts +71 -0
  684. package/src/shex/ShExJ.ts +893 -0
  685. package/src/shex/ShExR.ts +640 -0
  686. package/src/shex/ShapeMap.ts +385 -0
  687. package/src/shex/Structure.ts +467 -0
  688. package/src/shex/Validator.ts +395 -0
  689. package/src/shex/index.ts +24 -0
  690. package/src/shex/internal/engine.ts +682 -0
  691. package/src/shex/internal/iterate.ts +14 -0
  692. package/src/shex/internal/json.ts +12 -0
  693. package/src/shex/internal/lexer.ts +56 -0
  694. package/src/shex/internal/nodeConstraint.ts +368 -0
  695. package/src/shex/internal/shexcLexer.ts +387 -0
  696. package/src/shex/internal/shexcParser.ts +1312 -0
  697. package/src/shex/internal/tokens.ts +41 -0
  698. package/src/shex/internal/xpathRegex.ts +290 -0
  699. package/src/sparql/Algebra.ts +914 -0
  700. package/src/sparql/Ast.ts +1344 -0
  701. package/src/sparql/Bindings.ts +272 -0
  702. package/src/sparql/ClientErrors.ts +156 -0
  703. package/src/sparql/ClientFormats.ts +70 -0
  704. package/src/sparql/Engine.ts +699 -0
  705. package/src/sparql/Errors.ts +30 -0
  706. package/src/sparql/Expression.ts +360 -0
  707. package/src/sparql/Federation.ts +187 -0
  708. package/src/sparql/Functions.ts +689 -0
  709. package/src/sparql/Generator.ts +426 -0
  710. package/src/sparql/GraphStore.ts +341 -0
  711. package/src/sparql/Optimizer.ts +230 -0
  712. package/src/sparql/Options.ts +191 -0
  713. package/src/sparql/Parser.ts +173 -0
  714. package/src/sparql/Protocol.ts +342 -0
  715. package/src/sparql/ProtocolErrors.ts +113 -0
  716. package/src/sparql/QueryBuilder.ts +953 -0
  717. package/src/sparql/Results.ts +844 -0
  718. package/src/sparql/ResultsStream.ts +771 -0
  719. package/src/sparql/ServerFormats.ts +75 -0
  720. package/src/sparql/ServiceDescription.ts +130 -0
  721. package/src/sparql/SparqlClient.ts +947 -0
  722. package/src/sparql/SparqlServer.ts +528 -0
  723. package/src/sparql/Store.ts +311 -0
  724. package/src/sparql/TermSchema.ts +20 -0
  725. package/src/sparql/Testing.ts +114 -0
  726. package/src/sparql/Translate.ts +407 -0
  727. package/src/sparql/ai/Mcp.ts +43 -0
  728. package/src/sparql/ai/Tools.ts +481 -0
  729. package/src/sparql/ai/index.ts +11 -0
  730. package/src/sparql/index.ts +64 -0
  731. package/src/sparql/internal/evaluator.ts +947 -0
  732. package/src/sparql/internal/hash.ts +418 -0
  733. package/src/sparql/internal/json.ts +12 -0
  734. package/src/sparql/internal/lexer.ts +488 -0
  735. package/src/sparql/internal/loop.ts +24 -0
  736. package/src/sparql/internal/parser.ts +2215 -0
  737. package/src/sparql/internal/prefetch.ts +46 -0
  738. package/src/sparql/internal/stringMap.ts +39 -0
  739. package/src/sparql/internal/textResults.ts +226 -0
  740. package/src/sparql/internal/values.ts +550 -0
  741. package/src/sparql/shacl/Evaluator.ts +478 -0
  742. package/src/sparql/shacl/Query.ts +574 -0
  743. package/src/sparql/shacl/index.ts +12 -0
  744. package/src/sparql/sql/Dialect.ts +246 -0
  745. package/src/sparql/sql/SqlStore.ts +1080 -0
  746. package/src/sparql/sql/Translation.ts +1898 -0
  747. package/src/sparql/sql/index.ts +17 -0
  748. package/src/sparql/sql/internal/encoding.ts +313 -0
  749. package/src/turtle/Grammar.ts +286 -0
  750. package/src/turtle/Manifest.ts +215 -0
  751. package/src/turtle/TriG.ts +158 -0
  752. package/src/turtle/Turtle.ts +166 -0
  753. package/src/turtle/index.ts +14 -0
  754. package/src/turtle/internal/loop.ts +23 -0
  755. package/src/turtle/internal/parse.ts +112 -0
  756. package/src/turtle/internal/parser.ts +1303 -0
  757. package/src/turtle/internal/serialize.ts +79 -0
  758. package/src/turtle/internal/streamWriter.ts +128 -0
  759. package/src/turtle/internal/writer.ts +898 -0
  760. package/src/xmp/DublinCore.ts +147 -0
  761. package/src/xmp/Exif.ts +109 -0
  762. package/src/xmp/Extract.ts +351 -0
  763. package/src/xmp/Metadata.ts +703 -0
  764. package/src/xmp/Namespaces.ts +228 -0
  765. package/src/xmp/Packet.ts +297 -0
  766. package/src/xmp/Pdf.ts +99 -0
  767. package/src/xmp/PdfA.ts +280 -0
  768. package/src/xmp/Photoshop.ts +275 -0
  769. package/src/xmp/Tiff.ts +196 -0
  770. package/src/xmp/Xmp.ts +430 -0
  771. package/src/xmp/XmpBasic.ts +90 -0
  772. package/src/xmp/XmpMM.ts +82 -0
  773. package/src/xmp/XmpRights.ts +83 -0
  774. package/src/xmp/index.ts +36 -0
  775. package/src/xmp/internal/accessors.ts +72 -0
  776. package/src/xmp/internal/xml.ts +63 -0
package/src/Dataset.ts ADDED
@@ -0,0 +1,1085 @@
1
+ /**
2
+ * Immutable, indexed RDF datasets.
3
+ *
4
+ * A `Dataset` is a persistent set of quads backed by Effect `HashMap`s, with
5
+ * per-position indexes so that pattern matching only scans the most
6
+ * selective index. Datasets implement `Equal` (set equality — use
7
+ * `Isomorphism.isomorphic` for blank-node-aware comparison), `Hash`,
8
+ * `Iterable<Quad>` and `Pipeable`.
9
+ *
10
+ * @since 0.1.0
11
+ */
12
+ import * as Arr from 'effect/Array';
13
+ import { dual } from 'effect/Function';
14
+ import * as Equal from 'effect/Equal';
15
+ import * as Graph from 'effect/Graph';
16
+ import * as Hash from 'effect/Hash';
17
+ import * as HashMap from 'effect/HashMap';
18
+ import * as HashSet from 'effect/HashSet';
19
+ import { NodeInspectSymbol, type Inspectable } from 'effect/Inspectable';
20
+ import * as Iterable from 'effect/Iterable';
21
+ import * as MutableHashMap from 'effect/MutableHashMap';
22
+ import * as MutableHashSet from 'effect/MutableHashSet';
23
+ import * as Option from 'effect/Option';
24
+ import { pipeArguments, type Pipeable } from 'effect/Pipeable';
25
+ import { hasProperty } from 'effect/Predicate';
26
+ import * as Schema from 'effect/Schema';
27
+ import * as SchemaTransformation from 'effect/SchemaTransformation';
28
+ import { MAX_DATASET_SIZE } from './internal/arbitrary.ts';
29
+ import { loop } from './internal/loop.ts';
30
+ import * as Term from './Term.ts';
31
+ import { pendingQuads } from './internal/pending.ts';
32
+ import { rdf } from './Vocab.ts';
33
+
34
+ /**
35
+ * @since 0.1.0
36
+ * @category symbols
37
+ */
38
+ export const TypeId: unique symbol = Symbol.for('@thomasfosterau/effect-rdf/Dataset');
39
+
40
+ /**
41
+ * @since 0.1.0
42
+ * @category symbols
43
+ */
44
+ export type TypeId = typeof TypeId;
45
+
46
+ type Index = HashMap.HashMap<string, HashMap.HashMap<string, Term.Quad>>;
47
+
48
+ /**
49
+ * @since 0.1.0
50
+ * @category models
51
+ */
52
+ export interface Dataset extends Iterable<Term.Quad>, Equal.Equal, Pipeable, Inspectable {
53
+ readonly [TypeId]: TypeId;
54
+ readonly size: number;
55
+ /** @internal */
56
+ readonly quads: HashMap.HashMap<string, Term.Quad>;
57
+ }
58
+
59
+ /**
60
+ * A quad pattern. Omitted positions, `undefined` and variables match any
61
+ * term.
62
+ *
63
+ * @since 0.1.0
64
+ * @category models
65
+ */
66
+ export interface Pattern {
67
+ readonly subject?: Term.Subject | Term.Variable | undefined;
68
+ readonly predicate?: Term.Predicate | Term.Variable | undefined;
69
+ readonly object?: Term.Object | Term.Variable | undefined;
70
+ readonly graph?: Term.Graph | Term.Variable | undefined;
71
+ }
72
+
73
+ /** `isDataset` for a value already known to be an object. */
74
+ const hasDatasetTypeId = (u: Equal.Equal | Iterable<Term.Quad>): u is Dataset => TypeId in u;
75
+
76
+ type Spog = readonly [Index, Index, Index, Index];
77
+
78
+ /**
79
+ * The indexes of the datasets that have been matched against, built on
80
+ * first use: parsing a document and serializing it never pays for them. A
81
+ * `WeakMap` rather than a field, so a dataset's own properties do not depend
82
+ * on whether it has been matched.
83
+ */
84
+ const indexes = new WeakMap<Dataset, Spog>();
85
+
86
+ /**
87
+ * A parser's dataset is often only iterated or serialized once, or not at
88
+ * all, so `fromIterable` keeps its quads (`pendingQuads`) and the persistent
89
+ * map is built the first time it is needed (a lookup, a match or an update),
90
+ * with the same contents.
91
+ */
92
+ const pending = pendingQuads;
93
+
94
+ /**
95
+ * The distinct quads of the datasets made by `fromIterable`, in the order
96
+ * first given: what such a dataset iterates (before and after its quad set
97
+ * is built), so that iterating, counting or serializing it never builds the
98
+ * persistent map.
99
+ */
100
+ const ordered = new WeakMap<Dataset, ReadonlyArray<Term.Quad>>();
101
+
102
+ /** Combines two hashes (a multiply-rotate step); `distinct` finishes them with `avalanche`. */
103
+ const mix = (a: number, b: number): number => Math.imul((a << 5) | (a >>> 27), 0x9e3779b1) ^ b;
104
+
105
+ /** The final mixing of a hash (MurmurHash3's), so that its low bits pick table slots well. */
106
+ const avalanche = (h: number): number => {
107
+ let x = Math.imul(h ^ (h >>> 16), 0x85ebca6b);
108
+ x = Math.imul(x ^ (x >>> 13), 0xc2b2ae35);
109
+ return x ^ (x >>> 16);
110
+ };
111
+
112
+ /**
113
+ * A hash of a subject or object (equal terms hash equally) that builds no
114
+ * key: a term's own hash, which IRIs, blank nodes and literals compute from
115
+ * their values and cache, and for a triple term, its parts'.
116
+ */
117
+ const termHash = (t: Term.Term): number =>
118
+ t instanceof Term.Triple
119
+ ? mix(mix(termHash(t.subject), t.predicate[Hash.symbol]()), termHash(t.object))
120
+ : // IRIs, blank nodes and literals hash their values and cache the result, so a node a
121
+ // parser shares between statements (a description's subject) is hashed once
122
+ t[Hash.symbol]();
123
+
124
+ /**
125
+ * A quad's hash for `distinct`: its predicate and graph, usually shared
126
+ * nodes, by their own cached hashes; its subject and object by `termHash`.
127
+ * Each position is hashed the same way for every quad, so equal quads hash
128
+ * equally.
129
+ */
130
+ const quadHash = (q: Term.Quad): number =>
131
+ mix(
132
+ mix(mix(termHash(q.subject), q.predicate[Hash.symbol]()), termHash(q.object)),
133
+ q.graph[Hash.symbol](),
134
+ );
135
+
136
+ /**
137
+ * The distinct quads of `quads` (equal keys), keeping the first of each in
138
+ * order: open addressing over their structural hashes, comparing keys only
139
+ * when two hashes are equal, so that no key is built for quads that differ.
140
+ */
141
+ const distinct = (quads: ReadonlyArray<Term.Quad>): ReadonlyArray<Term.Quad> => {
142
+ const n = quads.length;
143
+ if (n < 2) return quads;
144
+ const mask = 2 ** Math.ceil(Math.log2(n * 2)) - 1;
145
+ const hashes = new Int32Array(mask + 1);
146
+ const slots = new Int32Array(mask + 1);
147
+ const out: Array<Term.Quad> = [];
148
+ quads.forEach((q, k) => {
149
+ const hash = avalanche(quadHash(q));
150
+ let i = hash & mask;
151
+ let duplicate = false;
152
+ // Linear probing: step to the next slot until an empty one or an equal quad
153
+ loop(() => {
154
+ const slot = slots[i] ?? 0;
155
+ if (slot === 0) return false;
156
+ if (hashes[i] === hash && (quads[slot - 1] ?? q).key === q.key) {
157
+ duplicate = true;
158
+ return false;
159
+ }
160
+ i = (i + 1) & mask;
161
+ return true;
162
+ });
163
+ if (duplicate) return;
164
+ hashes[i] = hash;
165
+ slots[i] = k + 1;
166
+ out.push(q);
167
+ });
168
+ return out.length === n ? quads : out;
169
+ };
170
+
171
+ /** The distinct quads, in order, of a dataset made by `fromIterable` (none for any other). */
172
+ const orderedOf = (self: Dataset): Option.Option<ReadonlyArray<Term.Quad>> => {
173
+ const known = ordered.get(self);
174
+ if (known !== undefined) return Option.some(known);
175
+ const given = pending.get(self);
176
+ if (given === undefined) return Option.none();
177
+ const quads = distinct(given);
178
+ ordered.set(self, quads);
179
+ return Option.some(quads);
180
+ };
181
+
182
+ /** Builds a pending dataset's quad set, making it like any other dataset. */
183
+ const materialize = (self: Dataset): HashMap.HashMap<string, Term.Quad> => {
184
+ const quads = buildQuads(Option.getOrElse(orderedOf(self), () => []));
185
+ pending.delete(self);
186
+ Object.defineProperty(self, 'quads', { value: quads, enumerable: true });
187
+ return quads;
188
+ };
189
+
190
+ const Proto: Omit<Dataset, 'size' | 'quads'> & Pick<Dataset, 'size' | 'quads'> = {
191
+ [TypeId]: TypeId,
192
+ // Only a pending dataset reaches these: any other has its own `quads` and `size`
193
+ get quads(): HashMap.HashMap<string, Term.Quad> {
194
+ // SAFETY: the getter is only ever called on a dataset made from this prototype.
195
+ return materialize(this);
196
+ },
197
+ get size(): number {
198
+ // SAFETY: as for `quads`.
199
+ const size = Option.getOrElse(orderedOf(this), () => []).length;
200
+ Object.defineProperty(this, 'size', { value: size, enumerable: true });
201
+ return size;
202
+ },
203
+ [Symbol.iterator](this: Dataset): Iterator<Term.Quad> {
204
+ // A dataset made by `fromIterable` iterates its quads in the order first given
205
+ return Option.getOrElse(orderedOf(this), () => HashMap.values(this.quads))[Symbol.iterator]();
206
+ },
207
+ [Equal.symbol](this: Dataset, that: Equal.Equal): boolean {
208
+ if (!hasDatasetTypeId(that) || that.size !== this.size) return false;
209
+ const theirs = that.quads;
210
+ return HashMap.every(this.quads, (_quad, key) => HashMap.has(theirs, key));
211
+ },
212
+ [Hash.symbol](this: Dataset): number {
213
+ return Hash.optimize(Iterable.reduce(this, 0, (h, q) => (h + Hash.hash(q)) | 0));
214
+ },
215
+ pipe() {
216
+ return pipeArguments(this, arguments);
217
+ },
218
+ toString(this: Dataset) {
219
+ return toNQuads(this);
220
+ },
221
+ toJSON(this: Dataset) {
222
+ return { _id: 'Dataset', size: this.size, quads: Array.from(this, (q) => q.toString()) };
223
+ },
224
+ [NodeInspectSymbol](this: Dataset) {
225
+ return this.toJSON();
226
+ },
227
+ };
228
+
229
+ const makeDataset = (quads: HashMap.HashMap<string, Term.Quad>): Dataset => {
230
+ // Own data properties, which shadow the prototype's getters for pending datasets
231
+ return Object.create(Proto, {
232
+ quads: { value: quads, enumerable: true },
233
+ size: { value: HashMap.size(quads), enumerable: true },
234
+ });
235
+ };
236
+
237
+ const emptyIndex: Index = HashMap.empty();
238
+
239
+ const emptySpog: Spog = [emptyIndex, emptyIndex, emptyIndex, emptyIndex];
240
+
241
+ /**
242
+ * @since 0.1.0
243
+ * @category guards
244
+ */
245
+ export const isDataset = (u: unknown): u is Dataset => hasProperty(u, TypeId);
246
+
247
+ /**
248
+ * @since 0.1.0
249
+ * @category constructors
250
+ */
251
+ export const empty: Dataset = makeDataset(HashMap.empty());
252
+
253
+ // -----------------------------------------------------------------------------
254
+ // Mutation (internal builder)
255
+ // -----------------------------------------------------------------------------
256
+
257
+ /**
258
+ * A transient builder used by `mutate` to apply many updates efficiently.
259
+ *
260
+ * @since 0.1.0
261
+ * @category models
262
+ */
263
+ export interface Builder {
264
+ readonly add: (quad: Term.Quad) => Builder;
265
+ readonly addAll: (quads: Iterable<Term.Quad>) => Builder;
266
+ readonly remove: (quad: Term.Quad) => Builder;
267
+ readonly has: (quad: Term.Quad) => boolean;
268
+ readonly size: () => number;
269
+ }
270
+
271
+ /** The inner maps of one index made mutable during a batch, by term key. */
272
+ type Transients = MutableHashMap.MutableHashMap<string, HashMap.HashMap<string, Term.Quad>>;
273
+
274
+ const transients = (): Transients => MutableHashMap.empty();
275
+
276
+ const positions = (q: Term.Quad): readonly [string, string, string, string] => [
277
+ q.subject.key,
278
+ q.predicate.key,
279
+ q.object.key,
280
+ q.graph.key,
281
+ ];
282
+
283
+ /** Updates to a dataset's four indexes, applied in place until `finish`. */
284
+ interface IndexBatch {
285
+ readonly add: (quad: Term.Quad, key: string) => void;
286
+ readonly remove: (quad: Term.Quad, key: string) => void;
287
+ readonly finish: () => Spog;
288
+ }
289
+
290
+ const indexBatch = (spog: Spog): IndexBatch => {
291
+ const idx: [Index, Index, Index, Index] = [
292
+ HashMap.beginMutation(spog[0]),
293
+ HashMap.beginMutation(spog[1]),
294
+ HashMap.beginMutation(spog[2]),
295
+ HashMap.beginMutation(spog[3]),
296
+ ];
297
+ // The inner maps this batch has made mutable, per position, so that adding
298
+ // a quad updates its four inner maps in place instead of copying a path of
299
+ // each (they are frozen again by `finish`).
300
+ const open: [Transients, Transients, Transients, Transients] = [
301
+ transients(),
302
+ transients(),
303
+ transients(),
304
+ transients(),
305
+ ];
306
+ const inner = (i: 0 | 1 | 2 | 3, termKey: string): HashMap.HashMap<string, Term.Quad> => {
307
+ const opened = open[i];
308
+ const known = MutableHashMap.get(opened, termKey);
309
+ if (Option.isSome(known)) return known.value;
310
+ const map = HashMap.beginMutation(
311
+ Option.getOrElse(HashMap.get(idx[i], termKey), () => HashMap.empty<string, Term.Quad>()),
312
+ );
313
+ // Stored in `idx[i]` by `close`, once the batch is done: setting it here,
314
+ // still equal to the map it copies, is a no-op on effect 4.0.x, whose
315
+ // `HashMap.set` keeps an existing value `Equal.equals` to the new one
316
+ MutableHashMap.set(opened, termKey, map);
317
+ return map;
318
+ };
319
+ // A mutable map is updated in place, so the results of `set` and `remove` are the map itself
320
+ const addAt = (i: 0 | 1 | 2 | 3, termKey: string, key: string, quad: Term.Quad): void => {
321
+ HashMap.set(inner(i, termKey), key, quad);
322
+ };
323
+ const removeAt = (i: 0 | 1 | 2 | 3, termKey: string, key: string): void => {
324
+ if (MutableHashMap.has(open[i], termKey) || HashMap.has(idx[i], termKey)) {
325
+ HashMap.remove(inner(i, termKey), key);
326
+ }
327
+ };
328
+ const close = (i: 0 | 1 | 2 | 3): void => {
329
+ MutableHashMap.forEach(open[i], (map, termKey) => {
330
+ HashMap.endMutation(map);
331
+ idx[i] =
332
+ HashMap.size(map) === 0
333
+ ? HashMap.remove(idx[i], termKey)
334
+ : HashMap.set(idx[i], termKey, map);
335
+ });
336
+ };
337
+ return {
338
+ add(quad, key) {
339
+ addAt(0, quad.subject.key, key, quad);
340
+ addAt(1, quad.predicate.key, key, quad);
341
+ addAt(2, quad.object.key, key, quad);
342
+ addAt(3, quad.graph.key, key, quad);
343
+ },
344
+ remove(quad, key) {
345
+ removeAt(0, quad.subject.key, key);
346
+ removeAt(1, quad.predicate.key, key);
347
+ removeAt(2, quad.object.key, key);
348
+ removeAt(3, quad.graph.key, key);
349
+ },
350
+ finish() {
351
+ close(0);
352
+ close(1);
353
+ close(2);
354
+ close(3);
355
+ return [
356
+ HashMap.endMutation(idx[0]),
357
+ HashMap.endMutation(idx[1]),
358
+ HashMap.endMutation(idx[2]),
359
+ HashMap.endMutation(idx[3]),
360
+ ];
361
+ },
362
+ };
363
+ };
364
+
365
+ /** The indexes of a dataset, built the first time they are needed. */
366
+ const indexesOf = (self: Dataset): Spog => {
367
+ const built = indexes.get(self);
368
+ if (built !== undefined) return built;
369
+ const batch = indexBatch(emptySpog);
370
+ HashMap.forEach(self.quads, (quad, key) => batch.add(quad, key));
371
+ const spog = batch.finish();
372
+ indexes.set(self, spog);
373
+ return spog;
374
+ };
375
+
376
+ /**
377
+ * Applies a batch of updates to a dataset using a transient builder.
378
+ *
379
+ * @since 0.1.0
380
+ * @category combinators
381
+ */
382
+ export const mutate: {
383
+ (f: (builder: Builder) => void): (self: Dataset) => Dataset;
384
+ (self: Dataset, f: (builder: Builder) => void): Dataset;
385
+ } = dual(2, (self: Dataset, f: (builder: Builder) => void): Dataset => {
386
+ let quads = HashMap.beginMutation(self.quads);
387
+ // Indexes already built are kept up to date; otherwise the result builds its own when matched
388
+ const spog = indexes.get(self);
389
+ const batch = spog === undefined ? undefined : indexBatch(spog);
390
+ const builder: Builder = {
391
+ add(quad) {
392
+ const key = quad.key;
393
+ // One lookup: `set` on the mutable map grows it only if the quad is new. A duplicate
394
+ // replaces the stored quad with an equal one.
395
+ const before = HashMap.size(quads);
396
+ quads = HashMap.set(quads, key, quad);
397
+ if (HashMap.size(quads) !== before) batch?.add(quad, key);
398
+ return builder;
399
+ },
400
+ addAll(iterable) {
401
+ Iterable.forEach(iterable, (q) => {
402
+ builder.add(q);
403
+ });
404
+ return builder;
405
+ },
406
+ remove(quad) {
407
+ const key = quad.key;
408
+ if (!HashMap.has(quads, key)) return builder;
409
+ quads = HashMap.remove(quads, key);
410
+ batch?.remove(quad, key);
411
+ return builder;
412
+ },
413
+ has: (quad) => HashMap.has(quads, quad.key),
414
+ size: () => HashMap.size(quads),
415
+ };
416
+ f(builder);
417
+ const result = makeDataset(HashMap.endMutation(quads));
418
+ if (batch !== undefined) indexes.set(result, batch.finish());
419
+ return result;
420
+ });
421
+
422
+ // -----------------------------------------------------------------------------
423
+ // Constructors
424
+ // -----------------------------------------------------------------------------
425
+
426
+ /**
427
+ * @since 0.1.0
428
+ * @category constructors
429
+ */
430
+ export const fromIterable = (quads: Iterable<Term.Quad>): Dataset => {
431
+ if (hasDatasetTypeId(quads)) return quads;
432
+ const self: Dataset = Object.create(Proto);
433
+ pending.set(self, Array.from(quads));
434
+ return self;
435
+ };
436
+
437
+ /** The quad set of `quads`, deduplicated by key (the first of equal quads is kept). */
438
+ const buildQuads = (quads: ReadonlyArray<Term.Quad>): HashMap.HashMap<string, Term.Quad> =>
439
+ mutate(empty, (b) => b.addAll(quads)).quads;
440
+
441
+ /**
442
+ * @since 0.1.0
443
+ * @category constructors
444
+ */
445
+ export const make = (...quads: ReadonlyArray<Term.Quad>): Dataset => fromIterable(quads);
446
+
447
+ /**
448
+ * Creates a dataset from triples, placing them in the given graph (the
449
+ * default graph when omitted).
450
+ *
451
+ * @since 0.1.0
452
+ * @category constructors
453
+ */
454
+ export const fromTriples = (
455
+ triples: Iterable<Term.Triple>,
456
+ graph: Term.Graph = Term.defaultGraph,
457
+ ): Dataset =>
458
+ mutate(empty, (b) => {
459
+ Iterable.forEach(triples, (t) => {
460
+ b.add(new Term.Quad(t.subject, t.predicate, t.object, graph));
461
+ });
462
+ });
463
+
464
+ // -----------------------------------------------------------------------------
465
+ // Updates
466
+ // -----------------------------------------------------------------------------
467
+
468
+ /**
469
+ * @since 0.1.0
470
+ * @category combinators
471
+ */
472
+ export const add: {
473
+ (quad: Term.Quad): (self: Dataset) => Dataset;
474
+ (self: Dataset, quad: Term.Quad): Dataset;
475
+ } = dual(2, (self: Dataset, quad: Term.Quad): Dataset =>
476
+ HashMap.has(self.quads, quad.key) ? self : mutate(self, (b) => b.add(quad)),
477
+ );
478
+
479
+ /**
480
+ * @since 0.1.0
481
+ * @category combinators
482
+ */
483
+ export const addAll: {
484
+ (quads: Iterable<Term.Quad>): (self: Dataset) => Dataset;
485
+ (self: Dataset, quads: Iterable<Term.Quad>): Dataset;
486
+ } = dual(2, (self: Dataset, quads: Iterable<Term.Quad>): Dataset =>
487
+ mutate(self, (b) => b.addAll(quads)),
488
+ );
489
+
490
+ /**
491
+ * @since 0.1.0
492
+ * @category combinators
493
+ */
494
+ export const remove: {
495
+ (quad: Term.Quad): (self: Dataset) => Dataset;
496
+ (self: Dataset, quad: Term.Quad): Dataset;
497
+ } = dual(2, (self: Dataset, quad: Term.Quad): Dataset =>
498
+ HashMap.has(self.quads, quad.key) ? mutate(self, (b) => b.remove(quad)) : self,
499
+ );
500
+
501
+ /**
502
+ * Removes every quad matching a pattern.
503
+ *
504
+ * @since 0.1.0
505
+ * @category combinators
506
+ */
507
+ export const removeMatches: {
508
+ (pattern: Pattern): (self: Dataset) => Dataset;
509
+ (self: Dataset, pattern: Pattern): Dataset;
510
+ } = dual(2, (self: Dataset, pattern: Pattern): Dataset => {
511
+ const matches = match(self, pattern);
512
+ return Arr.isReadonlyArrayEmpty(matches) ? self : mutate(self, (b) => matches.forEach(b.remove));
513
+ });
514
+
515
+ // -----------------------------------------------------------------------------
516
+ // Queries
517
+ // -----------------------------------------------------------------------------
518
+
519
+ /**
520
+ * @since 0.1.0
521
+ * @category predicates
522
+ */
523
+ export const has: {
524
+ (quad: Term.Quad): (self: Dataset) => boolean;
525
+ (self: Dataset, quad: Term.Quad): boolean;
526
+ } = dual(2, (self: Dataset, quad: Term.Quad): boolean => HashMap.has(self.quads, quad.key));
527
+
528
+ /**
529
+ * @since 0.1.0
530
+ * @category predicates
531
+ */
532
+ export const isEmpty = (self: Dataset): boolean => self.size === 0;
533
+
534
+ /** A position of a quad: subject, predicate, object or graph (the index of its `Spog` index). */
535
+ type Position = 0 | 1 | 2 | 3;
536
+
537
+ /** A bound position of a pattern, with the key its term must have. */
538
+ interface Check {
539
+ readonly position: Position;
540
+ readonly key: string;
541
+ }
542
+
543
+ /** The bound positions of a pattern (omitted positions and variables match any term). */
544
+ const checksOf = (pattern: Pattern): ReadonlyArray<Check> => {
545
+ const checks: Array<Check> = [];
546
+ const at = (position: Position, t: Pattern[keyof Pattern]): void => {
547
+ if (t !== undefined && !Term.isVariable(t)) checks.push({ position, key: t.key });
548
+ };
549
+ at(0, pattern.subject);
550
+ at(1, pattern.predicate);
551
+ at(2, pattern.object);
552
+ at(3, pattern.graph);
553
+ return checks;
554
+ };
555
+
556
+ /**
557
+ * Returns all quads matching a pattern, using the most selective index.
558
+ *
559
+ * @since 0.1.0
560
+ * @category queries
561
+ */
562
+ export const match: {
563
+ (pattern: Pattern): (self: Dataset) => ReadonlyArray<Term.Quad>;
564
+ (self: Dataset, pattern: Pattern): ReadonlyArray<Term.Quad>;
565
+ } = dual(2, (self: Dataset, pattern: Pattern): ReadonlyArray<Term.Quad> => {
566
+ const checks = checksOf(pattern);
567
+ let candidates: Option.Option<HashMap.HashMap<string, Term.Quad>> = Option.none();
568
+ let candidateSize = Infinity;
569
+ // The smallest inner map of the bound positions; none of them holding the term matches nothing
570
+ const missing = checks.some(({ position, key }) => {
571
+ const inner = HashMap.get(indexesOf(self)[position], key);
572
+ if (Option.isNone(inner)) return true;
573
+ const size = HashMap.size(inner.value);
574
+ if (size < candidateSize) {
575
+ candidates = inner;
576
+ candidateSize = size;
577
+ }
578
+ return false;
579
+ });
580
+ if (missing) return [];
581
+ const source = Option.getOrElse(candidates, () => self.quads);
582
+ const out: Array<Term.Quad> = [];
583
+ if (checks.length > 1) {
584
+ HashMap.forEach(source, (q) => {
585
+ const ks = positions(q);
586
+ if (checks.every(({ position, key }) => ks[position] === key)) out.push(q);
587
+ });
588
+ } else {
589
+ HashMap.forEach(source, (q) => {
590
+ out.push(q);
591
+ });
592
+ }
593
+ return out;
594
+ });
595
+
596
+ /**
597
+ * Counts the quads matching a pattern.
598
+ *
599
+ * @since 0.1.0
600
+ * @category queries
601
+ */
602
+ export const count: {
603
+ (pattern: Pattern): (self: Dataset) => number;
604
+ (self: Dataset, pattern: Pattern): number;
605
+ } = dual(2, (self: Dataset, pattern: Pattern): number => match(self, pattern).length);
606
+
607
+ /**
608
+ * Returns a dataset containing only the quads matching a pattern.
609
+ *
610
+ * @since 0.1.0
611
+ * @category queries
612
+ */
613
+ export const filterMatches: {
614
+ (pattern: Pattern): (self: Dataset) => Dataset;
615
+ (self: Dataset, pattern: Pattern): Dataset;
616
+ } = dual(2, (self: Dataset, pattern: Pattern): Dataset => fromIterable(match(self, pattern)));
617
+
618
+ /**
619
+ * The objects of all quads with the given subject and predicate (in any
620
+ * graph unless one is specified).
621
+ *
622
+ * @since 0.1.0
623
+ * @category queries
624
+ */
625
+ export const objectsOf = (
626
+ self: Dataset,
627
+ subject: Term.Subject,
628
+ predicate: Term.Predicate,
629
+ graph?: Term.Graph,
630
+ ): ReadonlyArray<Term.Object> =>
631
+ uniqueTerms(match(self, { subject, predicate, graph }).map((q) => q.object));
632
+
633
+ /**
634
+ * The first object of a subject/predicate pair, if any.
635
+ *
636
+ * @since 0.1.0
637
+ * @category queries
638
+ */
639
+ export const objectOf = (
640
+ self: Dataset,
641
+ subject: Term.Subject,
642
+ predicate: Term.Predicate,
643
+ graph?: Term.Graph,
644
+ ): Option.Option<Term.Object> =>
645
+ Option.fromNullishOr(match(self, { subject, predicate, graph })[0]?.object);
646
+
647
+ /**
648
+ * The subjects of all quads with the given predicate and object.
649
+ *
650
+ * @since 0.1.0
651
+ * @category queries
652
+ */
653
+ export const subjectsOf = (
654
+ self: Dataset,
655
+ predicate: Term.Predicate,
656
+ object: Term.Object,
657
+ graph?: Term.Graph,
658
+ ): ReadonlyArray<Term.Subject> =>
659
+ uniqueTerms(match(self, { predicate, object, graph }).map((q) => q.subject));
660
+
661
+ const uniqueTerms = <T extends Term.Term>(terms: ReadonlyArray<T>): ReadonlyArray<T> => {
662
+ if (terms.length < 2) return terms;
663
+ return uniqueByKey(terms);
664
+ };
665
+
666
+ /** The first of each group of values with equal keys, in order. */
667
+ const uniqueByKey = <T extends { readonly key: string }>(values: Iterable<T>): Array<T> => {
668
+ const seen = MutableHashMap.empty<string, T>();
669
+ Iterable.forEach(values, (t) => {
670
+ if (!MutableHashMap.has(seen, t.key)) MutableHashMap.set(seen, t.key, t);
671
+ });
672
+ return Arr.fromIterable(MutableHashMap.values(seen));
673
+ };
674
+
675
+ const termsAt = <T extends Term.Term>(
676
+ self: Dataset,
677
+ position: Position,
678
+ pick: (q: Term.Quad) => T,
679
+ ): ReadonlyArray<T> =>
680
+ // An inner map is removed from the index when its last quad goes, so each holds one
681
+ Arr.flatMap(Arr.fromIterable(HashMap.values(indexesOf(self)[position])), (inner) =>
682
+ Arr.fromOption(Option.map(Iterable.head(HashMap.values(inner)), pick)),
683
+ );
684
+
685
+ /**
686
+ * All distinct subjects.
687
+ *
688
+ * @since 0.1.0
689
+ * @category queries
690
+ */
691
+ export const subjects = (self: Dataset): ReadonlyArray<Term.Subject> =>
692
+ termsAt(self, 0, (q) => q.subject);
693
+
694
+ /**
695
+ * All distinct predicates.
696
+ *
697
+ * @since 0.1.0
698
+ * @category queries
699
+ */
700
+ export const predicates = (self: Dataset): ReadonlyArray<Term.Predicate> =>
701
+ termsAt(self, 1, (q) => q.predicate);
702
+
703
+ /**
704
+ * All distinct objects.
705
+ *
706
+ * @since 0.1.0
707
+ * @category queries
708
+ */
709
+ export const objects = (self: Dataset): ReadonlyArray<Term.Object> =>
710
+ termsAt(self, 2, (q) => q.object);
711
+
712
+ /**
713
+ * All distinct graph names (including the default graph if it is non-empty).
714
+ *
715
+ * @since 0.1.0
716
+ * @category queries
717
+ */
718
+ export const graphs = (self: Dataset): ReadonlyArray<Term.Graph> =>
719
+ termsAt(self, 3, (q) => q.graph);
720
+
721
+ /**
722
+ * The quads of one graph.
723
+ *
724
+ * @since 0.1.0
725
+ * @category queries
726
+ */
727
+ export const graph: {
728
+ (graph: Term.Graph): (self: Dataset) => Dataset;
729
+ (self: Dataset, graph: Term.Graph): Dataset;
730
+ } = dual(2, (self: Dataset, graphName: Term.Graph): Dataset =>
731
+ filterMatches(self, { graph: graphName }),
732
+ );
733
+
734
+ /**
735
+ * The triples of the dataset, ignoring graph names (duplicates across graphs
736
+ * are merged).
737
+ *
738
+ * @since 0.1.0
739
+ * @category conversions
740
+ */
741
+ export const triples = (self: Dataset): ReadonlyArray<Term.Triple> => {
742
+ return uniqueByKey(Iterable.map(self, (q) => q.triple));
743
+ };
744
+
745
+ /**
746
+ * Moves every quad into a single graph.
747
+ *
748
+ * @since 0.1.0
749
+ * @category combinators
750
+ */
751
+ export const withGraph: {
752
+ (graph: Term.Graph): (self: Dataset) => Dataset;
753
+ (self: Dataset, graph: Term.Graph): Dataset;
754
+ } = dual(2, (self: Dataset, graphName: Term.Graph): Dataset =>
755
+ fromIterable(Array.from(self, (q) => new Term.Quad(q.subject, q.predicate, q.object, graphName))),
756
+ );
757
+
758
+ /**
759
+ * Reads an RDF collection (`rdf:first`/`rdf:rest` list) starting at `head`.
760
+ * Returns `None` if the list is malformed (missing or multiple `first`/`rest`
761
+ * values, or cyclic).
762
+ *
763
+ * @since 0.1.0
764
+ * @category queries
765
+ */
766
+ export const list = (
767
+ self: Dataset,
768
+ head: Term.Object,
769
+ graphName?: Term.Graph,
770
+ ): Option.Option<ReadonlyArray<Term.Object>> => {
771
+ const items: Array<Term.Object> = [];
772
+ const seen = MutableHashSet.empty<string>();
773
+ let node: Term.Object = head;
774
+ let wellFormed = true;
775
+ // Follow `rdf:rest` to `rdf:nil`, stopping at a literal, a cycle or a node without one value each
776
+ loop(() => {
777
+ const current = node;
778
+ if (Term.isNamedNode(current) && current.value === rdf.nil.value) return false;
779
+ if (Term.isLiteral(current) || MutableHashSet.has(seen, current.key)) {
780
+ wellFormed = false;
781
+ return false;
782
+ }
783
+ MutableHashSet.add(seen, current.key);
784
+ const first = objectsOf(self, current, rdf.first, graphName);
785
+ const rest = objectsOf(self, current, rdf.rest, graphName);
786
+ if (
787
+ !Arr.isReadonlyArrayNonEmpty(first) ||
788
+ !Arr.isReadonlyArrayNonEmpty(rest) ||
789
+ first.length !== 1 ||
790
+ rest.length !== 1
791
+ ) {
792
+ wellFormed = false;
793
+ return false;
794
+ }
795
+ items.push(first[0]);
796
+ node = rest[0];
797
+ return true;
798
+ });
799
+ return wellFormed ? Option.some(items) : Option.none();
800
+ };
801
+
802
+ // -----------------------------------------------------------------------------
803
+ // Set operations and folds
804
+ // -----------------------------------------------------------------------------
805
+
806
+ /**
807
+ * @since 0.1.0
808
+ * @category combinators
809
+ */
810
+ export const union: {
811
+ (that: Dataset): (self: Dataset) => Dataset;
812
+ (self: Dataset, that: Dataset): Dataset;
813
+ } = dual(2, (self: Dataset, that: Dataset): Dataset =>
814
+ self.size >= that.size ? addAll(self, that) : addAll(that, self),
815
+ );
816
+
817
+ /**
818
+ * @since 0.1.0
819
+ * @category combinators
820
+ */
821
+ export const intersection: {
822
+ (that: Dataset): (self: Dataset) => Dataset;
823
+ (self: Dataset, that: Dataset): Dataset;
824
+ } = dual(2, (self: Dataset, that: Dataset): Dataset => filter(self, (q) => has(that, q)));
825
+
826
+ /**
827
+ * @since 0.1.0
828
+ * @category combinators
829
+ */
830
+ export const difference: {
831
+ (that: Dataset): (self: Dataset) => Dataset;
832
+ (self: Dataset, that: Dataset): Dataset;
833
+ } = dual(2, (self: Dataset, that: Dataset): Dataset =>
834
+ mutate(self, (b) => {
835
+ Iterable.forEach(that, (q) => {
836
+ b.remove(q);
837
+ });
838
+ }),
839
+ );
840
+
841
+ /**
842
+ * @since 0.1.0
843
+ * @category combinators
844
+ */
845
+ export const filter: {
846
+ (predicate: (quad: Term.Quad) => boolean): (self: Dataset) => Dataset;
847
+ (self: Dataset, predicate: (quad: Term.Quad) => boolean): Dataset;
848
+ } = dual(2, (self: Dataset, predicate: (quad: Term.Quad) => boolean): Dataset =>
849
+ mutate(empty, (b) => {
850
+ Iterable.forEach(self, (q) => {
851
+ if (predicate(q)) b.add(q);
852
+ });
853
+ }),
854
+ );
855
+
856
+ /**
857
+ * @since 0.1.0
858
+ * @category combinators
859
+ */
860
+ export const map: {
861
+ (f: (quad: Term.Quad) => Term.Quad): (self: Dataset) => Dataset;
862
+ (self: Dataset, f: (quad: Term.Quad) => Term.Quad): Dataset;
863
+ } = dual(2, (self: Dataset, f: (quad: Term.Quad) => Term.Quad): Dataset =>
864
+ mutate(empty, (b) => {
865
+ Iterable.forEach(self, (q) => {
866
+ b.add(f(q));
867
+ });
868
+ }),
869
+ );
870
+
871
+ /**
872
+ * @since 0.1.0
873
+ * @category combinators
874
+ */
875
+ export const flatMap: {
876
+ (f: (quad: Term.Quad) => Iterable<Term.Quad>): (self: Dataset) => Dataset;
877
+ (self: Dataset, f: (quad: Term.Quad) => Iterable<Term.Quad>): Dataset;
878
+ } = dual(2, (self: Dataset, f: (quad: Term.Quad) => Iterable<Term.Quad>): Dataset =>
879
+ mutate(empty, (b) => {
880
+ Iterable.forEach(self, (q) => {
881
+ b.addAll(f(q));
882
+ });
883
+ }),
884
+ );
885
+
886
+ /**
887
+ * @since 0.1.0
888
+ * @category folding
889
+ */
890
+ export const reduce: {
891
+ <B>(initial: B, f: (acc: B, quad: Term.Quad) => B): (self: Dataset) => B;
892
+ <B>(self: Dataset, initial: B, f: (acc: B, quad: Term.Quad) => B): B;
893
+ } = dual(3, <B>(self: Dataset, initial: B, f: (acc: B, quad: Term.Quad) => B): B =>
894
+ Iterable.reduce(self, initial, (acc, q) => f(acc, q)),
895
+ );
896
+
897
+ /**
898
+ * @since 0.1.0
899
+ * @category predicates
900
+ */
901
+ export const some: {
902
+ (predicate: (quad: Term.Quad) => boolean): (self: Dataset) => boolean;
903
+ (self: Dataset, predicate: (quad: Term.Quad) => boolean): boolean;
904
+ } = dual(2, (self: Dataset, predicate: (quad: Term.Quad) => boolean): boolean =>
905
+ Iterable.some(self, (q) => predicate(q)),
906
+ );
907
+
908
+ /**
909
+ * @since 0.1.0
910
+ * @category predicates
911
+ */
912
+ export const every: {
913
+ (predicate: (quad: Term.Quad) => boolean): (self: Dataset) => boolean;
914
+ (self: Dataset, predicate: (quad: Term.Quad) => boolean): boolean;
915
+ } = dual(
916
+ 2,
917
+ (self: Dataset, predicate: (quad: Term.Quad) => boolean): boolean =>
918
+ !Iterable.some(self, (q) => !predicate(q)),
919
+ );
920
+
921
+ /**
922
+ * Whether every quad of `self` is in `that`.
923
+ *
924
+ * @since 0.1.0
925
+ * @category predicates
926
+ */
927
+ export const isSubset: {
928
+ (that: Dataset): (self: Dataset) => boolean;
929
+ (self: Dataset, that: Dataset): boolean;
930
+ } = dual(2, (self: Dataset, that: Dataset): boolean => every(self, (q) => has(that, q)));
931
+
932
+ // -----------------------------------------------------------------------------
933
+ // Conversions
934
+ // -----------------------------------------------------------------------------
935
+
936
+ /**
937
+ * @since 0.1.0
938
+ * @category conversions
939
+ */
940
+ export const toArray = (self: Dataset): ReadonlyArray<Term.Quad> => Array.from(self);
941
+
942
+ /**
943
+ * The quads in a deterministic order (graph, subject, predicate, object).
944
+ *
945
+ * @since 0.1.0
946
+ * @category conversions
947
+ */
948
+ export const toSortedArray = (self: Dataset): ReadonlyArray<Term.Quad> =>
949
+ Arr.sort(self, Term.compareQuads);
950
+
951
+ /**
952
+ * Serialises to canonical, sorted N-Quads (one statement per line).
953
+ *
954
+ * @since 0.1.0
955
+ * @category conversions
956
+ */
957
+ export const toNQuads = (self: Dataset): string =>
958
+ toSortedArray(self)
959
+ .map((q) => `${q.toString()}\n`)
960
+ .join('');
961
+
962
+ /**
963
+ * Schema of a dataset; its JSON codec is an array of `TermJson.Quad`s in
964
+ * `toSortedArray` order, so encoding is deterministic.
965
+ *
966
+ * @since 0.1.0
967
+ * @category schemas
968
+ */
969
+ export const DatasetSchema: Schema.declare<Dataset> = Schema.declare(isDataset, {
970
+ identifier: 'Dataset',
971
+ // An array of JSON quads in `toSortedArray` order, so encoding is deterministic.
972
+ toCodecJson: () =>
973
+ Schema.link<Dataset>()(
974
+ Schema.Array(Term.QuadSchema),
975
+ SchemaTransformation.transform({ decode: fromIterable, encode: toSortedArray }),
976
+ ),
977
+ // Up to a dozen generated quads, whose terms are drawn from small pools so they share
978
+ // subjects, objects and graphs.
979
+ toCodecArbitrary: () =>
980
+ Schema.link<Dataset>()(
981
+ Schema.Array(Term.QuadSchema).check(Schema.isMaxLength(MAX_DATASET_SIZE)),
982
+ SchemaTransformation.transform({ decode: fromIterable, encode: toSortedArray }),
983
+ ),
984
+ });
985
+
986
+ /**
987
+ * The type `DatasetSchema` decodes to.
988
+ *
989
+ * @since 0.1.0
990
+ * @category schemas
991
+ */
992
+ export type DatasetSchema = typeof DatasetSchema.Type;
993
+
994
+ // -----------------------------------------------------------------------------
995
+ // Graph algorithms
996
+ // -----------------------------------------------------------------------------
997
+
998
+ /**
999
+ * Options for `toGraph`.
1000
+ *
1001
+ * @since 0.1.0
1002
+ * @category graphs
1003
+ */
1004
+ export interface ToGraphOptions {
1005
+ /** Only these predicates become edges (e.g. `[rdfs.subClassOf]`); all of them when omitted. */
1006
+ readonly predicates?: ReadonlyArray<Term.NamedNode> | undefined;
1007
+ /** Only quads in this graph; every graph when omitted. */
1008
+ readonly graph?: Term.Graph | undefined;
1009
+ /** Whether literal objects become nodes (default `false`: their quads are left out). */
1010
+ readonly literals?: boolean | undefined;
1011
+ }
1012
+
1013
+ /**
1014
+ * A dataset as an `effect/Graph` directed graph, with the lookup from terms
1015
+ * to node indices that graph algorithms start from.
1016
+ *
1017
+ * @since 0.1.0
1018
+ * @category graphs
1019
+ */
1020
+ export interface TermGraph {
1021
+ /** Nodes are the subjects and objects; each quad is an edge labelled with its predicate. */
1022
+ readonly graph: Graph.DirectedGraph<Term.Subject | Term.Object, Term.NamedNode>;
1023
+ /** Each term's node index. */
1024
+ readonly nodes: HashMap.HashMap<Term.Subject | Term.Object, Graph.NodeIndex>;
1025
+ }
1026
+
1027
+ /**
1028
+ * Converts a dataset to an `effect/Graph` directed graph for graph
1029
+ * algorithms — topological order of a class hierarchy, cycle detection,
1030
+ * shortest paths, reachability, connected components. Every subject and
1031
+ * object becomes one node (equal terms share it) and every quad an edge
1032
+ * from its subject to its object, labelled with its predicate; triple terms
1033
+ * are nodes, not expanded.
1034
+ *
1035
+ * @since 0.1.0
1036
+ * @category graphs
1037
+ */
1038
+ export const toGraph = (self: Dataset, options: ToGraphOptions = {}): TermGraph => {
1039
+ const keep =
1040
+ options.predicates === undefined ? undefined : HashSet.fromIterable(options.predicates);
1041
+ const edges = Arr.filter(
1042
+ options.graph === undefined ? Arr.fromIterable(self) : match(self, { graph: options.graph }),
1043
+ (q) =>
1044
+ (keep === undefined || HashSet.has(keep, q.predicate)) &&
1045
+ (options.literals === true || !Term.isLiteral(q.object)),
1046
+ );
1047
+ let nodes = HashMap.empty<Term.Subject | Term.Object, Graph.NodeIndex>();
1048
+ const directed = Graph.directed<Term.Subject | Term.Object, Term.NamedNode>((mutable) => {
1049
+ // Equal terms share a node: `nodes` is keyed by term value.
1050
+ const nodeOf = (term: Term.Subject | Term.Object): Graph.NodeIndex =>
1051
+ Option.getOrElse(HashMap.get(nodes, term), () => {
1052
+ const added = Graph.addNode(mutable, term);
1053
+ nodes = HashMap.set(nodes, term, added);
1054
+ return added;
1055
+ });
1056
+ Arr.forEach(edges, (q) => {
1057
+ Graph.addEdge(mutable, nodeOf(q.subject), nodeOf(q.object), q.predicate);
1058
+ });
1059
+ return undefined;
1060
+ });
1061
+ return { graph: directed, nodes };
1062
+ };
1063
+
1064
+ /**
1065
+ * Converts a directed graph whose nodes are terms and whose edges are
1066
+ * predicates back to a dataset: each edge becomes a quad in `graphName` (the
1067
+ * default graph when omitted). Edges from a node that cannot be a subject
1068
+ * (a literal) are left out.
1069
+ *
1070
+ * @since 0.1.0
1071
+ * @category graphs
1072
+ */
1073
+ export const fromGraph = (
1074
+ source: Graph.DirectedGraph<Term.Subject | Term.Object, Term.NamedNode>,
1075
+ graphName: Term.Graph = Term.defaultGraph,
1076
+ ): Dataset =>
1077
+ fromIterable(
1078
+ Arr.flatMap(Arr.fromIterable(Graph.edges(source)), ([, edge]) => {
1079
+ const subject = Graph.getNode(source, edge.source);
1080
+ const object = Graph.getNode(source, edge.target);
1081
+ return Option.isSome(subject) && Option.isSome(object) && Term.isSubject(subject.value)
1082
+ ? [Term.quad(subject.value, edge.data, object.value, graphName)]
1083
+ : [];
1084
+ }),
1085
+ );