@enspirit/bmg-js 1.0.0 → 1.0.1

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 (201) hide show
  1. package/dist/bmg.cjs +2 -0
  2. package/dist/bmg.cjs.map +1 -0
  3. package/dist/bmg.modern.js +2 -0
  4. package/dist/bmg.modern.js.map +1 -0
  5. package/dist/bmg.module.js +2 -0
  6. package/dist/bmg.module.js.map +1 -0
  7. package/dist/bmg.umd.js +2 -0
  8. package/dist/bmg.umd.js.map +1 -0
  9. package/dist/index.d.ts +1 -0
  10. package/dist/src/Relation/Memory.d.ts +46 -0
  11. package/dist/src/Relation/index.d.ts +1 -0
  12. package/dist/src/Relation.d.ts +8 -0
  13. package/dist/src/index.d.ts +27 -0
  14. package/dist/src/operators/_helpers.d.ts +142 -0
  15. package/dist/src/operators/allbut.d.ts +2 -0
  16. package/dist/src/operators/autowrap.d.ts +2 -0
  17. package/dist/src/operators/constants.d.ts +2 -0
  18. package/dist/src/operators/cross_product.d.ts +3 -0
  19. package/dist/src/operators/exclude.d.ts +2 -0
  20. package/dist/src/operators/extend.d.ts +2 -0
  21. package/dist/src/operators/group.d.ts +2 -0
  22. package/dist/src/operators/image.d.ts +2 -0
  23. package/dist/src/operators/index.d.ts +30 -0
  24. package/dist/src/operators/intersect.d.ts +2 -0
  25. package/dist/src/operators/isEqual.d.ts +2 -0
  26. package/dist/src/operators/isRelation.d.ts +1 -0
  27. package/dist/src/operators/join.d.ts +2 -0
  28. package/dist/src/operators/left_join.d.ts +2 -0
  29. package/dist/src/operators/matching.d.ts +2 -0
  30. package/dist/src/operators/minus.d.ts +2 -0
  31. package/dist/src/operators/not_matching.d.ts +2 -0
  32. package/dist/src/operators/one.d.ts +2 -0
  33. package/dist/src/operators/prefix.d.ts +2 -0
  34. package/dist/src/operators/project.d.ts +2 -0
  35. package/dist/src/operators/rename.d.ts +2 -0
  36. package/dist/src/operators/restrict.d.ts +2 -0
  37. package/dist/src/operators/suffix.d.ts +2 -0
  38. package/dist/src/operators/summarize.d.ts +2 -0
  39. package/dist/src/operators/transform.d.ts +2 -0
  40. package/dist/src/operators/ungroup.d.ts +2 -0
  41. package/dist/src/operators/union.d.ts +2 -0
  42. package/dist/src/operators/unwrap.d.ts +2 -0
  43. package/dist/src/operators/where.d.ts +1 -0
  44. package/dist/src/operators/wrap.d.ts +2 -0
  45. package/dist/src/operators/yByX.d.ts +2 -0
  46. package/dist/src/src/Relation/Memory.d.ts +46 -0
  47. package/dist/src/src/Relation/index.d.ts +1 -0
  48. package/dist/src/src/index.d.ts +27 -0
  49. package/dist/src/src/operators/_helpers.d.ts +142 -0
  50. package/dist/src/src/operators/allbut.d.ts +2 -0
  51. package/dist/src/src/operators/autowrap.d.ts +2 -0
  52. package/dist/src/src/operators/constants.d.ts +2 -0
  53. package/dist/src/src/operators/cross_product.d.ts +3 -0
  54. package/dist/src/src/operators/exclude.d.ts +2 -0
  55. package/dist/src/src/operators/extend.d.ts +2 -0
  56. package/dist/src/src/operators/group.d.ts +2 -0
  57. package/dist/src/src/operators/image.d.ts +2 -0
  58. package/dist/src/src/operators/index.d.ts +30 -0
  59. package/dist/src/src/operators/intersect.d.ts +2 -0
  60. package/dist/src/src/operators/isEqual.d.ts +2 -0
  61. package/dist/src/src/operators/isRelation.d.ts +1 -0
  62. package/dist/src/src/operators/join.d.ts +2 -0
  63. package/dist/src/src/operators/left_join.d.ts +2 -0
  64. package/dist/src/src/operators/matching.d.ts +2 -0
  65. package/dist/src/src/operators/minus.d.ts +2 -0
  66. package/dist/src/src/operators/not_matching.d.ts +2 -0
  67. package/dist/src/src/operators/one.d.ts +2 -0
  68. package/dist/src/src/operators/prefix.d.ts +2 -0
  69. package/dist/src/src/operators/project.d.ts +2 -0
  70. package/dist/src/src/operators/rename.d.ts +2 -0
  71. package/dist/src/src/operators/restrict.d.ts +2 -0
  72. package/dist/src/src/operators/suffix.d.ts +2 -0
  73. package/dist/src/src/operators/summarize.d.ts +2 -0
  74. package/dist/src/src/operators/transform.d.ts +2 -0
  75. package/dist/src/src/operators/ungroup.d.ts +2 -0
  76. package/dist/src/src/operators/union.d.ts +2 -0
  77. package/dist/src/src/operators/unwrap.d.ts +2 -0
  78. package/dist/src/src/operators/where.d.ts +1 -0
  79. package/dist/src/src/operators/wrap.d.ts +2 -0
  80. package/dist/src/src/operators/yByX.d.ts +2 -0
  81. package/dist/src/src/support/toPredicateFunc.d.ts +2 -0
  82. package/dist/src/src/types.d.ts +101 -0
  83. package/dist/src/src/utility-types.d.ts +43 -0
  84. package/dist/src/support/toPredicateFunc.d.ts +2 -0
  85. package/dist/src/tests/bmg.test.d.ts +1 -0
  86. package/dist/src/tests/fixtures.d.ts +6 -0
  87. package/dist/src/tests/operators/allbut.test.d.ts +1 -0
  88. package/dist/src/tests/operators/autowrap.test.d.ts +1 -0
  89. package/dist/src/tests/operators/constants.test.d.ts +1 -0
  90. package/dist/src/tests/operators/cross_product.test.d.ts +1 -0
  91. package/dist/src/tests/operators/exclude.test.d.ts +1 -0
  92. package/dist/src/tests/operators/extend.test.d.ts +1 -0
  93. package/dist/src/tests/operators/group.test.d.ts +1 -0
  94. package/dist/src/tests/operators/image.test.d.ts +1 -0
  95. package/dist/src/tests/operators/intersect.test.d.ts +1 -0
  96. package/dist/src/tests/operators/isEqual.test.d.ts +1 -0
  97. package/dist/src/tests/operators/join.test.d.ts +1 -0
  98. package/dist/src/tests/operators/left_join.test.d.ts +1 -0
  99. package/dist/src/tests/operators/matching.test.d.ts +1 -0
  100. package/dist/src/tests/operators/minus.test.d.ts +1 -0
  101. package/dist/src/tests/operators/not_matching.test.d.ts +1 -0
  102. package/dist/src/tests/operators/one.test.d.ts +1 -0
  103. package/dist/src/tests/operators/prefix.test.d.ts +1 -0
  104. package/dist/src/tests/operators/project.test.d.ts +1 -0
  105. package/dist/src/tests/operators/rename.test.d.ts +1 -0
  106. package/dist/src/tests/operators/restrict.test.d.ts +1 -0
  107. package/dist/src/tests/operators/suffix.test.d.ts +1 -0
  108. package/dist/src/tests/operators/summarize.test.d.ts +1 -0
  109. package/dist/src/tests/operators/transform.test.d.ts +1 -0
  110. package/dist/src/tests/operators/ungroup.test.d.ts +1 -0
  111. package/dist/src/tests/operators/union.test.d.ts +1 -0
  112. package/dist/src/tests/operators/unwrap.test.d.ts +1 -0
  113. package/dist/src/tests/operators/where.test.d.ts +1 -0
  114. package/dist/src/tests/operators/wrap.test.d.ts +1 -0
  115. package/dist/src/tests/operators/yByX.test.d.ts +1 -0
  116. package/dist/src/tests/types/relation.test.d.ts +1 -0
  117. package/dist/src/types.d.ts +101 -0
  118. package/dist/src/utility-types.d.ts +43 -0
  119. package/dist/tests/bmg.test.d.ts +1 -0
  120. package/dist/tests/fixtures.d.ts +6 -0
  121. package/dist/tests/operators/allbut.test.d.ts +1 -0
  122. package/dist/tests/operators/autowrap.test.d.ts +1 -0
  123. package/dist/tests/operators/constants.test.d.ts +1 -0
  124. package/dist/tests/operators/cross_product.test.d.ts +1 -0
  125. package/dist/tests/operators/exclude.test.d.ts +1 -0
  126. package/dist/tests/operators/extend.test.d.ts +1 -0
  127. package/dist/tests/operators/group.test.d.ts +1 -0
  128. package/dist/tests/operators/image.test.d.ts +1 -0
  129. package/dist/tests/operators/intersect.test.d.ts +1 -0
  130. package/dist/tests/operators/isEqual.test.d.ts +1 -0
  131. package/dist/tests/operators/join.test.d.ts +1 -0
  132. package/dist/tests/operators/left_join.test.d.ts +1 -0
  133. package/dist/tests/operators/matching.test.d.ts +1 -0
  134. package/dist/tests/operators/minus.test.d.ts +1 -0
  135. package/dist/tests/operators/not_matching.test.d.ts +1 -0
  136. package/dist/tests/operators/one.test.d.ts +1 -0
  137. package/dist/tests/operators/prefix.test.d.ts +1 -0
  138. package/dist/tests/operators/project.test.d.ts +1 -0
  139. package/dist/tests/operators/rename.test.d.ts +1 -0
  140. package/dist/tests/operators/restrict.test.d.ts +1 -0
  141. package/dist/tests/operators/suffix.test.d.ts +1 -0
  142. package/dist/tests/operators/summarize.test.d.ts +1 -0
  143. package/dist/tests/operators/transform.test.d.ts +1 -0
  144. package/dist/tests/operators/ungroup.test.d.ts +1 -0
  145. package/dist/tests/operators/union.test.d.ts +1 -0
  146. package/dist/tests/operators/unwrap.test.d.ts +1 -0
  147. package/dist/tests/operators/where.test.d.ts +1 -0
  148. package/dist/tests/operators/wrap.test.d.ts +1 -0
  149. package/dist/tests/operators/yByX.test.d.ts +1 -0
  150. package/dist/tests/types/relation.test.d.ts +1 -0
  151. package/package.json +15 -3
  152. package/.claude/safe-setup/.env.example +0 -3
  153. package/.claude/safe-setup/Dockerfile.claude +0 -36
  154. package/.claude/safe-setup/HACKING.md +0 -63
  155. package/.claude/safe-setup/Makefile +0 -22
  156. package/.claude/safe-setup/docker-compose.yml +0 -18
  157. package/.claude/safe-setup/entrypoint.sh +0 -13
  158. package/.claude/settings.local.json +0 -9
  159. package/.claude/typescript-annotations.md +0 -273
  160. package/.github/workflows/test.yml +0 -26
  161. package/CLAUDE.md +0 -48
  162. package/Makefile +0 -2
  163. package/example/README.md +0 -22
  164. package/example/index.ts +0 -316
  165. package/example/package.json +0 -16
  166. package/example/tsconfig.json +0 -11
  167. package/tests/bmg.test.ts +0 -16
  168. package/tests/fixtures.ts +0 -9
  169. package/tests/operators/allbut.test.ts +0 -51
  170. package/tests/operators/autowrap.test.ts +0 -82
  171. package/tests/operators/constants.test.ts +0 -37
  172. package/tests/operators/cross_product.test.ts +0 -90
  173. package/tests/operators/exclude.test.ts +0 -43
  174. package/tests/operators/extend.test.ts +0 -45
  175. package/tests/operators/group.test.ts +0 -69
  176. package/tests/operators/image.test.ts +0 -152
  177. package/tests/operators/intersect.test.ts +0 -53
  178. package/tests/operators/isEqual.test.ts +0 -111
  179. package/tests/operators/join.test.ts +0 -116
  180. package/tests/operators/left_join.test.ts +0 -116
  181. package/tests/operators/matching.test.ts +0 -91
  182. package/tests/operators/minus.test.ts +0 -47
  183. package/tests/operators/not_matching.test.ts +0 -104
  184. package/tests/operators/one.test.ts +0 -19
  185. package/tests/operators/prefix.test.ts +0 -37
  186. package/tests/operators/project.test.ts +0 -48
  187. package/tests/operators/rename.test.ts +0 -39
  188. package/tests/operators/restrict.test.ts +0 -27
  189. package/tests/operators/suffix.test.ts +0 -37
  190. package/tests/operators/summarize.test.ts +0 -109
  191. package/tests/operators/transform.test.ts +0 -94
  192. package/tests/operators/ungroup.test.ts +0 -67
  193. package/tests/operators/union.test.ts +0 -51
  194. package/tests/operators/unwrap.test.ts +0 -50
  195. package/tests/operators/where.test.ts +0 -33
  196. package/tests/operators/wrap.test.ts +0 -54
  197. package/tests/operators/yByX.test.ts +0 -32
  198. package/tests/types/relation.test.ts +0 -296
  199. package/tsconfig.json +0 -37
  200. package/tsconfig.node.json +0 -9
  201. package/vitest.config.ts +0 -15
package/dist/bmg.cjs ADDED
@@ -0,0 +1,2 @@
1
+ function t(t,r){(null==r||r>t.length)&&(r=t.length);for(var n=0,e=Array(r);n<r;n++)e[n]=t[n];return e}function r(r,n){var e="undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(e)return(e=e.call(r)).next.bind(e);if(Array.isArray(r)||(e=function(r,n){if(r){if("string"==typeof r)return t(r,n);var e={}.toString.call(r).slice(8,-1);return"Object"===e&&r.constructor&&(e=r.constructor.name),"Map"===e||"Set"===e?Array.from(r):"Arguments"===e||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(e)?t(r,n):void 0}}(r))||n&&r&&"number"==typeof r.length){e&&(r=e);var u=0;return function(){return u>=r.length?{done:!0}:{done:!1,value:r[u++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function n(){return n=Object.assign?Object.assign.bind():function(t){for(var r=1;r<arguments.length;r++){var n=arguments[r];for(var e in n)({}).hasOwnProperty.call(n,e)&&(t[e]=n[e])}return t},n.apply(null,arguments)}var e=function(t){if("function"==typeof t)return t;var r=t;return function(t){return Object.keys(r).every(function(n){return t[n]===r[n]})}},u=/*#__PURE__*/function(){function t(t){this.tuples=void 0,this.tuples=t,this.tuples=t}var r=t.prototype;return r.restrict=function(t){return h(this,t)},r.where=function(t){return h(this,t)},r.exclude=function(t){return d(this,t)},r.project=function(t){return w(this,t)},r.allbut=function(t){return x(this,t)},r.extend=function(t){return j(this,t)},r.constants=function(t){return y(this,t)},r.rename=function(t){return g(this,t)},r.prefix=function(t,r){return m(this,t,r)},r.suffix=function(t,r){return b(this,t,r)},r.union=function(t){return O(this,t)},r.minus=function(t){return S(this,t)},r.intersect=function(t){return A(this,t)},r.matching=function(t,r){return N(this,t,r)},r.not_matching=function(t,r){return k(this,t,r)},r.join=function(t,r){return M(this,t,r)},r.left_join=function(t,r){return z(this,t,r)},r.cross_product=function(t){return J(this,t)},r.cross_join=function(t){return J(this,t)},r.image=function(t,r,n){return B(this,t,r,n)},r.group=function(t,r){return P(this,t,r)},r.ungroup=function(t){return V(this,t)},r.wrap=function(t,r){return $(this,t,r)},r.unwrap=function(t){return D(this,t)},r.summarize=function(t,r){return q(this,t,r)},r.transform=function(t){return G(this,t)},r.autowrap=function(t){return F(this,t)},r.one=function(){return L(this)},r.toArray=function(){return this.tuples},r.yByX=function(t,r){return Q(this,t,r)},r.isEqual=function(t){return K(this,t)},t}(),o=function(t){return null!=t&&t.constructor===u},a=function(t){var r=Object.entries(t).map(function(t){return[t[0],(r=t[1],o(r)?r.toArray().map(function(t){return a(t)}).sort():r)];var r});return JSON.stringify(r.sort(function(t,r){return t[0].localeCompare(r[0])}))},i=function(t){for(var n,e=new Set,u=[],o=r(t);!(n=o()).done;){var i=n.value,s=a(i);e.has(s)||(e.add(s),u.push(i))}return u},s=function(t){if(Array.isArray(t))return{tuples:function(){return t},output:function(t){return t}};if(o(t))return{tuples:function(){return t.toArray()},output:function(t){return new u(t)}};throw"Unable to iterate "+t},c=function(t){throw t},f=function(t,r,n){return t?Array.isArray(t)?t.reduce(function(t,r){return t[r]=r,t},{}):t:function(t,r){if(0===t.length||0===r.length)return[];var n=new Set(Object.keys(t[0]));return Object.keys(r[0]).filter(function(t){return n.has(t)})}(r,n).reduce(function(t,r){return t[r]=r,t},{})},l=function(t,r,n){for(var e=0,u=Object.entries(n);e<u.length;e++){var o=u[e];if(t[o[0]]!==r[o[1]])return!1}return!0},p=function(t,r,n){return("left"===n?Object.keys(r):Object.values(r)).map(function(r){return JSON.stringify(t[r])}).join("|")},v=function(t,r){for(var n=new Set(Object.values(r)),e={},u=0,o=Object.entries(t);u<o.length;u++){var a=o[u],i=a[0],s=a[1];n.has(i)||(e[i]=s)}return e},h=function(t,n){for(var u,o=s(t),a=o.tuples(),i=e(n),c=[],f=r(a);!(u=f()).done;){var l=u.value;i(l)&&c.push(l)}return o.output(c)},d=function(t,n){for(var u,o=s(t),a=o.tuples(),i=e(n),c=[],f=r(a);!(u=f()).done;){var l=u.value;i(l)||c.push(l)}return o.output(c)},y=function(t,e){for(var u,o=s(t),a=[],i=r(o.tuples());!(u=i()).done;)a.push(n({},u.value,e));return o.output(a)},g=function(t,n){for(var e,u=s(t),o=u.tuples(),a=function(t){return"function"==typeof t?t:function(r){return t[r]||r}}(n),i=[],c=function(){var t=e.value,r=Object.keys(t).reduce(function(r,n){return r[a(n)]=t[n],r},{});i.push(r)},f=r(o);!(e=f()).done;)c();return u.output(i)},m=function(t,r,n){var e,u=new Set(null!=(e=null==n?void 0:n.except)?e:[]);return g(t,function(t){return u.has(t)?t:""+r+t})},b=function(t,r,n){var e,u=new Set(null!=(e=null==n?void 0:n.except)?e:[]);return g(t,function(t){return u.has(t)?t:""+t+r})},w=function(t,n){for(var e,u=s(t),o=u.tuples(),a=[],c=function(){var t=e.value,r=n.reduce(function(r,n){return n in t&&(r[n]=t[n]),r},{});a.push(r)},f=r(o);!(e=f()).done;)c();return u.output(i(a))},x=function(t,n){for(var e,u=s(t),o=u.tuples(),a=new Set(n),c=[],f=function(){var t=e.value,r=Object.keys(t).reduce(function(r,n){return a.has(n)||(r[n]=t[n]),r},{});c.push(r)},l=r(o);!(e=l()).done;)f();return u.output(i(c))},j=function(t,e){for(var u,o=s(t),a=[],i=r(o.tuples());!(u=i()).done;){for(var c=u.value,f=n({},c),l=0,p=Object.entries(e);l<p.length;l++){var v=p[l],h=v[1];f[v[0]]="function"==typeof h?h(c):c[h]}a.push(f)}return o.output(a)},O=function(t,n){for(var e,u=s(t),o=s(n),i=new Set,c=[],f=r(u.tuples());!(e=f()).done;){var l=e.value,p=a(l);i.has(p)||(i.add(p),c.push(l))}for(var v,h=r(o.tuples());!(v=h()).done;){var d=v.value,y=a(d);i.has(y)||(i.add(y),c.push(d))}return u.output(c)},S=function(t,n){for(var e,u=s(t),o=s(n),i=new Set,c=r(o.tuples());!(e=c()).done;)i.add(a(e.value));for(var f,l=new Set,p=[],v=r(u.tuples());!(f=v()).done;){var h=f.value,d=a(h);i.has(d)||l.has(d)||(l.add(d),p.push(h))}return u.output(p)},A=function(t,n){for(var e,u=s(t),o=s(n),i=new Set,c=r(o.tuples());!(e=c()).done;)i.add(a(e.value));for(var f,l=new Set,p=[],v=r(u.tuples());!(f=v()).done;){var h=f.value,d=a(h);i.has(d)&&!l.has(d)&&(l.add(d),p.push(h))}return u.output(p)},N=function(t,n,e){for(var u,o=s(t),a=s(n),i=[].concat(o.tuples()),c=[].concat(a.tuples()),l=f(e,i,c),v=new Set,h=r(c);!(u=h()).done;)v.add(p(u.value,l,"right"));for(var d,y=[],g=r(i);!(d=g()).done;){var m=d.value;v.has(p(m,l,"left"))&&y.push(m)}return o.output(y)},k=function(t,n,e){for(var u,o=s(t),a=s(n),i=[].concat(o.tuples()),c=[].concat(a.tuples()),l=f(e,i,c),v=new Set,h=r(c);!(u=h()).done;)v.add(p(u.value,l,"right"));for(var d,y=[],g=r(i);!(d=g()).done;){var m=d.value;v.has(p(m,l,"left"))||y.push(m)}return o.output(y)},_=function(t,r,e){return n({},t,v(r,e))},M=function(t,n,e){for(var u,o=s(t),a=s(n),i=[].concat(o.tuples()),c=[].concat(a.tuples()),p=f(e,i,c),v=[],h=r(i);!(u=h()).done;)for(var d,y=u.value,g=r(c);!(d=g()).done;){var m=d.value;l(y,m,p)&&v.push(_(y,m,p))}return o.output(v)},E=function(t,e,u){for(var o,a=n({},t),i=r(u);!(o=i()).done;){var s=o.value;a[s]=e?e[s]:null}return a},z=function(t,n,e){for(var u,o=s(t),a=s(n),i=[].concat(o.tuples()),c=[].concat(a.tuples()),p=f(e,i,c),v=function(t,r){if(0===t.length)return[];var n=new Set(Object.values(r));return Object.keys(t[0]).filter(function(t){return!n.has(t)})}(c,p),h=[],d=r(i);!(u=d()).done;){for(var y,g=u.value,m=!1,b=r(c);!(y=b()).done;){var w=y.value;l(g,w,p)&&(h.push(E(g,w,v)),m=!0)}m||h.push(E(g,null,v))}return o.output(h)},J=function(t,e){for(var u,o=s(t),a=s(e),c=[].concat(o.tuples()),f=[].concat(a.tuples()),l=[],p=r(c);!(u=p()).done;)for(var v,h=u.value,d=r(f);!(v=d()).done;)l.push(n({},v.value,h));return o.output(i(l))},B=function(t,e,o,a){for(var i,c=s(t),p=s(e),h=[].concat(c.tuples()),d=[].concat(p.tuples()),y=f(a,h,d),g=[],m=r(h);!(i=m()).done;){for(var b,w,x=i.value,j=[],O=r(d);!(w=O()).done;){var S=w.value;l(x,S,y)&&j.push(v(S,y))}g.push(n({},x,((b={})[o]=new u(j),b)))}return c.output(g)},I=function(t,r){return r.map(function(r){return JSON.stringify(t[r])}).join("|")},R=function(t,r){return r.reduce(function(r,n){return r[n]=t[n],r},{})},U=function(t,r){if("function"==typeof r)return r(t);var n="string"==typeof r?{op:r,attr:""}:r,e=n.op,u=n.attr;switch(e){case"count":return t.length;case"sum":return t.reduce(function(t,r){return t+(Number(r[u])||0)},0);case"min":var o=t.map(function(t){return t[u]}).filter(function(t){return null!=t});return o.length>0?Math.min.apply(Math,o.map(Number)):null;case"max":var a=t.map(function(t){return t[u]}).filter(function(t){return null!=t});return a.length>0?Math.max.apply(Math,a.map(Number)):null;case"avg":var i=t.map(function(t){return Number(t[u])}).filter(function(t){return!isNaN(t)});return i.length>0?i.reduce(function(t,r){return t+r},0)/i.length:null;case"collect":return t.map(function(t){return t[u]});default:throw new Error("Unknown aggregator: "+e)}},q=function(t,n,e){for(var u,o=s(t),a=[].concat(o.tuples()),i=new Map,c=r(a);!(u=c()).done;){var f=u.value,l=I(f,n);i.has(l)||i.set(l,[]),i.get(l).push(f)}for(var p,v=[],h=r(i.values());!(p=h()).done;){for(var d=p.value,y=R(d[0],n),g=0,m=Object.entries(e);g<m.length;g++){var b=m[g];y[b[0]]=U(d,b[1])}v.push(y)}return o.output(v)},C=function(t,r){return r.map(function(r){return JSON.stringify(t[r])}).join("|")},X=function(t,r){return r.reduce(function(r,n){return r[n]=t[n],r},{})},P=function(t,e,o){var a=s(t),i=[].concat(a.tuples());if(0===i.length)return a.output([]);for(var c,f=Object.keys(i[0]),l=new Set(e),p=f.filter(function(t){return!l.has(t)}),v=new Map,h=r(i);!(c=h()).done;){var d=c.value,y=C(d,p);v.has(y)||v.set(y,{base:X(d,p),nested:[]}),v.get(y).nested.push(X(d,e))}for(var g,m=[],b=r(v.values());!(g=b()).done;){var w,x=g.value;m.push(n({},x.base,((w={})[o]=new u(x.nested),w)))}return a.output(m)},T=function(t){if(o(t))return t.toArray();if(Array.isArray(t))return t;throw new Error("Value is not a relation or array")},V=function(t,e){for(var u,o=s(t),a=[],i=r([].concat(o.tuples()));!(u=i()).done;){for(var c=u.value,f=T(c[e]),l={},p=0,v=Object.entries(c);p<v.length;p++){var h=v[p],d=h[0];d!==e&&(l[d]=h[1])}for(var y,g=r(f);!(y=g()).done;)a.push(n({},l,y.value))}return o.output(a)},$=function(t,e,u){for(var o,a=s(t),i=a.tuples(),c=new Set(e),f=[],l=r(i);!(o=l()).done;){for(var p,v={},h={},d=0,y=Object.entries(o.value);d<y.length;d++){var g=y[d],m=g[0],b=g[1];c.has(m)?v[m]=b:h[m]=b}f.push(n({},h,((p={})[u]=v,p)))}return a.output(f)},D=function(t,e){for(var u,o=s(t),a=[],i=r(o.tuples());!(u=i()).done;){var c=u.value,f=c[e];if("object"!=typeof f||null===f||Array.isArray(f))throw new Error("Attribute '"+e+"' is not a tuple (object)");for(var l={},p=0,v=Object.entries(c);p<v.length;p++){var h=v[p],d=h[0];d!==e&&(l[d]=h[1])}a.push(n({},l,f))}return o.output(a)},F=function(n,e){for(var u,o,a=null!=(u=null==e?void 0:e.separator)?u:"_",i=s(n),c=[],f=r(i.tuples());!(o=f()).done;){for(var l={},p=0,v=Object.entries(o.value);p<v.length;p++){var h=v[p],d=h[0],y=h[1],g=d.split(a);if(1===g.length)l[d]=y;else{var m,b=g[0],w=t(g).slice(1);l[b]=null!=(m=l[b])?m:{},l[b][w.join(a)]=y}}c.push(l)}return i.output(c)},G=function(t,n){for(var e,u=s(t),o=[],a=r(u.tuples());!(e=a()).done;){for(var i={},c=0,f=Object.entries(e.value);c<f.length;c++){var l=f[c],p=l[0];i[p]=H(l[1],p,n)}o.push(i)}return u.output(o)},H=function(t,r,n){if("function"==typeof n)return n(t);if(Array.isArray(n))return n.reduce(function(t,r){return r(t)},t);var e=n[r];return e?Array.isArray(e)?e.reduce(function(t,r){return r(t)},t):e(t):t},K=function(t,n){for(var e,u=s(t),o=s(n),i=new Set,c=r(u.tuples());!(e=c()).done;)i.add(a(e.value));for(var f,l=new Set,p=r(o.tuples());!(f=p()).done;)l.add(a(f.value));if(i.size!==l.size)return!1;for(var v,h=r(i);!(v=h()).done;)if(!l.has(v.value))return!1;return!0},L=function(t){for(var n,e,u=r(s(t).tuples());!(e=u()).done;){var o=e.value;if(n)return c("More than one tuple found");n=o}return n||c("Relation is empty")},Q=function(t,n,e){for(var u,o={},a=r(s(t).tuples());!(u=a()).done;){var i=u.value;o[""+i[e]]=i[n]}return o};function W(t){return new u(t)}W.isRelation=o,exports.Bmg=W,exports.allbut=x,exports.autowrap=F,exports.constants=y,exports.cross_join=J,exports.cross_product=J,exports.exclude=d,exports.extend=j,exports.group=P,exports.image=B,exports.intersect=A,exports.isEqual=K,exports.isRelation=o,exports.join=M,exports.left_join=z,exports.matching=N,exports.minus=S,exports.not_matching=k,exports.one=L,exports.prefix=m,exports.project=w,exports.rename=g,exports.restrict=h,exports.suffix=b,exports.summarize=q,exports.transform=G,exports.ungroup=V,exports.union=O,exports.unwrap=D,exports.where=h,exports.wrap=$,exports.yByX=Q;
2
+ //# sourceMappingURL=bmg.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bmg.cjs","sources":["../src/support/toPredicateFunc.ts","../src/Relation/Memory.ts","../src/operators/isRelation.ts","../src/operators/_helpers.ts","../src/operators/restrict.ts","../src/operators/exclude.ts","../src/operators/constants.ts","../src/operators/rename.ts","../src/operators/prefix.ts","../src/operators/suffix.ts","../src/operators/project.ts","../src/operators/allbut.ts","../src/operators/extend.ts","../src/operators/union.ts","../src/operators/minus.ts","../src/operators/intersect.ts","../src/operators/matching.ts","../src/operators/not_matching.ts","../src/operators/join.ts","../src/operators/left_join.ts","../src/operators/cross_product.ts","../src/operators/image.ts","../src/operators/summarize.ts","../src/operators/group.ts","../src/operators/ungroup.ts","../src/operators/wrap.ts","../src/operators/unwrap.ts","../src/operators/autowrap.ts","../src/operators/transform.ts","../src/operators/isEqual.ts","../src/operators/one.ts","../src/operators/yByX.ts","../src/index.ts"],"sourcesContent":["import { Predicate, PredicateFunc, Tuple } from '../types';\n\nexport const toPredicateFunc = (p: Predicate): PredicateFunc => {\n if (typeof(p) === 'function') {\n return p as PredicateFunc;\n } else {\n const expected = p as Tuple;\n return (t: Tuple) => {\n return Object.keys(expected).every(k => t[k] === expected[k])\n }\n }\n}\n","import {\n allbut,\n autowrap,\n constants,\n cross_product,\n exclude,\n extend,\n group,\n image,\n intersect,\n isEqual,\n join,\n left_join,\n matching,\n minus,\n not_matching,\n one,\n prefix,\n project,\n rename,\n restrict,\n suffix,\n summarize,\n where,\n transform,\n ungroup,\n union,\n unwrap,\n wrap,\n yByX,\n} from \"../operators\";\nimport type {\n AttrName,\n AutowrapOptions,\n JoinKeys,\n Relation,\n RelationOperand,\n Transformation,\n Tuple,\n TypedPredicate,\n TypedExtension,\n RenameMap,\n Renamed,\n Prefixed,\n Suffixed,\n Joined,\n LeftJoined,\n Wrapped,\n Unwrapped,\n Ungrouped,\n} from \"../types\";\nimport type { AggregatorResults } from \"../utility-types\";\n\n/**\n * In-memory implementation of the Relation interface.\n *\n * @typeParam T - The tuple type for this relation. Defaults to `Tuple` (Record<string, unknown>).\n */\nexport class MemoryRelation<T = Tuple> implements Relation<T> {\n\n constructor(private tuples: T[]) {\n this.tuples = tuples;\n }\n\n // === Type-preserving operators ===\n\n restrict(p: TypedPredicate<T>): Relation<T> {\n return restrict(this as any, p as any) as unknown as Relation<T>;\n }\n\n where(p: TypedPredicate<T>): Relation<T> {\n return where(this as any, p as any) as unknown as Relation<T>;\n }\n\n exclude(p: TypedPredicate<T>): Relation<T> {\n return exclude(this as any, p as any) as unknown as Relation<T>;\n }\n\n // === Projection operators ===\n\n project<K extends keyof T>(attrs: K[]): Relation<Pick<T, K>> {\n return project(this as any, attrs as AttrName[]) as unknown as Relation<Pick<T, K>>;\n }\n\n allbut<K extends keyof T>(attrs: K[]): Relation<Omit<T, K>> {\n return allbut(this as any, attrs as AttrName[]) as unknown as Relation<Omit<T, K>>;\n }\n\n // === Extension operators ===\n\n extend<E extends Record<string, unknown>>(e: TypedExtension<T, E>): Relation<T & E> {\n return extend(this as any, e as any) as unknown as Relation<T & E>;\n }\n\n constants<C extends Tuple>(consts: C): Relation<T & C> {\n return constants(this as any, consts) as unknown as Relation<T & C>;\n }\n\n // === Rename operators ===\n\n rename<R extends RenameMap<T>>(r: R): Relation<Renamed<T, R>> {\n return rename(this as any, r as any) as unknown as Relation<Renamed<T, R>>;\n }\n\n prefix<P extends string, Ex extends keyof T = never>(pfx: P, options?: { except?: Ex[] }): Relation<Prefixed<T, P, Ex>> {\n return prefix(this as any, pfx, options as any) as unknown as Relation<Prefixed<T, P, Ex>>;\n }\n\n suffix<S extends string, Ex extends keyof T = never>(sfx: S, options?: { except?: Ex[] }): Relation<Suffixed<T, S, Ex>> {\n return suffix(this as any, sfx, options as any) as unknown as Relation<Suffixed<T, S, Ex>>;\n }\n\n // === Set operators ===\n\n union(right: RelationOperand<T>): Relation<T> {\n return union(this as any, right as any) as unknown as Relation<T>;\n }\n\n minus(right: RelationOperand<T>): Relation<T> {\n return minus(this as any, right as any) as unknown as Relation<T>;\n }\n\n intersect(right: RelationOperand<T>): Relation<T> {\n return intersect(this as any, right as any) as unknown as Relation<T>;\n }\n\n // === Semi-join operators ===\n\n matching<R>(right: RelationOperand<R>, keys?: JoinKeys): Relation<T> {\n return matching(this as any, right as any, keys) as unknown as Relation<T>;\n }\n\n not_matching<R>(right: RelationOperand<R>, keys?: JoinKeys): Relation<T> {\n return not_matching(this as any, right as any, keys) as unknown as Relation<T>;\n }\n\n // === Join operators ===\n\n join<R>(right: RelationOperand<R>, keys?: JoinKeys): Relation<Joined<T, R>> {\n return join(this as any, right as any, keys) as unknown as Relation<Joined<T, R>>;\n }\n\n left_join<R>(right: RelationOperand<R>, keys?: JoinKeys): Relation<LeftJoined<T, R>> {\n return left_join(this as any, right as any, keys) as unknown as Relation<LeftJoined<T, R>>;\n }\n\n cross_product<R>(right: RelationOperand<R>): Relation<T & R> {\n return cross_product(this as any, right as any) as unknown as Relation<T & R>;\n }\n\n cross_join<R>(right: RelationOperand<R>): Relation<T & R> {\n return cross_product(this as any, right as any) as unknown as Relation<T & R>;\n }\n\n // === Nesting operators ===\n\n image<R, As extends string>(right: RelationOperand<R>, as: As, keys?: JoinKeys): Relation<T & Record<As, Relation<Omit<R, keyof T & keyof R>>>> {\n return image(this as any, right as any, as, keys) as unknown as Relation<T & Record<As, Relation<Omit<R, keyof T & keyof R>>>>;\n }\n\n group<K extends keyof T, As extends string>(attrs: K[], as: As): Relation<Omit<T, K> & Record<As, Relation<Pick<T, K>>>> {\n return group(this as any, attrs as AttrName[], as) as unknown as Relation<Omit<T, K> & Record<As, Relation<Pick<T, K>>>>;\n }\n\n ungroup<K extends keyof T>(attr: K): Relation<Ungrouped<T, K>> {\n return ungroup(this as any, attr as AttrName) as unknown as Relation<Ungrouped<T, K>>;\n }\n\n wrap<K extends keyof T, As extends string>(attrs: K[], as: As): Relation<Wrapped<T, K, As>> {\n return wrap(this as any, attrs as AttrName[], as) as unknown as Relation<Wrapped<T, K, As>>;\n }\n\n unwrap<K extends keyof T>(attr: K): Relation<Unwrapped<T, K>> {\n return unwrap(this as any, attr as AttrName) as unknown as Relation<Unwrapped<T, K>>;\n }\n\n // === Aggregation ===\n\n summarize<By extends keyof T, Aggs extends Record<string, unknown>>(by: By[], aggs: Aggs): Relation<Pick<T, By> & AggregatorResults<Aggs>> {\n return summarize(this as any, by as AttrName[], aggs as any) as unknown as Relation<Pick<T, By> & AggregatorResults<Aggs>>;\n }\n\n // === Transform ===\n\n transform(t: Transformation): Relation<T> {\n return transform(this as any, t) as unknown as Relation<T>;\n }\n\n // === Dynamic ===\n\n autowrap(options?: AutowrapOptions): Relation<Tuple> {\n return autowrap(this as any, options) as Relation<Tuple>;\n }\n\n // === Non-relational ===\n\n one(): T {\n return one(this as any) as T;\n }\n\n toArray(): T[] {\n return this.tuples;\n }\n\n yByX<Y extends keyof T, X extends keyof T>(y: Y, x: X): Record<T[X] & PropertyKey, T[Y]> {\n return yByX(this as any, y as AttrName, x as AttrName) as Record<T[X] & PropertyKey, T[Y]>;\n }\n\n isEqual(right: any): boolean {\n return isEqual(this as any, right as any);\n }\n\n}\n","import { MemoryRelation } from \"@/Relation\";\n\nexport const isRelation = (op) => {\n return op != null && op.constructor === MemoryRelation;\n}\n","import { OperationalOperand, Relation, RelationOperand, Renaming, RenamingFunc, Tuple, JoinKeys, AttrName } from \"@/types\";\nimport { MemoryRelation } from '@/Relation';\nimport { isRelation } from \"./isRelation\";\n\nconst valueKey = (value: unknown): unknown => {\n if (isRelation(value)) {\n // For nested relations, convert to sorted array of tuple keys for comparison\n const tuples = (value as Relation).toArray();\n const keys = tuples.map(t => tupleKey(t)).sort();\n return keys;\n }\n return value;\n}\n\n/**\n * Generates a unique string key for a tuple, used for equality comparison and deduplication.\n * Handles nested relations by converting them to sorted tuple keys.\n *\n * @example\n * tupleKey({ name: 'Alice', age: 30 })\n * // => '[[\"age\",30],[\"name\",\"Alice\"]]'\n *\n * @example\n * tupleKey({ id: 1, items: Bmg([{ x: 1 }, { x: 2 }]) })\n * // => '[[\"id\",1],[\"items\",[...]]]' (nested relation converted to sorted keys)\n */\nexport const tupleKey = (tuple: Tuple): string => {\n const entries = Object.entries(tuple).map(([k, v]) => [k, valueKey(v)]);\n return JSON.stringify(entries.sort(([a], [b]) => (a as string).localeCompare(b as string)));\n}\n\n/**\n * Removes duplicate tuples from an array, preserving order of first occurrence.\n * Uses tupleKey() for equality comparison.\n *\n * @example\n * deduplicate([\n * { id: 1, name: 'Alice' },\n * { id: 2, name: 'Bob' },\n * { id: 1, name: 'Alice' }, // duplicate\n * ])\n * // => [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }]\n */\nexport const deduplicate = (tuples: Tuple[]): Tuple[] => {\n const seen = new Set<string>();\n const result: Tuple[] = [];\n for (const tuple of tuples) {\n const key = tupleKey(tuple);\n if (!seen.has(key)) {\n seen.add(key);\n result.push(tuple);\n }\n }\n return result;\n}\n\n/**\n * Converts a RelationOperand (Relation or Tuple[]) to an OperationalOperand\n * that provides a uniform interface for iteration and output.\n *\n * @example\n * // With array input, output remains array\n * const op = toOperationalOperand([{ id: 1 }]);\n * [...op.tuples()]; // => [{ id: 1 }]\n * op.output([{ id: 2 }]); // => [{ id: 2 }]\n *\n * @example\n * // With Relation input, output is a new Relation\n * const op = toOperationalOperand(Bmg([{ id: 1 }]));\n * [...op.tuples()]; // => [{ id: 1 }]\n * op.output([{ id: 2 }]); // => Bmg([{ id: 2 }])\n */\nexport const toOperationalOperand = (operand: RelationOperand): OperationalOperand => {\n if (Array.isArray(operand)) {\n return {\n tuples: () => operand,\n output: (tuples) => tuples,\n };\n } else if (isRelation(operand)) {\n return {\n tuples: () => (operand as Relation).toArray(),\n output: (tuples) => new MemoryRelation(tuples),\n };\n } else {\n throw `Unable to iterate ${operand}`\n }\n}\n\n/**\n * Converts a Renaming (object or function) to a RenamingFunc.\n *\n * @example\n * // Object renaming\n * const fn = toRenamingFunc({ name: 'fullName', age: 'years' });\n * fn('name'); // => 'fullName'\n * fn('age'); // => 'years'\n * fn('other'); // => 'other' (unchanged)\n *\n * @example\n * // Function renaming (passed through)\n * const fn = toRenamingFunc(attr => attr.toUpperCase());\n * fn('name'); // => 'NAME'\n */\nexport const toRenamingFunc = (renaming: Renaming): RenamingFunc => {\n if (typeof(renaming) === 'function') {\n return renaming;\n } else {\n return (attr) => renaming[attr] || attr;\n }\n}\n\nexport const error = (msg: string) => {\n throw(msg);\n}\n\n// Join helpers\n\n/**\n * Finds attribute names that exist in both left and right tuple arrays.\n * Used for natural joins when no explicit keys are provided.\n *\n * @example\n * const left = [{ id: 1, name: 'Alice', city: 'NYC' }];\n * const right = [{ city: 'NYC', country: 'USA' }];\n * getCommonAttrs(left, right);\n * // => ['city']\n *\n * @example\n * const left = [{ a: 1, b: 2 }];\n * const right = [{ b: 2, c: 3 }];\n * getCommonAttrs(left, right);\n * // => ['b']\n */\nexport const getCommonAttrs = (left: Tuple[], right: Tuple[]): AttrName[] => {\n if (left.length === 0 || right.length === 0) return [];\n const leftAttrs = new Set(Object.keys(left[0]));\n const rightAttrs = Object.keys(right[0]);\n return rightAttrs.filter(attr => leftAttrs.has(attr));\n}\n\n/**\n * Normalizes JoinKeys to a Record<AttrName, AttrName> mapping left attrs to right attrs.\n *\n * @example\n * // undefined => use common attributes\n * normalizeKeys(undefined, [{ id: 1, city: 'NYC' }], [{ city: 'NYC' }]);\n * // => { city: 'city' }\n *\n * @example\n * // Array of common attribute names\n * normalizeKeys(['city', 'country'], leftTuples, rightTuples);\n * // => { city: 'city', country: 'country' }\n *\n * @example\n * // Object mapping left attr to right attr\n * normalizeKeys({ city: 'location' }, leftTuples, rightTuples);\n * // => { city: 'location' }\n */\nexport const normalizeKeys = (keys: JoinKeys | undefined, leftTuples: Tuple[], rightTuples: Tuple[]): Record<AttrName, AttrName> => {\n if (!keys) {\n const common = getCommonAttrs(leftTuples, rightTuples);\n return common.reduce((acc, attr) => {\n acc[attr] = attr;\n return acc;\n }, {} as Record<AttrName, AttrName>);\n }\n if (Array.isArray(keys)) {\n return keys.reduce((acc, attr) => {\n acc[attr] = attr;\n return acc;\n }, {} as Record<AttrName, AttrName>);\n }\n return keys;\n}\n\n/**\n * Checks if two tuples match on the specified key mapping.\n *\n * @example\n * const keyMap = { city: 'location' };\n * tuplesMatch({ id: 1, city: 'NYC' }, { location: 'NYC', pop: 8 }, keyMap);\n * // => true (left.city === right.location)\n *\n * @example\n * const keyMap = { city: 'city' };\n * tuplesMatch({ city: 'NYC' }, { city: 'LA' }, keyMap);\n * // => false\n */\nexport const tuplesMatch = (left: Tuple, right: Tuple, keyMap: Record<AttrName, AttrName>): boolean => {\n for (const [leftAttr, rightAttr] of Object.entries(keyMap)) {\n if (left[leftAttr] !== right[rightAttr]) return false;\n }\n return true;\n}\n\n/**\n * Creates a string key from a tuple's join attributes for fast Set-based lookups.\n * Used by matching/not_matching for efficient semi-join operations.\n *\n * @example\n * const keyMap = { first: 'fname', last: 'lname' };\n *\n * // Left side uses left attr names (keys of keyMap)\n * matchKey({ id: 1, first: 'John', last: 'Doe' }, keyMap, 'left');\n * // => '\"John\"|\"Doe\"'\n *\n * // Right side uses right attr names (values of keyMap)\n * matchKey({ fname: 'John', lname: 'Doe', age: 30 }, keyMap, 'right');\n * // => '\"John\"|\"Doe\"'\n */\nexport const matchKey = (tuple: Tuple, keyMap: Record<AttrName, AttrName>, side: 'left' | 'right'): string => {\n const attrs = side === 'left' ? Object.keys(keyMap) : Object.values(keyMap);\n const values = attrs.map(attr => JSON.stringify(tuple[attr]));\n return values.join('|');\n}\n\n/**\n * Removes join key attributes from a right tuple when merging.\n * Used to avoid duplicate columns in join results.\n *\n * @example\n * const keyMap = { city: 'location' };\n * projectOutKeys({ location: 'NYC', country: 'USA', pop: 8 }, keyMap);\n * // => { country: 'USA', pop: 8 } (location removed)\n *\n * @example\n * const keyMap = { a: 'a', b: 'b' };\n * projectOutKeys({ a: 1, b: 2, c: 3 }, keyMap);\n * // => { c: 3 } (a and b removed)\n */\nexport const projectOutKeys = (tuple: Tuple, keyMap: Record<AttrName, AttrName>): Tuple => {\n const rightKeys = new Set(Object.values(keyMap));\n const result: Tuple = {};\n for (const [attr, value] of Object.entries(tuple)) {\n if (!rightKeys.has(attr)) {\n result[attr] = value;\n }\n }\n return result;\n}\n","import { toPredicateFunc } from \"../support/toPredicateFunc\";\nimport { RelationOperand, Predicate, Tuple } from \"../types\";\nimport { toOperationalOperand } from \"./_helpers\";\n\nexport const restrict = (operand: RelationOperand, p: Predicate): RelationOperand => {\n const op = toOperationalOperand(operand);\n const iterable = op.tuples();\n const f = toPredicateFunc(p)\n const kept: Tuple[] = [];\n for (const tuple of iterable) {\n if (f(tuple)) kept.push(tuple);\n }\n return op.output(kept)\n}\n","import { toPredicateFunc } from \"../support/toPredicateFunc\";\nimport { RelationOperand, Predicate, Tuple } from \"../types\";\nimport { toOperationalOperand } from \"./_helpers\";\n\nexport const exclude = (operand: RelationOperand, p: Predicate): RelationOperand => {\n const op = toOperationalOperand(operand);\n const iterable = op.tuples();\n const f = toPredicateFunc(p)\n const kept: Tuple[] = [];\n for (const tuple of iterable) {\n if (!f(tuple)) kept.push(tuple);\n }\n return op.output(kept)\n}\n","import { RelationOperand, Tuple } from \"../types\";\nimport { toOperationalOperand } from \"./_helpers\";\n\nexport const constants = (operand: RelationOperand, consts: Tuple): RelationOperand => {\n const op = toOperationalOperand(operand);\n const iterable = op.tuples();\n const result: Tuple[] = [];\n for (const tuple of iterable) {\n result.push({ ...tuple, ...consts });\n }\n return op.output(result)\n}\n","import { RelationOperand, Renaming, Tuple } from \"../types\";\nimport { toOperationalOperand, toRenamingFunc } from \"./_helpers\";\n\nexport const rename = (operand: RelationOperand, renaming: Renaming): RelationOperand => {\n const op = toOperationalOperand(operand);\n const iterable = op.tuples();\n const renamingFunc = toRenamingFunc(renaming)\n const result: Tuple[] = [];\n for (const tuple of iterable) {\n const renamed = Object.keys(tuple).reduce((memo, attr) => {\n memo[renamingFunc(attr)] = tuple[attr];\n return memo;\n }, {})\n result.push(renamed);\n }\n return op.output(result)\n}\n","import { PrefixOptions, RelationOperand } from \"../types\";\nimport { rename } from \"./rename\";\n\nexport const prefix = (operand: RelationOperand, pfx: string, options?: PrefixOptions): RelationOperand => {\n const except = new Set(options?.except ?? []);\n return rename(operand, (attr) => except.has(attr) ? attr : `${pfx}${attr}`);\n}\n","import { RelationOperand, SuffixOptions } from \"../types\";\nimport { rename } from \"./rename\";\n\nexport const suffix = (operand: RelationOperand, sfx: string, options?: SuffixOptions): RelationOperand => {\n const except = new Set(options?.except ?? []);\n return rename(operand, (attr) => except.has(attr) ? attr : `${attr}${sfx}`);\n}\n","import { RelationOperand, AttrName, Tuple } from \"../types\";\nimport { toOperationalOperand, deduplicate } from \"./_helpers\";\n\nexport const project = (operand: RelationOperand, attrs: AttrName[]): RelationOperand => {\n const op = toOperationalOperand(operand);\n const iterable = op.tuples();\n const result: Tuple[] = [];\n for (const tuple of iterable) {\n const projected = attrs.reduce((memo, attr) => {\n if (attr in tuple) {\n memo[attr] = tuple[attr];\n }\n return memo;\n }, {} as Tuple);\n result.push(projected);\n }\n return op.output(deduplicate(result));\n}\n","import { RelationOperand, AttrName, Tuple } from \"../types\";\nimport { toOperationalOperand, deduplicate } from \"./_helpers\";\n\nexport const allbut = (operand: RelationOperand, attrs: AttrName[]): RelationOperand => {\n const op = toOperationalOperand(operand);\n const iterable = op.tuples();\n const excluded = new Set(attrs);\n const result: Tuple[] = [];\n for (const tuple of iterable) {\n const projected = Object.keys(tuple).reduce((memo, attr) => {\n if (!excluded.has(attr)) {\n memo[attr] = tuple[attr];\n }\n return memo;\n }, {} as Tuple);\n result.push(projected);\n }\n return op.output(deduplicate(result));\n}\n","import { RelationOperand, Extension, Tuple } from \"../types\";\nimport { toOperationalOperand } from \"./_helpers\";\n\nexport const extend = (operand: RelationOperand, extension: Extension): RelationOperand => {\n const op = toOperationalOperand(operand);\n const iterable = op.tuples();\n const result: Tuple[] = [];\n for (const tuple of iterable) {\n const extended = { ...tuple };\n for (const [attr, spec] of Object.entries(extension)) {\n if (typeof spec === 'function') {\n extended[attr] = spec(tuple);\n } else {\n extended[attr] = tuple[spec];\n }\n }\n result.push(extended);\n }\n return op.output(result);\n}\n","import { RelationOperand, Tuple } from \"../types\";\nimport { toOperationalOperand, tupleKey } from \"./_helpers\";\n\nexport const union = (left: RelationOperand, right: RelationOperand): RelationOperand => {\n const opLeft = toOperationalOperand(left);\n const opRight = toOperationalOperand(right);\n const seen = new Set<string>();\n const result: Tuple[] = [];\n\n for (const tuple of opLeft.tuples()) {\n const key = tupleKey(tuple);\n if (!seen.has(key)) {\n seen.add(key);\n result.push(tuple);\n }\n }\n\n for (const tuple of opRight.tuples()) {\n const key = tupleKey(tuple);\n if (!seen.has(key)) {\n seen.add(key);\n result.push(tuple);\n }\n }\n\n return opLeft.output(result);\n}\n","import { RelationOperand, Tuple } from \"../types\";\nimport { toOperationalOperand, tupleKey } from \"./_helpers\";\n\nexport const minus = (left: RelationOperand, right: RelationOperand): RelationOperand => {\n const opLeft = toOperationalOperand(left);\n const opRight = toOperationalOperand(right);\n\n const rightKeys = new Set<string>();\n for (const tuple of opRight.tuples()) {\n rightKeys.add(tupleKey(tuple));\n }\n\n const seen = new Set<string>();\n const result: Tuple[] = [];\n for (const tuple of opLeft.tuples()) {\n const key = tupleKey(tuple);\n if (!rightKeys.has(key) && !seen.has(key)) {\n seen.add(key);\n result.push(tuple);\n }\n }\n\n return opLeft.output(result);\n}\n","import { RelationOperand, Tuple } from \"../types\";\nimport { toOperationalOperand, tupleKey } from \"./_helpers\";\n\nexport const intersect = (left: RelationOperand, right: RelationOperand): RelationOperand => {\n const opLeft = toOperationalOperand(left);\n const opRight = toOperationalOperand(right);\n\n const rightKeys = new Set<string>();\n for (const tuple of opRight.tuples()) {\n rightKeys.add(tupleKey(tuple));\n }\n\n const seen = new Set<string>();\n const result: Tuple[] = [];\n for (const tuple of opLeft.tuples()) {\n const key = tupleKey(tuple);\n if (rightKeys.has(key) && !seen.has(key)) {\n seen.add(key);\n result.push(tuple);\n }\n }\n\n return opLeft.output(result);\n}\n","import { RelationOperand, JoinKeys, Tuple } from \"../types\";\nimport { toOperationalOperand, normalizeKeys, matchKey } from \"./_helpers\";\n\nexport const matching = (left: RelationOperand, right: RelationOperand, keys?: JoinKeys): RelationOperand => {\n const opLeft = toOperationalOperand(left);\n const opRight = toOperationalOperand(right);\n const leftTuples = [...opLeft.tuples()];\n const rightTuples = [...opRight.tuples()];\n const keyMap = normalizeKeys(keys, leftTuples, rightTuples);\n\n const rightKeys = new Set<string>();\n for (const tuple of rightTuples) {\n rightKeys.add(matchKey(tuple, keyMap, 'right'));\n }\n\n const result: Tuple[] = [];\n for (const tuple of leftTuples) {\n if (rightKeys.has(matchKey(tuple, keyMap, 'left'))) {\n result.push(tuple);\n }\n }\n\n return opLeft.output(result);\n}\n","import { RelationOperand, JoinKeys, Tuple } from \"../types\";\nimport { toOperationalOperand, normalizeKeys, matchKey } from \"./_helpers\";\n\nexport const not_matching = (left: RelationOperand, right: RelationOperand, keys?: JoinKeys): RelationOperand => {\n const opLeft = toOperationalOperand(left);\n const opRight = toOperationalOperand(right);\n const leftTuples = [...opLeft.tuples()];\n const rightTuples = [...opRight.tuples()];\n const keyMap = normalizeKeys(keys, leftTuples, rightTuples);\n\n const rightKeys = new Set<string>();\n for (const tuple of rightTuples) {\n rightKeys.add(matchKey(tuple, keyMap, 'right'));\n }\n\n const result: Tuple[] = [];\n for (const tuple of leftTuples) {\n if (!rightKeys.has(matchKey(tuple, keyMap, 'left'))) {\n result.push(tuple);\n }\n }\n\n return opLeft.output(result);\n}\n","import { RelationOperand, JoinKeys, Tuple, AttrName } from \"../types\";\nimport { toOperationalOperand, normalizeKeys, tuplesMatch, projectOutKeys } from \"./_helpers\";\n\nconst mergeTuples = (left: Tuple, right: Tuple, keyMap: Record<AttrName, AttrName>): Tuple => {\n return { ...left, ...projectOutKeys(right, keyMap) };\n}\n\nexport const join = (left: RelationOperand, right: RelationOperand, keys?: JoinKeys): RelationOperand => {\n const opLeft = toOperationalOperand(left);\n const opRight = toOperationalOperand(right);\n const leftTuples = [...opLeft.tuples()];\n const rightTuples = [...opRight.tuples()];\n const keyMap = normalizeKeys(keys, leftTuples, rightTuples);\n const result: Tuple[] = [];\n\n for (const leftTuple of leftTuples) {\n for (const rightTuple of rightTuples) {\n if (tuplesMatch(leftTuple, rightTuple, keyMap)) {\n result.push(mergeTuples(leftTuple, rightTuple, keyMap));\n }\n }\n }\n\n return opLeft.output(result);\n}\n","import { RelationOperand, JoinKeys, Tuple, AttrName } from \"../types\";\nimport { toOperationalOperand, normalizeKeys, tuplesMatch } from \"./_helpers\";\n\nconst getRightAttrs = (rightTuples: Tuple[], keyMap: Record<AttrName, AttrName>): AttrName[] => {\n if (rightTuples.length === 0) return [];\n const rightKeys = new Set(Object.values(keyMap));\n return Object.keys(rightTuples[0]).filter(attr => !rightKeys.has(attr));\n}\n\nconst mergeTuples = (left: Tuple, right: Tuple | null, rightAttrs: AttrName[]): Tuple => {\n const result = { ...left };\n for (const attr of rightAttrs) {\n result[attr] = right ? right[attr] : null;\n }\n return result;\n}\n\nexport const left_join = (left: RelationOperand, right: RelationOperand, keys?: JoinKeys): RelationOperand => {\n const opLeft = toOperationalOperand(left);\n const opRight = toOperationalOperand(right);\n const leftTuples = [...opLeft.tuples()];\n const rightTuples = [...opRight.tuples()];\n const keyMap = normalizeKeys(keys, leftTuples, rightTuples);\n const rightAttrs = getRightAttrs(rightTuples, keyMap);\n const result: Tuple[] = [];\n\n for (const leftTuple of leftTuples) {\n let matched = false;\n for (const rightTuple of rightTuples) {\n if (tuplesMatch(leftTuple, rightTuple, keyMap)) {\n result.push(mergeTuples(leftTuple, rightTuple, rightAttrs));\n matched = true;\n }\n }\n if (!matched) {\n result.push(mergeTuples(leftTuple, null, rightAttrs));\n }\n }\n\n return opLeft.output(result);\n}\n","import { RelationOperand, Tuple } from \"../types\";\nimport { toOperationalOperand, deduplicate } from \"./_helpers\";\n\nexport const cross_product = (left: RelationOperand, right: RelationOperand): RelationOperand => {\n const opLeft = toOperationalOperand(left);\n const opRight = toOperationalOperand(right);\n const leftTuples = [...opLeft.tuples()];\n const rightTuples = [...opRight.tuples()];\n const result: Tuple[] = [];\n\n for (const l of leftTuples) {\n for (const r of rightTuples) {\n result.push({ ...r, ...l });\n }\n }\n\n return opLeft.output(deduplicate(result));\n}\n\nexport { cross_product as cross_join };\n","import { RelationOperand, JoinKeys, Tuple, AttrName } from \"../types\";\nimport { toOperationalOperand, normalizeKeys, tuplesMatch, projectOutKeys } from \"./_helpers\";\nimport { MemoryRelation } from \"@/Relation\";\n\nexport const image = (left: RelationOperand, right: RelationOperand, as: AttrName, keys?: JoinKeys): RelationOperand => {\n const opLeft = toOperationalOperand(left);\n const opRight = toOperationalOperand(right);\n const leftTuples = [...opLeft.tuples()];\n const rightTuples = [...opRight.tuples()];\n const keyMap = normalizeKeys(keys, leftTuples, rightTuples);\n const result: Tuple[] = [];\n\n for (const leftTuple of leftTuples) {\n const matches: Tuple[] = [];\n for (const rightTuple of rightTuples) {\n if (tuplesMatch(leftTuple, rightTuple, keyMap)) {\n matches.push(projectOutKeys(rightTuple, keyMap));\n }\n }\n result.push({\n ...leftTuple,\n [as]: new MemoryRelation(matches)\n });\n }\n\n return opLeft.output(result);\n}\n","import { RelationOperand, AttrName, Tuple, Aggregator, Aggregators } from \"../types\";\nimport { toOperationalOperand } from \"./_helpers\";\n\nconst groupKey = (tuple: Tuple, by: AttrName[]): string => {\n const keyParts = by.map(attr => JSON.stringify(tuple[attr]));\n return keyParts.join('|');\n}\n\nconst pickAttrs = (tuple: Tuple, attrs: AttrName[]): Tuple => {\n return attrs.reduce((acc, attr) => {\n acc[attr] = tuple[attr];\n return acc;\n }, {} as Tuple);\n}\n\nconst applyAggregator = (tuples: Tuple[], agg: Aggregator): unknown => {\n if (typeof agg === 'function') {\n return agg(tuples);\n }\n\n const spec = typeof agg === 'string' ? { op: agg, attr: '' } : agg;\n const { op, attr } = spec;\n\n switch (op) {\n case 'count':\n return tuples.length;\n\n case 'sum': {\n return tuples.reduce((sum, t) => sum + (Number(t[attr]) || 0), 0);\n }\n\n case 'min': {\n const values = tuples.map(t => t[attr]).filter(v => v !== undefined && v !== null);\n return values.length > 0 ? Math.min(...values.map(Number)) : null;\n }\n\n case 'max': {\n const values = tuples.map(t => t[attr]).filter(v => v !== undefined && v !== null);\n return values.length > 0 ? Math.max(...values.map(Number)) : null;\n }\n\n case 'avg': {\n const values = tuples.map(t => Number(t[attr])).filter(v => !isNaN(v));\n return values.length > 0 ? values.reduce((a, b) => a + b, 0) / values.length : null;\n }\n\n case 'collect': {\n return tuples.map(t => t[attr]);\n }\n\n default:\n throw new Error(`Unknown aggregator: ${op}`);\n }\n}\n\nexport const summarize = (\n operand: RelationOperand,\n by: AttrName[],\n aggs: Aggregators\n): RelationOperand => {\n const op = toOperationalOperand(operand);\n const tuples = [...op.tuples()];\n\n // Group tuples\n const groups = new Map<string, Tuple[]>();\n for (const tuple of tuples) {\n const key = groupKey(tuple, by);\n if (!groups.has(key)) {\n groups.set(key, []);\n }\n groups.get(key)!.push(tuple);\n }\n\n // Apply aggregators to each group\n const result: Tuple[] = [];\n for (const groupTuples of groups.values()) {\n const row: Tuple = pickAttrs(groupTuples[0], by);\n for (const [resultAttr, agg] of Object.entries(aggs)) {\n row[resultAttr] = applyAggregator(groupTuples, agg);\n }\n result.push(row);\n }\n\n return op.output(result);\n}\n","import { RelationOperand, AttrName, Tuple } from \"../types\";\nimport { toOperationalOperand } from \"./_helpers\";\nimport { MemoryRelation } from \"@/Relation\";\n\nconst groupKey = (tuple: Tuple, byAttrs: AttrName[]): string => {\n const keyParts = byAttrs.map(attr => JSON.stringify(tuple[attr]));\n return keyParts.join('|');\n}\n\nconst pickAttrs = (tuple: Tuple, attrs: AttrName[]): Tuple => {\n return attrs.reduce((acc, attr) => {\n acc[attr] = tuple[attr];\n return acc;\n }, {} as Tuple);\n}\n\nexport const group = (operand: RelationOperand, attrs: AttrName[], as: AttrName): RelationOperand => {\n const op = toOperationalOperand(operand);\n const tuples = [...op.tuples()];\n\n if (tuples.length === 0) {\n return op.output([]);\n }\n\n // Determine which attributes to keep at the top level (all except grouped ones)\n const allAttrs = Object.keys(tuples[0]);\n const groupedSet = new Set(attrs);\n const byAttrs = allAttrs.filter(a => !groupedSet.has(a));\n\n // Group tuples\n const groups = new Map<string, { base: Tuple, nested: Tuple[] }>();\n for (const tuple of tuples) {\n const key = groupKey(tuple, byAttrs);\n if (!groups.has(key)) {\n groups.set(key, {\n base: pickAttrs(tuple, byAttrs),\n nested: []\n });\n }\n groups.get(key)!.nested.push(pickAttrs(tuple, attrs));\n }\n\n // Build result with nested relations\n const result: Tuple[] = [];\n for (const { base, nested } of groups.values()) {\n result.push({\n ...base,\n [as]: new MemoryRelation(nested)\n });\n }\n\n return op.output(result);\n}\n","import { RelationOperand, AttrName, Tuple, Relation } from \"../types\";\nimport { toOperationalOperand } from \"./_helpers\";\nimport { isRelation } from \"./isRelation\";\n\nconst toTupleArray = (value: unknown): Tuple[] => {\n if (isRelation(value)) {\n return (value as Relation).toArray();\n }\n if (Array.isArray(value)) {\n return value;\n }\n throw new Error(`Value is not a relation or array`);\n}\n\nexport const ungroup = (operand: RelationOperand, attr: AttrName): RelationOperand => {\n const op = toOperationalOperand(operand);\n const tuples = [...op.tuples()];\n const result: Tuple[] = [];\n\n for (const tuple of tuples) {\n const nested = toTupleArray(tuple[attr]);\n\n // Get base attributes (all except the grouped one)\n const base: Tuple = {};\n for (const [key, value] of Object.entries(tuple)) {\n if (key !== attr) {\n base[key] = value;\n }\n }\n\n // Flatten each nested tuple\n for (const nestedTuple of nested) {\n result.push({\n ...base,\n ...nestedTuple\n });\n }\n }\n\n return op.output(result);\n}\n","import { RelationOperand, AttrName, Tuple } from \"../types\";\nimport { toOperationalOperand } from \"./_helpers\";\n\nexport const wrap = (operand: RelationOperand, attrs: AttrName[], as: AttrName): RelationOperand => {\n const op = toOperationalOperand(operand);\n const iterable = op.tuples();\n const wrappedSet = new Set(attrs);\n const result: Tuple[] = [];\n\n for (const tuple of iterable) {\n const wrapped: Tuple = {};\n const remaining: Tuple = {};\n\n for (const [key, value] of Object.entries(tuple)) {\n if (wrappedSet.has(key)) {\n wrapped[key] = value;\n } else {\n remaining[key] = value;\n }\n }\n\n result.push({\n ...remaining,\n [as]: wrapped\n });\n }\n\n return op.output(result);\n}\n","import { RelationOperand, AttrName, Tuple } from \"../types\";\nimport { toOperationalOperand } from \"./_helpers\";\n\nexport const unwrap = (operand: RelationOperand, attr: AttrName): RelationOperand => {\n const op = toOperationalOperand(operand);\n const iterable = op.tuples();\n const result: Tuple[] = [];\n\n for (const tuple of iterable) {\n const wrapped = tuple[attr] as Tuple;\n if (typeof wrapped !== 'object' || wrapped === null || Array.isArray(wrapped)) {\n throw new Error(`Attribute '${attr}' is not a tuple (object)`);\n }\n\n const unwrapped: Tuple = {};\n for (const [key, value] of Object.entries(tuple)) {\n if (key !== attr) {\n unwrapped[key] = value;\n }\n }\n\n result.push({\n ...unwrapped,\n ...wrapped\n });\n }\n\n return op.output(result);\n}\n","import { AutowrapOptions, RelationOperand, Tuple } from \"../types\";\nimport { toOperationalOperand } from \"./_helpers\";\n\nexport const autowrap = (operand: RelationOperand, options?: AutowrapOptions): RelationOperand => {\n const sep = options?.separator ?? '_';\n const op = toOperationalOperand(operand);\n const iterable = op.tuples();\n const result: Tuple[] = [];\n\n for (const tuple of iterable) {\n const wrapped: Tuple = {};\n for (const [attr, value] of Object.entries(tuple)) {\n const parts = attr.split(sep);\n if (parts.length === 1) {\n wrapped[attr] = value;\n } else {\n const [prefix, ...rest] = parts;\n wrapped[prefix] = wrapped[prefix] ?? {};\n (wrapped[prefix] as Tuple)[rest.join(sep)] = value;\n }\n }\n result.push(wrapped);\n }\n\n return op.output(result);\n}\n","import { RelationOperand, Transformation, Tuple } from \"../types\";\nimport { toOperationalOperand } from \"./_helpers\";\n\nexport const transform = (operand: RelationOperand, transformation: Transformation): RelationOperand => {\n const op = toOperationalOperand(operand);\n const iterable = op.tuples();\n const result: Tuple[] = [];\n\n for (const tuple of iterable) {\n const transformed: Tuple = {};\n\n for (const [attr, value] of Object.entries(tuple)) {\n transformed[attr] = applyTransformation(value, attr, transformation);\n }\n\n result.push(transformed);\n }\n\n return op.output(result);\n}\n\nconst applyTransformation = (value: unknown, attr: string, transformation: Transformation): unknown => {\n if (typeof transformation === 'function') {\n // Single function - apply to all values\n return transformation(value);\n } else if (Array.isArray(transformation)) {\n // Array of functions - chain them\n return transformation.reduce((v, fn) => fn(v), value);\n } else {\n // Object with attr-specific transformers\n const fn = transformation[attr];\n if (fn) {\n if (Array.isArray(fn)) {\n return fn.reduce((v, f) => f(v), value);\n }\n return fn(value);\n }\n return value;\n }\n}\n","import { RelationOperand } from \"../types\";\nimport { toOperationalOperand, tupleKey } from \"./_helpers\";\n\nexport const isEqual = (left: RelationOperand, right: RelationOperand): boolean => {\n const opLeft = toOperationalOperand(left);\n const opRight = toOperationalOperand(right);\n\n const leftKeys = new Set<string>();\n for (const tuple of opLeft.tuples()) {\n leftKeys.add(tupleKey(tuple));\n }\n\n const rightKeys = new Set<string>();\n for (const tuple of opRight.tuples()) {\n rightKeys.add(tupleKey(tuple));\n }\n\n if (leftKeys.size !== rightKeys.size) {\n return false;\n }\n\n for (const key of leftKeys) {\n if (!rightKeys.has(key)) {\n return false;\n }\n }\n\n return true;\n}\n","import { RelationOperand, Tuple } from \"../types\";\nimport { toOperationalOperand, error } from \"./_helpers\";\n\nexport const one = (operand: RelationOperand): Tuple => {\n const op = toOperationalOperand(operand);\n const iterable = op.tuples();\n let tuple;\n for (const t of iterable) {\n if (tuple) {\n return error('More than one tuple found');\n } else {\n tuple = t;\n }\n }\n if (tuple) return tuple;\n return error('Relation is empty');\n}\n","import { AttrName, RelationOperand, Tuple } from \"../types\";\nimport { toOperationalOperand } from \"./_helpers\";\n\nexport const yByX = (operand: RelationOperand, y: AttrName, x: AttrName): Tuple => {\n const op = toOperationalOperand(operand);\n const iterable = op.tuples();\n const hash = {};\n for (const tuple of iterable) {\n hash[`${tuple[x]}`] = tuple[y];\n }\n return hash;\n}\n","export * from './operators';\nexport * from './types';\nexport * from './utility-types';\n\nimport { MemoryRelation } from './Relation';\nimport { isRelation } from './operators';\n\n/**\n * Creates a new in-memory relation from an array of tuples.\n *\n * @typeParam T - The tuple type. Inferred from input or explicitly provided.\n *\n * @example\n * // Untyped usage (backwards compatible)\n * const r = Bmg([{ id: 1, name: 'Alice' }]);\n *\n * @example\n * // Typed usage with explicit type parameter\n * interface Person { id: number; name: string }\n * const r = Bmg<Person>([{ id: 1, name: 'Alice' }]);\n * r.project(['id']); // Autocomplete suggests 'id' | 'name'\n *\n * @example\n * // Type is inferred from input\n * const r = Bmg([{ id: 1, name: 'Alice' }] as const);\n */\nexport function Bmg<T>(tuples: T[]): MemoryRelation<T> {\n return new MemoryRelation<T>(tuples);\n}\n\nBmg.isRelation = isRelation;\n"],"names":["toPredicateFunc","p","expected","t","Object","keys","every","k","MemoryRelation","tuples","this","_proto","prototype","restrict","where","exclude","project","attrs","allbut","extend","e","constants","consts","rename","r","prefix","pfx","options","suffix","sfx","union","right","minus","intersect","matching","not_matching","join","left_join","cross_product","cross_join","image","as","group","ungroup","attr","wrap","unwrap","summarize","by","aggs","transform","autowrap","one","toArray","yByX","y","x","isEqual","isRelation","op","constructor","tupleKey","tuple","entries","map","_ref","v","value","sort","JSON","stringify","_ref2","_ref3","localeCompare","deduplicate","_step","seen","Set","result","_iterator","_createForOfIteratorHelperLoose","done","key","has","add","push","toOperationalOperand","operand","Array","isArray","output","error","msg","normalizeKeys","leftTuples","rightTuples","reduce","acc","left","length","leftAttrs","filter","getCommonAttrs","tuplesMatch","keyMap","_i","_Object$entries","_Object$entries$_i","matchKey","side","values","projectOutKeys","rightKeys","_i2","_Object$entries2","_Object$entries2$_i","iterable","f","kept","_extends","renaming","renamingFunc","toRenamingFunc","_loop","renamed","memo","_options$except","except","projected","excluded","extension","extended","spec","opLeft","opRight","_step2","_iterator2","concat","mergeTuples","leftTuple","rightTuple","rightAttrs","getRightAttrs","_step3","matched","_iterator3","l","_extends2","matches","groupKey","pickAttrs","applyAggregator","agg","sum","Number","Math","min","apply","max","isNaN","a","b","Error","groups","Map","set","get","groupTuples","row","byAttrs","allAttrs","groupedSet","base","nested","_step2$value","toTupleArray","wrappedSet","wrapped","remaining","unwrapped","_options$separator","sep","separator","parts","split","_wrapped$prefix","rest","_arrayLikeToArray","slice","transformation","transformed","applyTransformation","fn","leftKeys","size","hash","Bmg"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ const t=t=>{if("function"==typeof t)return t;{const r=t;return t=>Object.keys(r).every(e=>t[e]===r[e])}};class r{constructor(t){this.tuples=void 0,this.tuples=t,this.tuples=t}restrict(t){return a(this,t)}where(t){return a(this,t)}exclude(t){return l(this,t)}project(t){return j(this,t)}allbut(t){return g(this,t)}extend(t){return m(this,t)}constants(t){return d(this,t)}rename(t){return y(this,t)}prefix(t,r){return w(this,t,r)}suffix(t,r){return b(this,t,r)}union(t){return O(this,t)}minus(t){return S(this,t)}intersect(t){return v(this,t)}matching(t,r){return A(this,t,r)}not_matching(t,r){return N(this,t,r)}join(t,r){return x(this,t,r)}left_join(t,r){return _(this,t,r)}cross_product(t){return M(this,t)}cross_join(t){return M(this,t)}image(t,r,e){return E(this,t,r,e)}group(t,r){return C(this,t,r)}ungroup(t){return V(this,t)}wrap(t,r){return X(this,t,r)}unwrap(t){return D(this,t)}summarize(t,r){return U(this,t,r)}transform(t){return G(this,t)}autowrap(t){return F(this,t)}one(){return K(this)}toArray(){return this.tuples}yByX(t,r){return L(this,t,r)}isEqual(t){return I(this,t)}}const e=t=>null!=t&&t.constructor===r,n=t=>{const r=Object.entries(t).map(([t,r])=>{return[t,(s=r,e(s)?s.toArray().map(t=>n(t)).sort():s)];var s});return JSON.stringify(r.sort(([t],[r])=>t.localeCompare(r)))},s=t=>{const r=new Set,e=[];for(const s of t){const t=n(s);r.has(t)||(r.add(t),e.push(s))}return e},o=t=>{if(Array.isArray(t))return{tuples:()=>t,output:t=>t};if(e(t))return{tuples:()=>t.toArray(),output:t=>new r(t)};throw`Unable to iterate ${t}`},u=t=>{throw t},c=(t,r,e)=>t?Array.isArray(t)?t.reduce((t,r)=>(t[r]=r,t),{}):t:((t,r)=>{if(0===t.length||0===r.length)return[];const e=new Set(Object.keys(t[0]));return Object.keys(r[0]).filter(t=>e.has(t))})(r,e).reduce((t,r)=>(t[r]=r,t),{}),f=(t,r,e)=>{for(const[n,s]of Object.entries(e))if(t[n]!==r[s])return!1;return!0},p=(t,r,e)=>("left"===e?Object.keys(r):Object.values(r)).map(r=>JSON.stringify(t[r])).join("|"),i=(t,r)=>{const e=new Set(Object.values(r)),n={};for(const[r,s]of Object.entries(t))e.has(r)||(n[r]=s);return n},a=(r,e)=>{const n=o(r),s=n.tuples(),u=t(e),c=[];for(const t of s)u(t)&&c.push(t);return n.output(c)},l=(r,e)=>{const n=o(r),s=n.tuples(),u=t(e),c=[];for(const t of s)u(t)||c.push(t);return n.output(c)};function h(){return h=Object.assign?Object.assign.bind():function(t){for(var r=1;r<arguments.length;r++){var e=arguments[r];for(var n in e)({}).hasOwnProperty.call(e,n)&&(t[n]=e[n])}return t},h.apply(null,arguments)}const d=(t,r)=>{const e=o(t),n=e.tuples(),s=[];for(const t of n)s.push(h({},t,r));return e.output(s)},y=(t,r)=>{const e=o(t),n=e.tuples(),s=(t=>"function"==typeof t?t:r=>t[r]||r)(r),u=[];for(const t of n){const r=Object.keys(t).reduce((r,e)=>(r[s(e)]=t[e],r),{});u.push(r)}return e.output(u)},w=(t,r,e)=>{var n;const s=new Set(null!=(n=null==e?void 0:e.except)?n:[]);return y(t,t=>s.has(t)?t:`${r}${t}`)},b=(t,r,e)=>{var n;const s=new Set(null!=(n=null==e?void 0:e.except)?n:[]);return y(t,t=>s.has(t)?t:`${t}${r}`)},j=(t,r)=>{const e=o(t),n=e.tuples(),u=[];for(const t of n){const e=r.reduce((r,e)=>(e in t&&(r[e]=t[e]),r),{});u.push(e)}return e.output(s(u))},g=(t,r)=>{const e=o(t),n=e.tuples(),u=new Set(r),c=[];for(const t of n){const r=Object.keys(t).reduce((r,e)=>(u.has(e)||(r[e]=t[e]),r),{});c.push(r)}return e.output(s(c))},m=(t,r)=>{const e=o(t),n=e.tuples(),s=[];for(const t of n){const e=h({},t);for(const[n,s]of Object.entries(r))e[n]="function"==typeof s?s(t):t[s];s.push(e)}return e.output(s)},O=(t,r)=>{const e=o(t),s=o(r),u=new Set,c=[];for(const t of e.tuples()){const r=n(t);u.has(r)||(u.add(r),c.push(t))}for(const t of s.tuples()){const r=n(t);u.has(r)||(u.add(r),c.push(t))}return e.output(c)},S=(t,r)=>{const e=o(t),s=o(r),u=new Set;for(const t of s.tuples())u.add(n(t));const c=new Set,f=[];for(const t of e.tuples()){const r=n(t);u.has(r)||c.has(r)||(c.add(r),f.push(t))}return e.output(f)},v=(t,r)=>{const e=o(t),s=o(r),u=new Set;for(const t of s.tuples())u.add(n(t));const c=new Set,f=[];for(const t of e.tuples()){const r=n(t);u.has(r)&&!c.has(r)&&(c.add(r),f.push(t))}return e.output(f)},A=(t,r,e)=>{const n=o(t),s=o(r),u=[...n.tuples()],f=[...s.tuples()],i=c(e,u,f),a=new Set;for(const t of f)a.add(p(t,i,"right"));const l=[];for(const t of u)a.has(p(t,i,"left"))&&l.push(t);return n.output(l)},N=(t,r,e)=>{const n=o(t),s=o(r),u=[...n.tuples()],f=[...s.tuples()],i=c(e,u,f),a=new Set;for(const t of f)a.add(p(t,i,"right"));const l=[];for(const t of u)a.has(p(t,i,"left"))||l.push(t);return n.output(l)},k=(t,r,e)=>h({},t,i(r,e)),x=(t,r,e)=>{const n=o(t),s=o(r),u=[...n.tuples()],p=[...s.tuples()],i=c(e,u,p),a=[];for(const t of u)for(const r of p)f(t,r,i)&&a.push(k(t,r,i));return n.output(a)},$=(t,r,e)=>{const n=h({},t);for(const t of e)n[t]=r?r[t]:null;return n},_=(t,r,e)=>{const n=o(t),s=o(r),u=[...n.tuples()],p=[...s.tuples()],i=c(e,u,p),a=((t,r)=>{if(0===t.length)return[];const e=new Set(Object.values(r));return Object.keys(t[0]).filter(t=>!e.has(t))})(p,i),l=[];for(const t of u){let r=!1;for(const e of p)f(t,e,i)&&(l.push($(t,e,a)),r=!0);r||l.push($(t,null,a))}return n.output(l)},M=(t,r)=>{const e=o(t),n=o(r),u=[...e.tuples()],c=[...n.tuples()],f=[];for(const t of u)for(const r of c)f.push(h({},r,t));return e.output(s(f))},E=(t,e,n,s)=>{const u=o(t),p=o(e),a=[...u.tuples()],l=[...p.tuples()],d=c(s,a,l),y=[];for(const t of a){const e=[];for(const r of l)f(t,r,d)&&e.push(i(r,d));y.push(h({},t,{[n]:new r(e)}))}return u.output(y)},J=(t,r)=>r.map(r=>JSON.stringify(t[r])).join("|"),z=(t,r)=>r.reduce((r,e)=>(r[e]=t[e],r),{}),R=(t,r)=>{if("function"==typeof r)return r(t);const e="string"==typeof r?{op:r,attr:""}:r,{op:n,attr:s}=e;switch(n){case"count":return t.length;case"sum":return t.reduce((t,r)=>t+(Number(r[s])||0),0);case"min":{const r=t.map(t=>t[s]).filter(t=>null!=t);return r.length>0?Math.min(...r.map(Number)):null}case"max":{const r=t.map(t=>t[s]).filter(t=>null!=t);return r.length>0?Math.max(...r.map(Number)):null}case"avg":{const r=t.map(t=>Number(t[s])).filter(t=>!isNaN(t));return r.length>0?r.reduce((t,r)=>t+r,0)/r.length:null}case"collect":return t.map(t=>t[s]);default:throw new Error(`Unknown aggregator: ${n}`)}},U=(t,r,e)=>{const n=o(t),s=[...n.tuples()],u=new Map;for(const t of s){const e=J(t,r);u.has(e)||u.set(e,[]),u.get(e).push(t)}const c=[];for(const t of u.values()){const n=z(t[0],r);for(const[r,s]of Object.entries(e))n[r]=R(t,s);c.push(n)}return n.output(c)},q=(t,r)=>r.map(r=>JSON.stringify(t[r])).join("|"),B=(t,r)=>r.reduce((r,e)=>(r[e]=t[e],r),{}),C=(t,e,n)=>{const s=o(t),u=[...s.tuples()];if(0===u.length)return s.output([]);const c=Object.keys(u[0]),f=new Set(e),p=c.filter(t=>!f.has(t)),i=new Map;for(const t of u){const r=q(t,p);i.has(r)||i.set(r,{base:B(t,p),nested:[]}),i.get(r).nested.push(B(t,e))}const a=[];for(const{base:t,nested:e}of i.values())a.push(h({},t,{[n]:new r(e)}));return s.output(a)},P=t=>{if(e(t))return t.toArray();if(Array.isArray(t))return t;throw new Error("Value is not a relation or array")},V=(t,r)=>{const e=o(t),n=[...e.tuples()],s=[];for(const t of n){const e=P(t[r]),n={};for(const[e,s]of Object.entries(t))e!==r&&(n[e]=s);for(const t of e)s.push(h({},n,t))}return e.output(s)},X=(t,r,e)=>{const n=o(t),s=n.tuples(),u=new Set(r),c=[];for(const t of s){const r={},n={};for(const[e,s]of Object.entries(t))u.has(e)?r[e]=s:n[e]=s;c.push(h({},n,{[e]:r}))}return n.output(c)},D=(t,r)=>{const e=o(t),n=e.tuples(),s=[];for(const t of n){const e=t[r];if("object"!=typeof e||null===e||Array.isArray(e))throw new Error(`Attribute '${r}' is not a tuple (object)`);const n={};for(const[e,s]of Object.entries(t))e!==r&&(n[e]=s);s.push(h({},n,e))}return e.output(s)},F=(t,r)=>{var e;const n=null!=(e=null==r?void 0:r.separator)?e:"_",s=o(t),u=s.tuples(),c=[];for(const t of u){const r={};for(const[e,s]of Object.entries(t)){const t=e.split(n);if(1===t.length)r[e]=s;else{var f;const[e,...o]=t;r[e]=null!=(f=r[e])?f:{},r[e][o.join(n)]=s}}c.push(r)}return s.output(c)},G=(t,r)=>{const e=o(t),n=e.tuples(),s=[];for(const t of n){const e={};for(const[n,s]of Object.entries(t))e[n]=H(s,n,r);s.push(e)}return e.output(s)},H=(t,r,e)=>{if("function"==typeof e)return e(t);if(Array.isArray(e))return e.reduce((t,r)=>r(t),t);{const n=e[r];return n?Array.isArray(n)?n.reduce((t,r)=>r(t),t):n(t):t}},I=(t,r)=>{const e=o(t),s=o(r),u=new Set;for(const t of e.tuples())u.add(n(t));const c=new Set;for(const t of s.tuples())c.add(n(t));if(u.size!==c.size)return!1;for(const t of u)if(!c.has(t))return!1;return!0},K=t=>{const r=o(t).tuples();let e;for(const t of r){if(e)return u("More than one tuple found");e=t}return e||u("Relation is empty")},L=(t,r,e)=>{const n=o(t).tuples(),s={};for(const t of n)s[`${t[e]}`]=t[r];return s};function Q(t){return new r(t)}Q.isRelation=e;export{Q as Bmg,g as allbut,F as autowrap,d as constants,M as cross_join,M as cross_product,l as exclude,m as extend,C as group,E as image,v as intersect,I as isEqual,e as isRelation,x as join,_ as left_join,A as matching,S as minus,N as not_matching,K as one,w as prefix,j as project,y as rename,a as restrict,b as suffix,U as summarize,G as transform,V as ungroup,O as union,D as unwrap,a as where,X as wrap,L as yByX};
2
+ //# sourceMappingURL=bmg.modern.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bmg.modern.js","sources":["../src/support/toPredicateFunc.ts","../src/Relation/Memory.ts","../src/operators/isRelation.ts","../src/operators/_helpers.ts","../src/operators/restrict.ts","../src/operators/exclude.ts","../src/operators/constants.ts","../src/operators/rename.ts","../src/operators/prefix.ts","../src/operators/suffix.ts","../src/operators/project.ts","../src/operators/allbut.ts","../src/operators/extend.ts","../src/operators/union.ts","../src/operators/minus.ts","../src/operators/intersect.ts","../src/operators/matching.ts","../src/operators/not_matching.ts","../src/operators/join.ts","../src/operators/left_join.ts","../src/operators/cross_product.ts","../src/operators/image.ts","../src/operators/summarize.ts","../src/operators/group.ts","../src/operators/ungroup.ts","../src/operators/wrap.ts","../src/operators/unwrap.ts","../src/operators/autowrap.ts","../src/operators/transform.ts","../src/operators/isEqual.ts","../src/operators/one.ts","../src/operators/yByX.ts","../src/index.ts"],"sourcesContent":["import { Predicate, PredicateFunc, Tuple } from '../types';\n\nexport const toPredicateFunc = (p: Predicate): PredicateFunc => {\n if (typeof(p) === 'function') {\n return p as PredicateFunc;\n } else {\n const expected = p as Tuple;\n return (t: Tuple) => {\n return Object.keys(expected).every(k => t[k] === expected[k])\n }\n }\n}\n","import {\n allbut,\n autowrap,\n constants,\n cross_product,\n exclude,\n extend,\n group,\n image,\n intersect,\n isEqual,\n join,\n left_join,\n matching,\n minus,\n not_matching,\n one,\n prefix,\n project,\n rename,\n restrict,\n suffix,\n summarize,\n where,\n transform,\n ungroup,\n union,\n unwrap,\n wrap,\n yByX,\n} from \"../operators\";\nimport type {\n AttrName,\n AutowrapOptions,\n JoinKeys,\n Relation,\n RelationOperand,\n Transformation,\n Tuple,\n TypedPredicate,\n TypedExtension,\n RenameMap,\n Renamed,\n Prefixed,\n Suffixed,\n Joined,\n LeftJoined,\n Wrapped,\n Unwrapped,\n Ungrouped,\n} from \"../types\";\nimport type { AggregatorResults } from \"../utility-types\";\n\n/**\n * In-memory implementation of the Relation interface.\n *\n * @typeParam T - The tuple type for this relation. Defaults to `Tuple` (Record<string, unknown>).\n */\nexport class MemoryRelation<T = Tuple> implements Relation<T> {\n\n constructor(private tuples: T[]) {\n this.tuples = tuples;\n }\n\n // === Type-preserving operators ===\n\n restrict(p: TypedPredicate<T>): Relation<T> {\n return restrict(this as any, p as any) as unknown as Relation<T>;\n }\n\n where(p: TypedPredicate<T>): Relation<T> {\n return where(this as any, p as any) as unknown as Relation<T>;\n }\n\n exclude(p: TypedPredicate<T>): Relation<T> {\n return exclude(this as any, p as any) as unknown as Relation<T>;\n }\n\n // === Projection operators ===\n\n project<K extends keyof T>(attrs: K[]): Relation<Pick<T, K>> {\n return project(this as any, attrs as AttrName[]) as unknown as Relation<Pick<T, K>>;\n }\n\n allbut<K extends keyof T>(attrs: K[]): Relation<Omit<T, K>> {\n return allbut(this as any, attrs as AttrName[]) as unknown as Relation<Omit<T, K>>;\n }\n\n // === Extension operators ===\n\n extend<E extends Record<string, unknown>>(e: TypedExtension<T, E>): Relation<T & E> {\n return extend(this as any, e as any) as unknown as Relation<T & E>;\n }\n\n constants<C extends Tuple>(consts: C): Relation<T & C> {\n return constants(this as any, consts) as unknown as Relation<T & C>;\n }\n\n // === Rename operators ===\n\n rename<R extends RenameMap<T>>(r: R): Relation<Renamed<T, R>> {\n return rename(this as any, r as any) as unknown as Relation<Renamed<T, R>>;\n }\n\n prefix<P extends string, Ex extends keyof T = never>(pfx: P, options?: { except?: Ex[] }): Relation<Prefixed<T, P, Ex>> {\n return prefix(this as any, pfx, options as any) as unknown as Relation<Prefixed<T, P, Ex>>;\n }\n\n suffix<S extends string, Ex extends keyof T = never>(sfx: S, options?: { except?: Ex[] }): Relation<Suffixed<T, S, Ex>> {\n return suffix(this as any, sfx, options as any) as unknown as Relation<Suffixed<T, S, Ex>>;\n }\n\n // === Set operators ===\n\n union(right: RelationOperand<T>): Relation<T> {\n return union(this as any, right as any) as unknown as Relation<T>;\n }\n\n minus(right: RelationOperand<T>): Relation<T> {\n return minus(this as any, right as any) as unknown as Relation<T>;\n }\n\n intersect(right: RelationOperand<T>): Relation<T> {\n return intersect(this as any, right as any) as unknown as Relation<T>;\n }\n\n // === Semi-join operators ===\n\n matching<R>(right: RelationOperand<R>, keys?: JoinKeys): Relation<T> {\n return matching(this as any, right as any, keys) as unknown as Relation<T>;\n }\n\n not_matching<R>(right: RelationOperand<R>, keys?: JoinKeys): Relation<T> {\n return not_matching(this as any, right as any, keys) as unknown as Relation<T>;\n }\n\n // === Join operators ===\n\n join<R>(right: RelationOperand<R>, keys?: JoinKeys): Relation<Joined<T, R>> {\n return join(this as any, right as any, keys) as unknown as Relation<Joined<T, R>>;\n }\n\n left_join<R>(right: RelationOperand<R>, keys?: JoinKeys): Relation<LeftJoined<T, R>> {\n return left_join(this as any, right as any, keys) as unknown as Relation<LeftJoined<T, R>>;\n }\n\n cross_product<R>(right: RelationOperand<R>): Relation<T & R> {\n return cross_product(this as any, right as any) as unknown as Relation<T & R>;\n }\n\n cross_join<R>(right: RelationOperand<R>): Relation<T & R> {\n return cross_product(this as any, right as any) as unknown as Relation<T & R>;\n }\n\n // === Nesting operators ===\n\n image<R, As extends string>(right: RelationOperand<R>, as: As, keys?: JoinKeys): Relation<T & Record<As, Relation<Omit<R, keyof T & keyof R>>>> {\n return image(this as any, right as any, as, keys) as unknown as Relation<T & Record<As, Relation<Omit<R, keyof T & keyof R>>>>;\n }\n\n group<K extends keyof T, As extends string>(attrs: K[], as: As): Relation<Omit<T, K> & Record<As, Relation<Pick<T, K>>>> {\n return group(this as any, attrs as AttrName[], as) as unknown as Relation<Omit<T, K> & Record<As, Relation<Pick<T, K>>>>;\n }\n\n ungroup<K extends keyof T>(attr: K): Relation<Ungrouped<T, K>> {\n return ungroup(this as any, attr as AttrName) as unknown as Relation<Ungrouped<T, K>>;\n }\n\n wrap<K extends keyof T, As extends string>(attrs: K[], as: As): Relation<Wrapped<T, K, As>> {\n return wrap(this as any, attrs as AttrName[], as) as unknown as Relation<Wrapped<T, K, As>>;\n }\n\n unwrap<K extends keyof T>(attr: K): Relation<Unwrapped<T, K>> {\n return unwrap(this as any, attr as AttrName) as unknown as Relation<Unwrapped<T, K>>;\n }\n\n // === Aggregation ===\n\n summarize<By extends keyof T, Aggs extends Record<string, unknown>>(by: By[], aggs: Aggs): Relation<Pick<T, By> & AggregatorResults<Aggs>> {\n return summarize(this as any, by as AttrName[], aggs as any) as unknown as Relation<Pick<T, By> & AggregatorResults<Aggs>>;\n }\n\n // === Transform ===\n\n transform(t: Transformation): Relation<T> {\n return transform(this as any, t) as unknown as Relation<T>;\n }\n\n // === Dynamic ===\n\n autowrap(options?: AutowrapOptions): Relation<Tuple> {\n return autowrap(this as any, options) as Relation<Tuple>;\n }\n\n // === Non-relational ===\n\n one(): T {\n return one(this as any) as T;\n }\n\n toArray(): T[] {\n return this.tuples;\n }\n\n yByX<Y extends keyof T, X extends keyof T>(y: Y, x: X): Record<T[X] & PropertyKey, T[Y]> {\n return yByX(this as any, y as AttrName, x as AttrName) as Record<T[X] & PropertyKey, T[Y]>;\n }\n\n isEqual(right: any): boolean {\n return isEqual(this as any, right as any);\n }\n\n}\n","import { MemoryRelation } from \"@/Relation\";\n\nexport const isRelation = (op) => {\n return op != null && op.constructor === MemoryRelation;\n}\n","import { OperationalOperand, Relation, RelationOperand, Renaming, RenamingFunc, Tuple, JoinKeys, AttrName } from \"@/types\";\nimport { MemoryRelation } from '@/Relation';\nimport { isRelation } from \"./isRelation\";\n\nconst valueKey = (value: unknown): unknown => {\n if (isRelation(value)) {\n // For nested relations, convert to sorted array of tuple keys for comparison\n const tuples = (value as Relation).toArray();\n const keys = tuples.map(t => tupleKey(t)).sort();\n return keys;\n }\n return value;\n}\n\n/**\n * Generates a unique string key for a tuple, used for equality comparison and deduplication.\n * Handles nested relations by converting them to sorted tuple keys.\n *\n * @example\n * tupleKey({ name: 'Alice', age: 30 })\n * // => '[[\"age\",30],[\"name\",\"Alice\"]]'\n *\n * @example\n * tupleKey({ id: 1, items: Bmg([{ x: 1 }, { x: 2 }]) })\n * // => '[[\"id\",1],[\"items\",[...]]]' (nested relation converted to sorted keys)\n */\nexport const tupleKey = (tuple: Tuple): string => {\n const entries = Object.entries(tuple).map(([k, v]) => [k, valueKey(v)]);\n return JSON.stringify(entries.sort(([a], [b]) => (a as string).localeCompare(b as string)));\n}\n\n/**\n * Removes duplicate tuples from an array, preserving order of first occurrence.\n * Uses tupleKey() for equality comparison.\n *\n * @example\n * deduplicate([\n * { id: 1, name: 'Alice' },\n * { id: 2, name: 'Bob' },\n * { id: 1, name: 'Alice' }, // duplicate\n * ])\n * // => [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }]\n */\nexport const deduplicate = (tuples: Tuple[]): Tuple[] => {\n const seen = new Set<string>();\n const result: Tuple[] = [];\n for (const tuple of tuples) {\n const key = tupleKey(tuple);\n if (!seen.has(key)) {\n seen.add(key);\n result.push(tuple);\n }\n }\n return result;\n}\n\n/**\n * Converts a RelationOperand (Relation or Tuple[]) to an OperationalOperand\n * that provides a uniform interface for iteration and output.\n *\n * @example\n * // With array input, output remains array\n * const op = toOperationalOperand([{ id: 1 }]);\n * [...op.tuples()]; // => [{ id: 1 }]\n * op.output([{ id: 2 }]); // => [{ id: 2 }]\n *\n * @example\n * // With Relation input, output is a new Relation\n * const op = toOperationalOperand(Bmg([{ id: 1 }]));\n * [...op.tuples()]; // => [{ id: 1 }]\n * op.output([{ id: 2 }]); // => Bmg([{ id: 2 }])\n */\nexport const toOperationalOperand = (operand: RelationOperand): OperationalOperand => {\n if (Array.isArray(operand)) {\n return {\n tuples: () => operand,\n output: (tuples) => tuples,\n };\n } else if (isRelation(operand)) {\n return {\n tuples: () => (operand as Relation).toArray(),\n output: (tuples) => new MemoryRelation(tuples),\n };\n } else {\n throw `Unable to iterate ${operand}`\n }\n}\n\n/**\n * Converts a Renaming (object or function) to a RenamingFunc.\n *\n * @example\n * // Object renaming\n * const fn = toRenamingFunc({ name: 'fullName', age: 'years' });\n * fn('name'); // => 'fullName'\n * fn('age'); // => 'years'\n * fn('other'); // => 'other' (unchanged)\n *\n * @example\n * // Function renaming (passed through)\n * const fn = toRenamingFunc(attr => attr.toUpperCase());\n * fn('name'); // => 'NAME'\n */\nexport const toRenamingFunc = (renaming: Renaming): RenamingFunc => {\n if (typeof(renaming) === 'function') {\n return renaming;\n } else {\n return (attr) => renaming[attr] || attr;\n }\n}\n\nexport const error = (msg: string) => {\n throw(msg);\n}\n\n// Join helpers\n\n/**\n * Finds attribute names that exist in both left and right tuple arrays.\n * Used for natural joins when no explicit keys are provided.\n *\n * @example\n * const left = [{ id: 1, name: 'Alice', city: 'NYC' }];\n * const right = [{ city: 'NYC', country: 'USA' }];\n * getCommonAttrs(left, right);\n * // => ['city']\n *\n * @example\n * const left = [{ a: 1, b: 2 }];\n * const right = [{ b: 2, c: 3 }];\n * getCommonAttrs(left, right);\n * // => ['b']\n */\nexport const getCommonAttrs = (left: Tuple[], right: Tuple[]): AttrName[] => {\n if (left.length === 0 || right.length === 0) return [];\n const leftAttrs = new Set(Object.keys(left[0]));\n const rightAttrs = Object.keys(right[0]);\n return rightAttrs.filter(attr => leftAttrs.has(attr));\n}\n\n/**\n * Normalizes JoinKeys to a Record<AttrName, AttrName> mapping left attrs to right attrs.\n *\n * @example\n * // undefined => use common attributes\n * normalizeKeys(undefined, [{ id: 1, city: 'NYC' }], [{ city: 'NYC' }]);\n * // => { city: 'city' }\n *\n * @example\n * // Array of common attribute names\n * normalizeKeys(['city', 'country'], leftTuples, rightTuples);\n * // => { city: 'city', country: 'country' }\n *\n * @example\n * // Object mapping left attr to right attr\n * normalizeKeys({ city: 'location' }, leftTuples, rightTuples);\n * // => { city: 'location' }\n */\nexport const normalizeKeys = (keys: JoinKeys | undefined, leftTuples: Tuple[], rightTuples: Tuple[]): Record<AttrName, AttrName> => {\n if (!keys) {\n const common = getCommonAttrs(leftTuples, rightTuples);\n return common.reduce((acc, attr) => {\n acc[attr] = attr;\n return acc;\n }, {} as Record<AttrName, AttrName>);\n }\n if (Array.isArray(keys)) {\n return keys.reduce((acc, attr) => {\n acc[attr] = attr;\n return acc;\n }, {} as Record<AttrName, AttrName>);\n }\n return keys;\n}\n\n/**\n * Checks if two tuples match on the specified key mapping.\n *\n * @example\n * const keyMap = { city: 'location' };\n * tuplesMatch({ id: 1, city: 'NYC' }, { location: 'NYC', pop: 8 }, keyMap);\n * // => true (left.city === right.location)\n *\n * @example\n * const keyMap = { city: 'city' };\n * tuplesMatch({ city: 'NYC' }, { city: 'LA' }, keyMap);\n * // => false\n */\nexport const tuplesMatch = (left: Tuple, right: Tuple, keyMap: Record<AttrName, AttrName>): boolean => {\n for (const [leftAttr, rightAttr] of Object.entries(keyMap)) {\n if (left[leftAttr] !== right[rightAttr]) return false;\n }\n return true;\n}\n\n/**\n * Creates a string key from a tuple's join attributes for fast Set-based lookups.\n * Used by matching/not_matching for efficient semi-join operations.\n *\n * @example\n * const keyMap = { first: 'fname', last: 'lname' };\n *\n * // Left side uses left attr names (keys of keyMap)\n * matchKey({ id: 1, first: 'John', last: 'Doe' }, keyMap, 'left');\n * // => '\"John\"|\"Doe\"'\n *\n * // Right side uses right attr names (values of keyMap)\n * matchKey({ fname: 'John', lname: 'Doe', age: 30 }, keyMap, 'right');\n * // => '\"John\"|\"Doe\"'\n */\nexport const matchKey = (tuple: Tuple, keyMap: Record<AttrName, AttrName>, side: 'left' | 'right'): string => {\n const attrs = side === 'left' ? Object.keys(keyMap) : Object.values(keyMap);\n const values = attrs.map(attr => JSON.stringify(tuple[attr]));\n return values.join('|');\n}\n\n/**\n * Removes join key attributes from a right tuple when merging.\n * Used to avoid duplicate columns in join results.\n *\n * @example\n * const keyMap = { city: 'location' };\n * projectOutKeys({ location: 'NYC', country: 'USA', pop: 8 }, keyMap);\n * // => { country: 'USA', pop: 8 } (location removed)\n *\n * @example\n * const keyMap = { a: 'a', b: 'b' };\n * projectOutKeys({ a: 1, b: 2, c: 3 }, keyMap);\n * // => { c: 3 } (a and b removed)\n */\nexport const projectOutKeys = (tuple: Tuple, keyMap: Record<AttrName, AttrName>): Tuple => {\n const rightKeys = new Set(Object.values(keyMap));\n const result: Tuple = {};\n for (const [attr, value] of Object.entries(tuple)) {\n if (!rightKeys.has(attr)) {\n result[attr] = value;\n }\n }\n return result;\n}\n","import { toPredicateFunc } from \"../support/toPredicateFunc\";\nimport { RelationOperand, Predicate, Tuple } from \"../types\";\nimport { toOperationalOperand } from \"./_helpers\";\n\nexport const restrict = (operand: RelationOperand, p: Predicate): RelationOperand => {\n const op = toOperationalOperand(operand);\n const iterable = op.tuples();\n const f = toPredicateFunc(p)\n const kept: Tuple[] = [];\n for (const tuple of iterable) {\n if (f(tuple)) kept.push(tuple);\n }\n return op.output(kept)\n}\n","import { toPredicateFunc } from \"../support/toPredicateFunc\";\nimport { RelationOperand, Predicate, Tuple } from \"../types\";\nimport { toOperationalOperand } from \"./_helpers\";\n\nexport const exclude = (operand: RelationOperand, p: Predicate): RelationOperand => {\n const op = toOperationalOperand(operand);\n const iterable = op.tuples();\n const f = toPredicateFunc(p)\n const kept: Tuple[] = [];\n for (const tuple of iterable) {\n if (!f(tuple)) kept.push(tuple);\n }\n return op.output(kept)\n}\n","import { RelationOperand, Tuple } from \"../types\";\nimport { toOperationalOperand } from \"./_helpers\";\n\nexport const constants = (operand: RelationOperand, consts: Tuple): RelationOperand => {\n const op = toOperationalOperand(operand);\n const iterable = op.tuples();\n const result: Tuple[] = [];\n for (const tuple of iterable) {\n result.push({ ...tuple, ...consts });\n }\n return op.output(result)\n}\n","import { RelationOperand, Renaming, Tuple } from \"../types\";\nimport { toOperationalOperand, toRenamingFunc } from \"./_helpers\";\n\nexport const rename = (operand: RelationOperand, renaming: Renaming): RelationOperand => {\n const op = toOperationalOperand(operand);\n const iterable = op.tuples();\n const renamingFunc = toRenamingFunc(renaming)\n const result: Tuple[] = [];\n for (const tuple of iterable) {\n const renamed = Object.keys(tuple).reduce((memo, attr) => {\n memo[renamingFunc(attr)] = tuple[attr];\n return memo;\n }, {})\n result.push(renamed);\n }\n return op.output(result)\n}\n","import { PrefixOptions, RelationOperand } from \"../types\";\nimport { rename } from \"./rename\";\n\nexport const prefix = (operand: RelationOperand, pfx: string, options?: PrefixOptions): RelationOperand => {\n const except = new Set(options?.except ?? []);\n return rename(operand, (attr) => except.has(attr) ? attr : `${pfx}${attr}`);\n}\n","import { RelationOperand, SuffixOptions } from \"../types\";\nimport { rename } from \"./rename\";\n\nexport const suffix = (operand: RelationOperand, sfx: string, options?: SuffixOptions): RelationOperand => {\n const except = new Set(options?.except ?? []);\n return rename(operand, (attr) => except.has(attr) ? attr : `${attr}${sfx}`);\n}\n","import { RelationOperand, AttrName, Tuple } from \"../types\";\nimport { toOperationalOperand, deduplicate } from \"./_helpers\";\n\nexport const project = (operand: RelationOperand, attrs: AttrName[]): RelationOperand => {\n const op = toOperationalOperand(operand);\n const iterable = op.tuples();\n const result: Tuple[] = [];\n for (const tuple of iterable) {\n const projected = attrs.reduce((memo, attr) => {\n if (attr in tuple) {\n memo[attr] = tuple[attr];\n }\n return memo;\n }, {} as Tuple);\n result.push(projected);\n }\n return op.output(deduplicate(result));\n}\n","import { RelationOperand, AttrName, Tuple } from \"../types\";\nimport { toOperationalOperand, deduplicate } from \"./_helpers\";\n\nexport const allbut = (operand: RelationOperand, attrs: AttrName[]): RelationOperand => {\n const op = toOperationalOperand(operand);\n const iterable = op.tuples();\n const excluded = new Set(attrs);\n const result: Tuple[] = [];\n for (const tuple of iterable) {\n const projected = Object.keys(tuple).reduce((memo, attr) => {\n if (!excluded.has(attr)) {\n memo[attr] = tuple[attr];\n }\n return memo;\n }, {} as Tuple);\n result.push(projected);\n }\n return op.output(deduplicate(result));\n}\n","import { RelationOperand, Extension, Tuple } from \"../types\";\nimport { toOperationalOperand } from \"./_helpers\";\n\nexport const extend = (operand: RelationOperand, extension: Extension): RelationOperand => {\n const op = toOperationalOperand(operand);\n const iterable = op.tuples();\n const result: Tuple[] = [];\n for (const tuple of iterable) {\n const extended = { ...tuple };\n for (const [attr, spec] of Object.entries(extension)) {\n if (typeof spec === 'function') {\n extended[attr] = spec(tuple);\n } else {\n extended[attr] = tuple[spec];\n }\n }\n result.push(extended);\n }\n return op.output(result);\n}\n","import { RelationOperand, Tuple } from \"../types\";\nimport { toOperationalOperand, tupleKey } from \"./_helpers\";\n\nexport const union = (left: RelationOperand, right: RelationOperand): RelationOperand => {\n const opLeft = toOperationalOperand(left);\n const opRight = toOperationalOperand(right);\n const seen = new Set<string>();\n const result: Tuple[] = [];\n\n for (const tuple of opLeft.tuples()) {\n const key = tupleKey(tuple);\n if (!seen.has(key)) {\n seen.add(key);\n result.push(tuple);\n }\n }\n\n for (const tuple of opRight.tuples()) {\n const key = tupleKey(tuple);\n if (!seen.has(key)) {\n seen.add(key);\n result.push(tuple);\n }\n }\n\n return opLeft.output(result);\n}\n","import { RelationOperand, Tuple } from \"../types\";\nimport { toOperationalOperand, tupleKey } from \"./_helpers\";\n\nexport const minus = (left: RelationOperand, right: RelationOperand): RelationOperand => {\n const opLeft = toOperationalOperand(left);\n const opRight = toOperationalOperand(right);\n\n const rightKeys = new Set<string>();\n for (const tuple of opRight.tuples()) {\n rightKeys.add(tupleKey(tuple));\n }\n\n const seen = new Set<string>();\n const result: Tuple[] = [];\n for (const tuple of opLeft.tuples()) {\n const key = tupleKey(tuple);\n if (!rightKeys.has(key) && !seen.has(key)) {\n seen.add(key);\n result.push(tuple);\n }\n }\n\n return opLeft.output(result);\n}\n","import { RelationOperand, Tuple } from \"../types\";\nimport { toOperationalOperand, tupleKey } from \"./_helpers\";\n\nexport const intersect = (left: RelationOperand, right: RelationOperand): RelationOperand => {\n const opLeft = toOperationalOperand(left);\n const opRight = toOperationalOperand(right);\n\n const rightKeys = new Set<string>();\n for (const tuple of opRight.tuples()) {\n rightKeys.add(tupleKey(tuple));\n }\n\n const seen = new Set<string>();\n const result: Tuple[] = [];\n for (const tuple of opLeft.tuples()) {\n const key = tupleKey(tuple);\n if (rightKeys.has(key) && !seen.has(key)) {\n seen.add(key);\n result.push(tuple);\n }\n }\n\n return opLeft.output(result);\n}\n","import { RelationOperand, JoinKeys, Tuple } from \"../types\";\nimport { toOperationalOperand, normalizeKeys, matchKey } from \"./_helpers\";\n\nexport const matching = (left: RelationOperand, right: RelationOperand, keys?: JoinKeys): RelationOperand => {\n const opLeft = toOperationalOperand(left);\n const opRight = toOperationalOperand(right);\n const leftTuples = [...opLeft.tuples()];\n const rightTuples = [...opRight.tuples()];\n const keyMap = normalizeKeys(keys, leftTuples, rightTuples);\n\n const rightKeys = new Set<string>();\n for (const tuple of rightTuples) {\n rightKeys.add(matchKey(tuple, keyMap, 'right'));\n }\n\n const result: Tuple[] = [];\n for (const tuple of leftTuples) {\n if (rightKeys.has(matchKey(tuple, keyMap, 'left'))) {\n result.push(tuple);\n }\n }\n\n return opLeft.output(result);\n}\n","import { RelationOperand, JoinKeys, Tuple } from \"../types\";\nimport { toOperationalOperand, normalizeKeys, matchKey } from \"./_helpers\";\n\nexport const not_matching = (left: RelationOperand, right: RelationOperand, keys?: JoinKeys): RelationOperand => {\n const opLeft = toOperationalOperand(left);\n const opRight = toOperationalOperand(right);\n const leftTuples = [...opLeft.tuples()];\n const rightTuples = [...opRight.tuples()];\n const keyMap = normalizeKeys(keys, leftTuples, rightTuples);\n\n const rightKeys = new Set<string>();\n for (const tuple of rightTuples) {\n rightKeys.add(matchKey(tuple, keyMap, 'right'));\n }\n\n const result: Tuple[] = [];\n for (const tuple of leftTuples) {\n if (!rightKeys.has(matchKey(tuple, keyMap, 'left'))) {\n result.push(tuple);\n }\n }\n\n return opLeft.output(result);\n}\n","import { RelationOperand, JoinKeys, Tuple, AttrName } from \"../types\";\nimport { toOperationalOperand, normalizeKeys, tuplesMatch, projectOutKeys } from \"./_helpers\";\n\nconst mergeTuples = (left: Tuple, right: Tuple, keyMap: Record<AttrName, AttrName>): Tuple => {\n return { ...left, ...projectOutKeys(right, keyMap) };\n}\n\nexport const join = (left: RelationOperand, right: RelationOperand, keys?: JoinKeys): RelationOperand => {\n const opLeft = toOperationalOperand(left);\n const opRight = toOperationalOperand(right);\n const leftTuples = [...opLeft.tuples()];\n const rightTuples = [...opRight.tuples()];\n const keyMap = normalizeKeys(keys, leftTuples, rightTuples);\n const result: Tuple[] = [];\n\n for (const leftTuple of leftTuples) {\n for (const rightTuple of rightTuples) {\n if (tuplesMatch(leftTuple, rightTuple, keyMap)) {\n result.push(mergeTuples(leftTuple, rightTuple, keyMap));\n }\n }\n }\n\n return opLeft.output(result);\n}\n","import { RelationOperand, JoinKeys, Tuple, AttrName } from \"../types\";\nimport { toOperationalOperand, normalizeKeys, tuplesMatch } from \"./_helpers\";\n\nconst getRightAttrs = (rightTuples: Tuple[], keyMap: Record<AttrName, AttrName>): AttrName[] => {\n if (rightTuples.length === 0) return [];\n const rightKeys = new Set(Object.values(keyMap));\n return Object.keys(rightTuples[0]).filter(attr => !rightKeys.has(attr));\n}\n\nconst mergeTuples = (left: Tuple, right: Tuple | null, rightAttrs: AttrName[]): Tuple => {\n const result = { ...left };\n for (const attr of rightAttrs) {\n result[attr] = right ? right[attr] : null;\n }\n return result;\n}\n\nexport const left_join = (left: RelationOperand, right: RelationOperand, keys?: JoinKeys): RelationOperand => {\n const opLeft = toOperationalOperand(left);\n const opRight = toOperationalOperand(right);\n const leftTuples = [...opLeft.tuples()];\n const rightTuples = [...opRight.tuples()];\n const keyMap = normalizeKeys(keys, leftTuples, rightTuples);\n const rightAttrs = getRightAttrs(rightTuples, keyMap);\n const result: Tuple[] = [];\n\n for (const leftTuple of leftTuples) {\n let matched = false;\n for (const rightTuple of rightTuples) {\n if (tuplesMatch(leftTuple, rightTuple, keyMap)) {\n result.push(mergeTuples(leftTuple, rightTuple, rightAttrs));\n matched = true;\n }\n }\n if (!matched) {\n result.push(mergeTuples(leftTuple, null, rightAttrs));\n }\n }\n\n return opLeft.output(result);\n}\n","import { RelationOperand, Tuple } from \"../types\";\nimport { toOperationalOperand, deduplicate } from \"./_helpers\";\n\nexport const cross_product = (left: RelationOperand, right: RelationOperand): RelationOperand => {\n const opLeft = toOperationalOperand(left);\n const opRight = toOperationalOperand(right);\n const leftTuples = [...opLeft.tuples()];\n const rightTuples = [...opRight.tuples()];\n const result: Tuple[] = [];\n\n for (const l of leftTuples) {\n for (const r of rightTuples) {\n result.push({ ...r, ...l });\n }\n }\n\n return opLeft.output(deduplicate(result));\n}\n\nexport { cross_product as cross_join };\n","import { RelationOperand, JoinKeys, Tuple, AttrName } from \"../types\";\nimport { toOperationalOperand, normalizeKeys, tuplesMatch, projectOutKeys } from \"./_helpers\";\nimport { MemoryRelation } from \"@/Relation\";\n\nexport const image = (left: RelationOperand, right: RelationOperand, as: AttrName, keys?: JoinKeys): RelationOperand => {\n const opLeft = toOperationalOperand(left);\n const opRight = toOperationalOperand(right);\n const leftTuples = [...opLeft.tuples()];\n const rightTuples = [...opRight.tuples()];\n const keyMap = normalizeKeys(keys, leftTuples, rightTuples);\n const result: Tuple[] = [];\n\n for (const leftTuple of leftTuples) {\n const matches: Tuple[] = [];\n for (const rightTuple of rightTuples) {\n if (tuplesMatch(leftTuple, rightTuple, keyMap)) {\n matches.push(projectOutKeys(rightTuple, keyMap));\n }\n }\n result.push({\n ...leftTuple,\n [as]: new MemoryRelation(matches)\n });\n }\n\n return opLeft.output(result);\n}\n","import { RelationOperand, AttrName, Tuple, Aggregator, Aggregators } from \"../types\";\nimport { toOperationalOperand } from \"./_helpers\";\n\nconst groupKey = (tuple: Tuple, by: AttrName[]): string => {\n const keyParts = by.map(attr => JSON.stringify(tuple[attr]));\n return keyParts.join('|');\n}\n\nconst pickAttrs = (tuple: Tuple, attrs: AttrName[]): Tuple => {\n return attrs.reduce((acc, attr) => {\n acc[attr] = tuple[attr];\n return acc;\n }, {} as Tuple);\n}\n\nconst applyAggregator = (tuples: Tuple[], agg: Aggregator): unknown => {\n if (typeof agg === 'function') {\n return agg(tuples);\n }\n\n const spec = typeof agg === 'string' ? { op: agg, attr: '' } : agg;\n const { op, attr } = spec;\n\n switch (op) {\n case 'count':\n return tuples.length;\n\n case 'sum': {\n return tuples.reduce((sum, t) => sum + (Number(t[attr]) || 0), 0);\n }\n\n case 'min': {\n const values = tuples.map(t => t[attr]).filter(v => v !== undefined && v !== null);\n return values.length > 0 ? Math.min(...values.map(Number)) : null;\n }\n\n case 'max': {\n const values = tuples.map(t => t[attr]).filter(v => v !== undefined && v !== null);\n return values.length > 0 ? Math.max(...values.map(Number)) : null;\n }\n\n case 'avg': {\n const values = tuples.map(t => Number(t[attr])).filter(v => !isNaN(v));\n return values.length > 0 ? values.reduce((a, b) => a + b, 0) / values.length : null;\n }\n\n case 'collect': {\n return tuples.map(t => t[attr]);\n }\n\n default:\n throw new Error(`Unknown aggregator: ${op}`);\n }\n}\n\nexport const summarize = (\n operand: RelationOperand,\n by: AttrName[],\n aggs: Aggregators\n): RelationOperand => {\n const op = toOperationalOperand(operand);\n const tuples = [...op.tuples()];\n\n // Group tuples\n const groups = new Map<string, Tuple[]>();\n for (const tuple of tuples) {\n const key = groupKey(tuple, by);\n if (!groups.has(key)) {\n groups.set(key, []);\n }\n groups.get(key)!.push(tuple);\n }\n\n // Apply aggregators to each group\n const result: Tuple[] = [];\n for (const groupTuples of groups.values()) {\n const row: Tuple = pickAttrs(groupTuples[0], by);\n for (const [resultAttr, agg] of Object.entries(aggs)) {\n row[resultAttr] = applyAggregator(groupTuples, agg);\n }\n result.push(row);\n }\n\n return op.output(result);\n}\n","import { RelationOperand, AttrName, Tuple } from \"../types\";\nimport { toOperationalOperand } from \"./_helpers\";\nimport { MemoryRelation } from \"@/Relation\";\n\nconst groupKey = (tuple: Tuple, byAttrs: AttrName[]): string => {\n const keyParts = byAttrs.map(attr => JSON.stringify(tuple[attr]));\n return keyParts.join('|');\n}\n\nconst pickAttrs = (tuple: Tuple, attrs: AttrName[]): Tuple => {\n return attrs.reduce((acc, attr) => {\n acc[attr] = tuple[attr];\n return acc;\n }, {} as Tuple);\n}\n\nexport const group = (operand: RelationOperand, attrs: AttrName[], as: AttrName): RelationOperand => {\n const op = toOperationalOperand(operand);\n const tuples = [...op.tuples()];\n\n if (tuples.length === 0) {\n return op.output([]);\n }\n\n // Determine which attributes to keep at the top level (all except grouped ones)\n const allAttrs = Object.keys(tuples[0]);\n const groupedSet = new Set(attrs);\n const byAttrs = allAttrs.filter(a => !groupedSet.has(a));\n\n // Group tuples\n const groups = new Map<string, { base: Tuple, nested: Tuple[] }>();\n for (const tuple of tuples) {\n const key = groupKey(tuple, byAttrs);\n if (!groups.has(key)) {\n groups.set(key, {\n base: pickAttrs(tuple, byAttrs),\n nested: []\n });\n }\n groups.get(key)!.nested.push(pickAttrs(tuple, attrs));\n }\n\n // Build result with nested relations\n const result: Tuple[] = [];\n for (const { base, nested } of groups.values()) {\n result.push({\n ...base,\n [as]: new MemoryRelation(nested)\n });\n }\n\n return op.output(result);\n}\n","import { RelationOperand, AttrName, Tuple, Relation } from \"../types\";\nimport { toOperationalOperand } from \"./_helpers\";\nimport { isRelation } from \"./isRelation\";\n\nconst toTupleArray = (value: unknown): Tuple[] => {\n if (isRelation(value)) {\n return (value as Relation).toArray();\n }\n if (Array.isArray(value)) {\n return value;\n }\n throw new Error(`Value is not a relation or array`);\n}\n\nexport const ungroup = (operand: RelationOperand, attr: AttrName): RelationOperand => {\n const op = toOperationalOperand(operand);\n const tuples = [...op.tuples()];\n const result: Tuple[] = [];\n\n for (const tuple of tuples) {\n const nested = toTupleArray(tuple[attr]);\n\n // Get base attributes (all except the grouped one)\n const base: Tuple = {};\n for (const [key, value] of Object.entries(tuple)) {\n if (key !== attr) {\n base[key] = value;\n }\n }\n\n // Flatten each nested tuple\n for (const nestedTuple of nested) {\n result.push({\n ...base,\n ...nestedTuple\n });\n }\n }\n\n return op.output(result);\n}\n","import { RelationOperand, AttrName, Tuple } from \"../types\";\nimport { toOperationalOperand } from \"./_helpers\";\n\nexport const wrap = (operand: RelationOperand, attrs: AttrName[], as: AttrName): RelationOperand => {\n const op = toOperationalOperand(operand);\n const iterable = op.tuples();\n const wrappedSet = new Set(attrs);\n const result: Tuple[] = [];\n\n for (const tuple of iterable) {\n const wrapped: Tuple = {};\n const remaining: Tuple = {};\n\n for (const [key, value] of Object.entries(tuple)) {\n if (wrappedSet.has(key)) {\n wrapped[key] = value;\n } else {\n remaining[key] = value;\n }\n }\n\n result.push({\n ...remaining,\n [as]: wrapped\n });\n }\n\n return op.output(result);\n}\n","import { RelationOperand, AttrName, Tuple } from \"../types\";\nimport { toOperationalOperand } from \"./_helpers\";\n\nexport const unwrap = (operand: RelationOperand, attr: AttrName): RelationOperand => {\n const op = toOperationalOperand(operand);\n const iterable = op.tuples();\n const result: Tuple[] = [];\n\n for (const tuple of iterable) {\n const wrapped = tuple[attr] as Tuple;\n if (typeof wrapped !== 'object' || wrapped === null || Array.isArray(wrapped)) {\n throw new Error(`Attribute '${attr}' is not a tuple (object)`);\n }\n\n const unwrapped: Tuple = {};\n for (const [key, value] of Object.entries(tuple)) {\n if (key !== attr) {\n unwrapped[key] = value;\n }\n }\n\n result.push({\n ...unwrapped,\n ...wrapped\n });\n }\n\n return op.output(result);\n}\n","import { AutowrapOptions, RelationOperand, Tuple } from \"../types\";\nimport { toOperationalOperand } from \"./_helpers\";\n\nexport const autowrap = (operand: RelationOperand, options?: AutowrapOptions): RelationOperand => {\n const sep = options?.separator ?? '_';\n const op = toOperationalOperand(operand);\n const iterable = op.tuples();\n const result: Tuple[] = [];\n\n for (const tuple of iterable) {\n const wrapped: Tuple = {};\n for (const [attr, value] of Object.entries(tuple)) {\n const parts = attr.split(sep);\n if (parts.length === 1) {\n wrapped[attr] = value;\n } else {\n const [prefix, ...rest] = parts;\n wrapped[prefix] = wrapped[prefix] ?? {};\n (wrapped[prefix] as Tuple)[rest.join(sep)] = value;\n }\n }\n result.push(wrapped);\n }\n\n return op.output(result);\n}\n","import { RelationOperand, Transformation, Tuple } from \"../types\";\nimport { toOperationalOperand } from \"./_helpers\";\n\nexport const transform = (operand: RelationOperand, transformation: Transformation): RelationOperand => {\n const op = toOperationalOperand(operand);\n const iterable = op.tuples();\n const result: Tuple[] = [];\n\n for (const tuple of iterable) {\n const transformed: Tuple = {};\n\n for (const [attr, value] of Object.entries(tuple)) {\n transformed[attr] = applyTransformation(value, attr, transformation);\n }\n\n result.push(transformed);\n }\n\n return op.output(result);\n}\n\nconst applyTransformation = (value: unknown, attr: string, transformation: Transformation): unknown => {\n if (typeof transformation === 'function') {\n // Single function - apply to all values\n return transformation(value);\n } else if (Array.isArray(transformation)) {\n // Array of functions - chain them\n return transformation.reduce((v, fn) => fn(v), value);\n } else {\n // Object with attr-specific transformers\n const fn = transformation[attr];\n if (fn) {\n if (Array.isArray(fn)) {\n return fn.reduce((v, f) => f(v), value);\n }\n return fn(value);\n }\n return value;\n }\n}\n","import { RelationOperand } from \"../types\";\nimport { toOperationalOperand, tupleKey } from \"./_helpers\";\n\nexport const isEqual = (left: RelationOperand, right: RelationOperand): boolean => {\n const opLeft = toOperationalOperand(left);\n const opRight = toOperationalOperand(right);\n\n const leftKeys = new Set<string>();\n for (const tuple of opLeft.tuples()) {\n leftKeys.add(tupleKey(tuple));\n }\n\n const rightKeys = new Set<string>();\n for (const tuple of opRight.tuples()) {\n rightKeys.add(tupleKey(tuple));\n }\n\n if (leftKeys.size !== rightKeys.size) {\n return false;\n }\n\n for (const key of leftKeys) {\n if (!rightKeys.has(key)) {\n return false;\n }\n }\n\n return true;\n}\n","import { RelationOperand, Tuple } from \"../types\";\nimport { toOperationalOperand, error } from \"./_helpers\";\n\nexport const one = (operand: RelationOperand): Tuple => {\n const op = toOperationalOperand(operand);\n const iterable = op.tuples();\n let tuple;\n for (const t of iterable) {\n if (tuple) {\n return error('More than one tuple found');\n } else {\n tuple = t;\n }\n }\n if (tuple) return tuple;\n return error('Relation is empty');\n}\n","import { AttrName, RelationOperand, Tuple } from \"../types\";\nimport { toOperationalOperand } from \"./_helpers\";\n\nexport const yByX = (operand: RelationOperand, y: AttrName, x: AttrName): Tuple => {\n const op = toOperationalOperand(operand);\n const iterable = op.tuples();\n const hash = {};\n for (const tuple of iterable) {\n hash[`${tuple[x]}`] = tuple[y];\n }\n return hash;\n}\n","export * from './operators';\nexport * from './types';\nexport * from './utility-types';\n\nimport { MemoryRelation } from './Relation';\nimport { isRelation } from './operators';\n\n/**\n * Creates a new in-memory relation from an array of tuples.\n *\n * @typeParam T - The tuple type. Inferred from input or explicitly provided.\n *\n * @example\n * // Untyped usage (backwards compatible)\n * const r = Bmg([{ id: 1, name: 'Alice' }]);\n *\n * @example\n * // Typed usage with explicit type parameter\n * interface Person { id: number; name: string }\n * const r = Bmg<Person>([{ id: 1, name: 'Alice' }]);\n * r.project(['id']); // Autocomplete suggests 'id' | 'name'\n *\n * @example\n * // Type is inferred from input\n * const r = Bmg([{ id: 1, name: 'Alice' }] as const);\n */\nexport function Bmg<T>(tuples: T[]): MemoryRelation<T> {\n return new MemoryRelation<T>(tuples);\n}\n\nBmg.isRelation = isRelation;\n"],"names":["toPredicateFunc","p","expected","t","Object","keys","every","k","MemoryRelation","constructor","tuples","this","restrict","where","exclude","project","attrs","allbut","extend","e","constants","consts","rename","r","prefix","pfx","options","suffix","sfx","union","right","minus","intersect","matching","not_matching","join","left_join","cross_product","cross_join","image","as","group","ungroup","attr","wrap","unwrap","summarize","by","aggs","transform","autowrap","one","toArray","yByX","y","x","isEqual","isRelation","op","tupleKey","tuple","entries","map","v","value","sort","JSON","stringify","a","b","localeCompare","deduplicate","seen","Set","result","key","has","add","push","toOperationalOperand","operand","Array","isArray","output","error","msg","normalizeKeys","leftTuples","rightTuples","reduce","acc","getCommonAttrs","left","length","leftAttrs","filter","tuplesMatch","keyMap","leftAttr","rightAttr","matchKey","side","values","projectOutKeys","rightKeys","iterable","f","kept","_extends","renaming","renamingFunc","toRenamingFunc","renamed","memo","_options$except","except","projected","excluded","extension","extended","spec","opLeft","opRight","mergeTuples","leftTuple","rightTuple","rightAttrs","getRightAttrs","matched","l","matches","groupKey","pickAttrs","applyAggregator","agg","sum","Number","Math","min","max","isNaN","Error","groups","Map","set","get","groupTuples","row","resultAttr","byAttrs","allAttrs","groupedSet","base","nested","toTupleArray","nestedTuple","wrappedSet","wrapped","remaining","unwrapped","_options$separator","sep","separator","parts","split","_wrapped$prefix","rest","transformation","transformed","applyTransformation","fn","leftKeys","size","hash","Bmg"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ function t(t,n){(null==n||n>t.length)&&(n=t.length);for(var r=0,e=Array(n);r<n;r++)e[r]=t[r];return e}function n(n,r){var e="undefined"!=typeof Symbol&&n[Symbol.iterator]||n["@@iterator"];if(e)return(e=e.call(n)).next.bind(e);if(Array.isArray(n)||(e=function(n,r){if(n){if("string"==typeof n)return t(n,r);var e={}.toString.call(n).slice(8,-1);return"Object"===e&&n.constructor&&(e=n.constructor.name),"Map"===e||"Set"===e?Array.from(n):"Arguments"===e||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(e)?t(n,r):void 0}}(n))||r&&n&&"number"==typeof n.length){e&&(n=e);var u=0;return function(){return u>=n.length?{done:!0}:{done:!1,value:n[u++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function r(){return r=Object.assign?Object.assign.bind():function(t){for(var n=1;n<arguments.length;n++){var r=arguments[n];for(var e in r)({}).hasOwnProperty.call(r,e)&&(t[e]=r[e])}return t},r.apply(null,arguments)}var e=function(t){if("function"==typeof t)return t;var n=t;return function(t){return Object.keys(n).every(function(r){return t[r]===n[r]})}},u=/*#__PURE__*/function(){function t(t){this.tuples=void 0,this.tuples=t,this.tuples=t}var n=t.prototype;return n.restrict=function(t){return h(this,t)},n.where=function(t){return h(this,t)},n.exclude=function(t){return d(this,t)},n.project=function(t){return m(this,t)},n.allbut=function(t){return j(this,t)},n.extend=function(t){return O(this,t)},n.constants=function(t){return y(this,t)},n.rename=function(t){return g(this,t)},n.prefix=function(t,n){return b(this,t,n)},n.suffix=function(t,n){return w(this,t,n)},n.union=function(t){return S(this,t)},n.minus=function(t){return A(this,t)},n.intersect=function(t){return x(this,t)},n.matching=function(t,n){return N(this,t,n)},n.not_matching=function(t,n){return k(this,t,n)},n.join=function(t,n){return _(this,t,n)},n.left_join=function(t,n){return J(this,t,n)},n.cross_product=function(t){return z(this,t)},n.cross_join=function(t){return z(this,t)},n.image=function(t,n,r){return I(this,t,n,r)},n.group=function(t,n){return T(this,t,n)},n.ungroup=function(t){return X(this,t)},n.wrap=function(t,n){return $(this,t,n)},n.unwrap=function(t){return D(this,t)},n.summarize=function(t,n){return q(this,t,n)},n.transform=function(t){return G(this,t)},n.autowrap=function(t){return F(this,t)},n.one=function(){return L(this)},n.toArray=function(){return this.tuples},n.yByX=function(t,n){return Q(this,t,n)},n.isEqual=function(t){return K(this,t)},t}(),o=function(t){return null!=t&&t.constructor===u},a=function(t){var n=Object.entries(t).map(function(t){return[t[0],(n=t[1],o(n)?n.toArray().map(function(t){return a(t)}).sort():n)];var n});return JSON.stringify(n.sort(function(t,n){return t[0].localeCompare(n[0])}))},i=function(t){for(var r,e=new Set,u=[],o=n(t);!(r=o()).done;){var i=r.value,f=a(i);e.has(f)||(e.add(f),u.push(i))}return u},f=function(t){if(Array.isArray(t))return{tuples:function(){return t},output:function(t){return t}};if(o(t))return{tuples:function(){return t.toArray()},output:function(t){return new u(t)}};throw"Unable to iterate "+t},c=function(t){throw t},s=function(t,n,r){return t?Array.isArray(t)?t.reduce(function(t,n){return t[n]=n,t},{}):t:function(t,n){if(0===t.length||0===n.length)return[];var r=new Set(Object.keys(t[0]));return Object.keys(n[0]).filter(function(t){return r.has(t)})}(n,r).reduce(function(t,n){return t[n]=n,t},{})},l=function(t,n,r){for(var e=0,u=Object.entries(r);e<u.length;e++){var o=u[e];if(t[o[0]]!==n[o[1]])return!1}return!0},v=function(t,n,r){return("left"===r?Object.keys(n):Object.values(n)).map(function(n){return JSON.stringify(t[n])}).join("|")},p=function(t,n){for(var r=new Set(Object.values(n)),e={},u=0,o=Object.entries(t);u<o.length;u++){var a=o[u],i=a[0],f=a[1];r.has(i)||(e[i]=f)}return e},h=function(t,r){for(var u,o=f(t),a=o.tuples(),i=e(r),c=[],s=n(a);!(u=s()).done;){var l=u.value;i(l)&&c.push(l)}return o.output(c)},d=function(t,r){for(var u,o=f(t),a=o.tuples(),i=e(r),c=[],s=n(a);!(u=s()).done;){var l=u.value;i(l)||c.push(l)}return o.output(c)},y=function(t,e){for(var u,o=f(t),a=[],i=n(o.tuples());!(u=i()).done;)a.push(r({},u.value,e));return o.output(a)},g=function(t,r){for(var e,u=f(t),o=u.tuples(),a=function(t){return"function"==typeof t?t:function(n){return t[n]||n}}(r),i=[],c=function(){var t=e.value,n=Object.keys(t).reduce(function(n,r){return n[a(r)]=t[r],n},{});i.push(n)},s=n(o);!(e=s()).done;)c();return u.output(i)},b=function(t,n,r){var e,u=new Set(null!=(e=null==r?void 0:r.except)?e:[]);return g(t,function(t){return u.has(t)?t:""+n+t})},w=function(t,n,r){var e,u=new Set(null!=(e=null==r?void 0:r.except)?e:[]);return g(t,function(t){return u.has(t)?t:""+t+n})},m=function(t,r){for(var e,u=f(t),o=u.tuples(),a=[],c=function(){var t=e.value,n=r.reduce(function(n,r){return r in t&&(n[r]=t[r]),n},{});a.push(n)},s=n(o);!(e=s()).done;)c();return u.output(i(a))},j=function(t,r){for(var e,u=f(t),o=u.tuples(),a=new Set(r),c=[],s=function(){var t=e.value,n=Object.keys(t).reduce(function(n,r){return a.has(r)||(n[r]=t[r]),n},{});c.push(n)},l=n(o);!(e=l()).done;)s();return u.output(i(c))},O=function(t,e){for(var u,o=f(t),a=[],i=n(o.tuples());!(u=i()).done;){for(var c=u.value,s=r({},c),l=0,v=Object.entries(e);l<v.length;l++){var p=v[l],h=p[1];s[p[0]]="function"==typeof h?h(c):c[h]}a.push(s)}return o.output(a)},S=function(t,r){for(var e,u=f(t),o=f(r),i=new Set,c=[],s=n(u.tuples());!(e=s()).done;){var l=e.value,v=a(l);i.has(v)||(i.add(v),c.push(l))}for(var p,h=n(o.tuples());!(p=h()).done;){var d=p.value,y=a(d);i.has(y)||(i.add(y),c.push(d))}return u.output(c)},A=function(t,r){for(var e,u=f(t),o=f(r),i=new Set,c=n(o.tuples());!(e=c()).done;)i.add(a(e.value));for(var s,l=new Set,v=[],p=n(u.tuples());!(s=p()).done;){var h=s.value,d=a(h);i.has(d)||l.has(d)||(l.add(d),v.push(h))}return u.output(v)},x=function(t,r){for(var e,u=f(t),o=f(r),i=new Set,c=n(o.tuples());!(e=c()).done;)i.add(a(e.value));for(var s,l=new Set,v=[],p=n(u.tuples());!(s=p()).done;){var h=s.value,d=a(h);i.has(d)&&!l.has(d)&&(l.add(d),v.push(h))}return u.output(v)},N=function(t,r,e){for(var u,o=f(t),a=f(r),i=[].concat(o.tuples()),c=[].concat(a.tuples()),l=s(e,i,c),p=new Set,h=n(c);!(u=h()).done;)p.add(v(u.value,l,"right"));for(var d,y=[],g=n(i);!(d=g()).done;){var b=d.value;p.has(v(b,l,"left"))&&y.push(b)}return o.output(y)},k=function(t,r,e){for(var u,o=f(t),a=f(r),i=[].concat(o.tuples()),c=[].concat(a.tuples()),l=s(e,i,c),p=new Set,h=n(c);!(u=h()).done;)p.add(v(u.value,l,"right"));for(var d,y=[],g=n(i);!(d=g()).done;){var b=d.value;p.has(v(b,l,"left"))||y.push(b)}return o.output(y)},M=function(t,n,e){return r({},t,p(n,e))},_=function(t,r,e){for(var u,o=f(t),a=f(r),i=[].concat(o.tuples()),c=[].concat(a.tuples()),v=s(e,i,c),p=[],h=n(i);!(u=h()).done;)for(var d,y=u.value,g=n(c);!(d=g()).done;){var b=d.value;l(y,b,v)&&p.push(M(y,b,v))}return o.output(p)},E=function(t,e,u){for(var o,a=r({},t),i=n(u);!(o=i()).done;){var f=o.value;a[f]=e?e[f]:null}return a},J=function(t,r,e){for(var u,o=f(t),a=f(r),i=[].concat(o.tuples()),c=[].concat(a.tuples()),v=s(e,i,c),p=function(t,n){if(0===t.length)return[];var r=new Set(Object.values(n));return Object.keys(t[0]).filter(function(t){return!r.has(t)})}(c,v),h=[],d=n(i);!(u=d()).done;){for(var y,g=u.value,b=!1,w=n(c);!(y=w()).done;){var m=y.value;l(g,m,v)&&(h.push(E(g,m,p)),b=!0)}b||h.push(E(g,null,p))}return o.output(h)},z=function(t,e){for(var u,o=f(t),a=f(e),c=[].concat(o.tuples()),s=[].concat(a.tuples()),l=[],v=n(c);!(u=v()).done;)for(var p,h=u.value,d=n(s);!(p=d()).done;)l.push(r({},p.value,h));return o.output(i(l))},I=function(t,e,o,a){for(var i,c=f(t),v=f(e),h=[].concat(c.tuples()),d=[].concat(v.tuples()),y=s(a,h,d),g=[],b=n(h);!(i=b()).done;){for(var w,m,j=i.value,O=[],S=n(d);!(m=S()).done;){var A=m.value;l(j,A,y)&&O.push(p(A,y))}g.push(r({},j,((w={})[o]=new u(O),w)))}return c.output(g)},U=function(t,n){return n.map(function(n){return JSON.stringify(t[n])}).join("|")},C=function(t,n){return n.reduce(function(n,r){return n[r]=t[r],n},{})},R=function(t,n){if("function"==typeof n)return n(t);var r="string"==typeof n?{op:n,attr:""}:n,e=r.op,u=r.attr;switch(e){case"count":return t.length;case"sum":return t.reduce(function(t,n){return t+(Number(n[u])||0)},0);case"min":var o=t.map(function(t){return t[u]}).filter(function(t){return null!=t});return o.length>0?Math.min.apply(Math,o.map(Number)):null;case"max":var a=t.map(function(t){return t[u]}).filter(function(t){return null!=t});return a.length>0?Math.max.apply(Math,a.map(Number)):null;case"avg":var i=t.map(function(t){return Number(t[u])}).filter(function(t){return!isNaN(t)});return i.length>0?i.reduce(function(t,n){return t+n},0)/i.length:null;case"collect":return t.map(function(t){return t[u]});default:throw new Error("Unknown aggregator: "+e)}},q=function(t,r,e){for(var u,o=f(t),a=[].concat(o.tuples()),i=new Map,c=n(a);!(u=c()).done;){var s=u.value,l=U(s,r);i.has(l)||i.set(l,[]),i.get(l).push(s)}for(var v,p=[],h=n(i.values());!(v=h()).done;){for(var d=v.value,y=C(d[0],r),g=0,b=Object.entries(e);g<b.length;g++){var w=b[g];y[w[0]]=R(d,w[1])}p.push(y)}return o.output(p)},B=function(t,n){return n.map(function(n){return JSON.stringify(t[n])}).join("|")},P=function(t,n){return n.reduce(function(n,r){return n[r]=t[r],n},{})},T=function(t,e,o){var a=f(t),i=[].concat(a.tuples());if(0===i.length)return a.output([]);for(var c,s=Object.keys(i[0]),l=new Set(e),v=s.filter(function(t){return!l.has(t)}),p=new Map,h=n(i);!(c=h()).done;){var d=c.value,y=B(d,v);p.has(y)||p.set(y,{base:P(d,v),nested:[]}),p.get(y).nested.push(P(d,e))}for(var g,b=[],w=n(p.values());!(g=w()).done;){var m,j=g.value;b.push(r({},j.base,((m={})[o]=new u(j.nested),m)))}return a.output(b)},V=function(t){if(o(t))return t.toArray();if(Array.isArray(t))return t;throw new Error("Value is not a relation or array")},X=function(t,e){for(var u,o=f(t),a=[],i=n([].concat(o.tuples()));!(u=i()).done;){for(var c=u.value,s=V(c[e]),l={},v=0,p=Object.entries(c);v<p.length;v++){var h=p[v],d=h[0];d!==e&&(l[d]=h[1])}for(var y,g=n(s);!(y=g()).done;)a.push(r({},l,y.value))}return o.output(a)},$=function(t,e,u){for(var o,a=f(t),i=a.tuples(),c=new Set(e),s=[],l=n(i);!(o=l()).done;){for(var v,p={},h={},d=0,y=Object.entries(o.value);d<y.length;d++){var g=y[d],b=g[0],w=g[1];c.has(b)?p[b]=w:h[b]=w}s.push(r({},h,((v={})[u]=p,v)))}return a.output(s)},D=function(t,e){for(var u,o=f(t),a=[],i=n(o.tuples());!(u=i()).done;){var c=u.value,s=c[e];if("object"!=typeof s||null===s||Array.isArray(s))throw new Error("Attribute '"+e+"' is not a tuple (object)");for(var l={},v=0,p=Object.entries(c);v<p.length;v++){var h=p[v],d=h[0];d!==e&&(l[d]=h[1])}a.push(r({},l,s))}return o.output(a)},F=function(r,e){for(var u,o,a=null!=(u=null==e?void 0:e.separator)?u:"_",i=f(r),c=[],s=n(i.tuples());!(o=s()).done;){for(var l={},v=0,p=Object.entries(o.value);v<p.length;v++){var h=p[v],d=h[0],y=h[1],g=d.split(a);if(1===g.length)l[d]=y;else{var b,w=g[0],m=t(g).slice(1);l[w]=null!=(b=l[w])?b:{},l[w][m.join(a)]=y}}c.push(l)}return i.output(c)},G=function(t,r){for(var e,u=f(t),o=[],a=n(u.tuples());!(e=a()).done;){for(var i={},c=0,s=Object.entries(e.value);c<s.length;c++){var l=s[c],v=l[0];i[v]=H(l[1],v,r)}o.push(i)}return u.output(o)},H=function(t,n,r){if("function"==typeof r)return r(t);if(Array.isArray(r))return r.reduce(function(t,n){return n(t)},t);var e=r[n];return e?Array.isArray(e)?e.reduce(function(t,n){return n(t)},t):e(t):t},K=function(t,r){for(var e,u=f(t),o=f(r),i=new Set,c=n(u.tuples());!(e=c()).done;)i.add(a(e.value));for(var s,l=new Set,v=n(o.tuples());!(s=v()).done;)l.add(a(s.value));if(i.size!==l.size)return!1;for(var p,h=n(i);!(p=h()).done;)if(!l.has(p.value))return!1;return!0},L=function(t){for(var r,e,u=n(f(t).tuples());!(e=u()).done;){var o=e.value;if(r)return c("More than one tuple found");r=o}return r||c("Relation is empty")},Q=function(t,r,e){for(var u,o={},a=n(f(t).tuples());!(u=a()).done;){var i=u.value;o[""+i[e]]=i[r]}return o};function W(t){return new u(t)}W.isRelation=o;export{W as Bmg,j as allbut,F as autowrap,y as constants,z as cross_join,z as cross_product,d as exclude,O as extend,T as group,I as image,x as intersect,K as isEqual,o as isRelation,_ as join,J as left_join,N as matching,A as minus,k as not_matching,L as one,b as prefix,m as project,g as rename,h as restrict,w as suffix,q as summarize,G as transform,X as ungroup,S as union,D as unwrap,h as where,$ as wrap,Q as yByX};
2
+ //# sourceMappingURL=bmg.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bmg.module.js","sources":["../src/support/toPredicateFunc.ts","../src/Relation/Memory.ts","../src/operators/isRelation.ts","../src/operators/_helpers.ts","../src/operators/restrict.ts","../src/operators/exclude.ts","../src/operators/constants.ts","../src/operators/rename.ts","../src/operators/prefix.ts","../src/operators/suffix.ts","../src/operators/project.ts","../src/operators/allbut.ts","../src/operators/extend.ts","../src/operators/union.ts","../src/operators/minus.ts","../src/operators/intersect.ts","../src/operators/matching.ts","../src/operators/not_matching.ts","../src/operators/join.ts","../src/operators/left_join.ts","../src/operators/cross_product.ts","../src/operators/image.ts","../src/operators/summarize.ts","../src/operators/group.ts","../src/operators/ungroup.ts","../src/operators/wrap.ts","../src/operators/unwrap.ts","../src/operators/autowrap.ts","../src/operators/transform.ts","../src/operators/isEqual.ts","../src/operators/one.ts","../src/operators/yByX.ts","../src/index.ts"],"sourcesContent":["import { Predicate, PredicateFunc, Tuple } from '../types';\n\nexport const toPredicateFunc = (p: Predicate): PredicateFunc => {\n if (typeof(p) === 'function') {\n return p as PredicateFunc;\n } else {\n const expected = p as Tuple;\n return (t: Tuple) => {\n return Object.keys(expected).every(k => t[k] === expected[k])\n }\n }\n}\n","import {\n allbut,\n autowrap,\n constants,\n cross_product,\n exclude,\n extend,\n group,\n image,\n intersect,\n isEqual,\n join,\n left_join,\n matching,\n minus,\n not_matching,\n one,\n prefix,\n project,\n rename,\n restrict,\n suffix,\n summarize,\n where,\n transform,\n ungroup,\n union,\n unwrap,\n wrap,\n yByX,\n} from \"../operators\";\nimport type {\n AttrName,\n AutowrapOptions,\n JoinKeys,\n Relation,\n RelationOperand,\n Transformation,\n Tuple,\n TypedPredicate,\n TypedExtension,\n RenameMap,\n Renamed,\n Prefixed,\n Suffixed,\n Joined,\n LeftJoined,\n Wrapped,\n Unwrapped,\n Ungrouped,\n} from \"../types\";\nimport type { AggregatorResults } from \"../utility-types\";\n\n/**\n * In-memory implementation of the Relation interface.\n *\n * @typeParam T - The tuple type for this relation. Defaults to `Tuple` (Record<string, unknown>).\n */\nexport class MemoryRelation<T = Tuple> implements Relation<T> {\n\n constructor(private tuples: T[]) {\n this.tuples = tuples;\n }\n\n // === Type-preserving operators ===\n\n restrict(p: TypedPredicate<T>): Relation<T> {\n return restrict(this as any, p as any) as unknown as Relation<T>;\n }\n\n where(p: TypedPredicate<T>): Relation<T> {\n return where(this as any, p as any) as unknown as Relation<T>;\n }\n\n exclude(p: TypedPredicate<T>): Relation<T> {\n return exclude(this as any, p as any) as unknown as Relation<T>;\n }\n\n // === Projection operators ===\n\n project<K extends keyof T>(attrs: K[]): Relation<Pick<T, K>> {\n return project(this as any, attrs as AttrName[]) as unknown as Relation<Pick<T, K>>;\n }\n\n allbut<K extends keyof T>(attrs: K[]): Relation<Omit<T, K>> {\n return allbut(this as any, attrs as AttrName[]) as unknown as Relation<Omit<T, K>>;\n }\n\n // === Extension operators ===\n\n extend<E extends Record<string, unknown>>(e: TypedExtension<T, E>): Relation<T & E> {\n return extend(this as any, e as any) as unknown as Relation<T & E>;\n }\n\n constants<C extends Tuple>(consts: C): Relation<T & C> {\n return constants(this as any, consts) as unknown as Relation<T & C>;\n }\n\n // === Rename operators ===\n\n rename<R extends RenameMap<T>>(r: R): Relation<Renamed<T, R>> {\n return rename(this as any, r as any) as unknown as Relation<Renamed<T, R>>;\n }\n\n prefix<P extends string, Ex extends keyof T = never>(pfx: P, options?: { except?: Ex[] }): Relation<Prefixed<T, P, Ex>> {\n return prefix(this as any, pfx, options as any) as unknown as Relation<Prefixed<T, P, Ex>>;\n }\n\n suffix<S extends string, Ex extends keyof T = never>(sfx: S, options?: { except?: Ex[] }): Relation<Suffixed<T, S, Ex>> {\n return suffix(this as any, sfx, options as any) as unknown as Relation<Suffixed<T, S, Ex>>;\n }\n\n // === Set operators ===\n\n union(right: RelationOperand<T>): Relation<T> {\n return union(this as any, right as any) as unknown as Relation<T>;\n }\n\n minus(right: RelationOperand<T>): Relation<T> {\n return minus(this as any, right as any) as unknown as Relation<T>;\n }\n\n intersect(right: RelationOperand<T>): Relation<T> {\n return intersect(this as any, right as any) as unknown as Relation<T>;\n }\n\n // === Semi-join operators ===\n\n matching<R>(right: RelationOperand<R>, keys?: JoinKeys): Relation<T> {\n return matching(this as any, right as any, keys) as unknown as Relation<T>;\n }\n\n not_matching<R>(right: RelationOperand<R>, keys?: JoinKeys): Relation<T> {\n return not_matching(this as any, right as any, keys) as unknown as Relation<T>;\n }\n\n // === Join operators ===\n\n join<R>(right: RelationOperand<R>, keys?: JoinKeys): Relation<Joined<T, R>> {\n return join(this as any, right as any, keys) as unknown as Relation<Joined<T, R>>;\n }\n\n left_join<R>(right: RelationOperand<R>, keys?: JoinKeys): Relation<LeftJoined<T, R>> {\n return left_join(this as any, right as any, keys) as unknown as Relation<LeftJoined<T, R>>;\n }\n\n cross_product<R>(right: RelationOperand<R>): Relation<T & R> {\n return cross_product(this as any, right as any) as unknown as Relation<T & R>;\n }\n\n cross_join<R>(right: RelationOperand<R>): Relation<T & R> {\n return cross_product(this as any, right as any) as unknown as Relation<T & R>;\n }\n\n // === Nesting operators ===\n\n image<R, As extends string>(right: RelationOperand<R>, as: As, keys?: JoinKeys): Relation<T & Record<As, Relation<Omit<R, keyof T & keyof R>>>> {\n return image(this as any, right as any, as, keys) as unknown as Relation<T & Record<As, Relation<Omit<R, keyof T & keyof R>>>>;\n }\n\n group<K extends keyof T, As extends string>(attrs: K[], as: As): Relation<Omit<T, K> & Record<As, Relation<Pick<T, K>>>> {\n return group(this as any, attrs as AttrName[], as) as unknown as Relation<Omit<T, K> & Record<As, Relation<Pick<T, K>>>>;\n }\n\n ungroup<K extends keyof T>(attr: K): Relation<Ungrouped<T, K>> {\n return ungroup(this as any, attr as AttrName) as unknown as Relation<Ungrouped<T, K>>;\n }\n\n wrap<K extends keyof T, As extends string>(attrs: K[], as: As): Relation<Wrapped<T, K, As>> {\n return wrap(this as any, attrs as AttrName[], as) as unknown as Relation<Wrapped<T, K, As>>;\n }\n\n unwrap<K extends keyof T>(attr: K): Relation<Unwrapped<T, K>> {\n return unwrap(this as any, attr as AttrName) as unknown as Relation<Unwrapped<T, K>>;\n }\n\n // === Aggregation ===\n\n summarize<By extends keyof T, Aggs extends Record<string, unknown>>(by: By[], aggs: Aggs): Relation<Pick<T, By> & AggregatorResults<Aggs>> {\n return summarize(this as any, by as AttrName[], aggs as any) as unknown as Relation<Pick<T, By> & AggregatorResults<Aggs>>;\n }\n\n // === Transform ===\n\n transform(t: Transformation): Relation<T> {\n return transform(this as any, t) as unknown as Relation<T>;\n }\n\n // === Dynamic ===\n\n autowrap(options?: AutowrapOptions): Relation<Tuple> {\n return autowrap(this as any, options) as Relation<Tuple>;\n }\n\n // === Non-relational ===\n\n one(): T {\n return one(this as any) as T;\n }\n\n toArray(): T[] {\n return this.tuples;\n }\n\n yByX<Y extends keyof T, X extends keyof T>(y: Y, x: X): Record<T[X] & PropertyKey, T[Y]> {\n return yByX(this as any, y as AttrName, x as AttrName) as Record<T[X] & PropertyKey, T[Y]>;\n }\n\n isEqual(right: any): boolean {\n return isEqual(this as any, right as any);\n }\n\n}\n","import { MemoryRelation } from \"@/Relation\";\n\nexport const isRelation = (op) => {\n return op != null && op.constructor === MemoryRelation;\n}\n","import { OperationalOperand, Relation, RelationOperand, Renaming, RenamingFunc, Tuple, JoinKeys, AttrName } from \"@/types\";\nimport { MemoryRelation } from '@/Relation';\nimport { isRelation } from \"./isRelation\";\n\nconst valueKey = (value: unknown): unknown => {\n if (isRelation(value)) {\n // For nested relations, convert to sorted array of tuple keys for comparison\n const tuples = (value as Relation).toArray();\n const keys = tuples.map(t => tupleKey(t)).sort();\n return keys;\n }\n return value;\n}\n\n/**\n * Generates a unique string key for a tuple, used for equality comparison and deduplication.\n * Handles nested relations by converting them to sorted tuple keys.\n *\n * @example\n * tupleKey({ name: 'Alice', age: 30 })\n * // => '[[\"age\",30],[\"name\",\"Alice\"]]'\n *\n * @example\n * tupleKey({ id: 1, items: Bmg([{ x: 1 }, { x: 2 }]) })\n * // => '[[\"id\",1],[\"items\",[...]]]' (nested relation converted to sorted keys)\n */\nexport const tupleKey = (tuple: Tuple): string => {\n const entries = Object.entries(tuple).map(([k, v]) => [k, valueKey(v)]);\n return JSON.stringify(entries.sort(([a], [b]) => (a as string).localeCompare(b as string)));\n}\n\n/**\n * Removes duplicate tuples from an array, preserving order of first occurrence.\n * Uses tupleKey() for equality comparison.\n *\n * @example\n * deduplicate([\n * { id: 1, name: 'Alice' },\n * { id: 2, name: 'Bob' },\n * { id: 1, name: 'Alice' }, // duplicate\n * ])\n * // => [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }]\n */\nexport const deduplicate = (tuples: Tuple[]): Tuple[] => {\n const seen = new Set<string>();\n const result: Tuple[] = [];\n for (const tuple of tuples) {\n const key = tupleKey(tuple);\n if (!seen.has(key)) {\n seen.add(key);\n result.push(tuple);\n }\n }\n return result;\n}\n\n/**\n * Converts a RelationOperand (Relation or Tuple[]) to an OperationalOperand\n * that provides a uniform interface for iteration and output.\n *\n * @example\n * // With array input, output remains array\n * const op = toOperationalOperand([{ id: 1 }]);\n * [...op.tuples()]; // => [{ id: 1 }]\n * op.output([{ id: 2 }]); // => [{ id: 2 }]\n *\n * @example\n * // With Relation input, output is a new Relation\n * const op = toOperationalOperand(Bmg([{ id: 1 }]));\n * [...op.tuples()]; // => [{ id: 1 }]\n * op.output([{ id: 2 }]); // => Bmg([{ id: 2 }])\n */\nexport const toOperationalOperand = (operand: RelationOperand): OperationalOperand => {\n if (Array.isArray(operand)) {\n return {\n tuples: () => operand,\n output: (tuples) => tuples,\n };\n } else if (isRelation(operand)) {\n return {\n tuples: () => (operand as Relation).toArray(),\n output: (tuples) => new MemoryRelation(tuples),\n };\n } else {\n throw `Unable to iterate ${operand}`\n }\n}\n\n/**\n * Converts a Renaming (object or function) to a RenamingFunc.\n *\n * @example\n * // Object renaming\n * const fn = toRenamingFunc({ name: 'fullName', age: 'years' });\n * fn('name'); // => 'fullName'\n * fn('age'); // => 'years'\n * fn('other'); // => 'other' (unchanged)\n *\n * @example\n * // Function renaming (passed through)\n * const fn = toRenamingFunc(attr => attr.toUpperCase());\n * fn('name'); // => 'NAME'\n */\nexport const toRenamingFunc = (renaming: Renaming): RenamingFunc => {\n if (typeof(renaming) === 'function') {\n return renaming;\n } else {\n return (attr) => renaming[attr] || attr;\n }\n}\n\nexport const error = (msg: string) => {\n throw(msg);\n}\n\n// Join helpers\n\n/**\n * Finds attribute names that exist in both left and right tuple arrays.\n * Used for natural joins when no explicit keys are provided.\n *\n * @example\n * const left = [{ id: 1, name: 'Alice', city: 'NYC' }];\n * const right = [{ city: 'NYC', country: 'USA' }];\n * getCommonAttrs(left, right);\n * // => ['city']\n *\n * @example\n * const left = [{ a: 1, b: 2 }];\n * const right = [{ b: 2, c: 3 }];\n * getCommonAttrs(left, right);\n * // => ['b']\n */\nexport const getCommonAttrs = (left: Tuple[], right: Tuple[]): AttrName[] => {\n if (left.length === 0 || right.length === 0) return [];\n const leftAttrs = new Set(Object.keys(left[0]));\n const rightAttrs = Object.keys(right[0]);\n return rightAttrs.filter(attr => leftAttrs.has(attr));\n}\n\n/**\n * Normalizes JoinKeys to a Record<AttrName, AttrName> mapping left attrs to right attrs.\n *\n * @example\n * // undefined => use common attributes\n * normalizeKeys(undefined, [{ id: 1, city: 'NYC' }], [{ city: 'NYC' }]);\n * // => { city: 'city' }\n *\n * @example\n * // Array of common attribute names\n * normalizeKeys(['city', 'country'], leftTuples, rightTuples);\n * // => { city: 'city', country: 'country' }\n *\n * @example\n * // Object mapping left attr to right attr\n * normalizeKeys({ city: 'location' }, leftTuples, rightTuples);\n * // => { city: 'location' }\n */\nexport const normalizeKeys = (keys: JoinKeys | undefined, leftTuples: Tuple[], rightTuples: Tuple[]): Record<AttrName, AttrName> => {\n if (!keys) {\n const common = getCommonAttrs(leftTuples, rightTuples);\n return common.reduce((acc, attr) => {\n acc[attr] = attr;\n return acc;\n }, {} as Record<AttrName, AttrName>);\n }\n if (Array.isArray(keys)) {\n return keys.reduce((acc, attr) => {\n acc[attr] = attr;\n return acc;\n }, {} as Record<AttrName, AttrName>);\n }\n return keys;\n}\n\n/**\n * Checks if two tuples match on the specified key mapping.\n *\n * @example\n * const keyMap = { city: 'location' };\n * tuplesMatch({ id: 1, city: 'NYC' }, { location: 'NYC', pop: 8 }, keyMap);\n * // => true (left.city === right.location)\n *\n * @example\n * const keyMap = { city: 'city' };\n * tuplesMatch({ city: 'NYC' }, { city: 'LA' }, keyMap);\n * // => false\n */\nexport const tuplesMatch = (left: Tuple, right: Tuple, keyMap: Record<AttrName, AttrName>): boolean => {\n for (const [leftAttr, rightAttr] of Object.entries(keyMap)) {\n if (left[leftAttr] !== right[rightAttr]) return false;\n }\n return true;\n}\n\n/**\n * Creates a string key from a tuple's join attributes for fast Set-based lookups.\n * Used by matching/not_matching for efficient semi-join operations.\n *\n * @example\n * const keyMap = { first: 'fname', last: 'lname' };\n *\n * // Left side uses left attr names (keys of keyMap)\n * matchKey({ id: 1, first: 'John', last: 'Doe' }, keyMap, 'left');\n * // => '\"John\"|\"Doe\"'\n *\n * // Right side uses right attr names (values of keyMap)\n * matchKey({ fname: 'John', lname: 'Doe', age: 30 }, keyMap, 'right');\n * // => '\"John\"|\"Doe\"'\n */\nexport const matchKey = (tuple: Tuple, keyMap: Record<AttrName, AttrName>, side: 'left' | 'right'): string => {\n const attrs = side === 'left' ? Object.keys(keyMap) : Object.values(keyMap);\n const values = attrs.map(attr => JSON.stringify(tuple[attr]));\n return values.join('|');\n}\n\n/**\n * Removes join key attributes from a right tuple when merging.\n * Used to avoid duplicate columns in join results.\n *\n * @example\n * const keyMap = { city: 'location' };\n * projectOutKeys({ location: 'NYC', country: 'USA', pop: 8 }, keyMap);\n * // => { country: 'USA', pop: 8 } (location removed)\n *\n * @example\n * const keyMap = { a: 'a', b: 'b' };\n * projectOutKeys({ a: 1, b: 2, c: 3 }, keyMap);\n * // => { c: 3 } (a and b removed)\n */\nexport const projectOutKeys = (tuple: Tuple, keyMap: Record<AttrName, AttrName>): Tuple => {\n const rightKeys = new Set(Object.values(keyMap));\n const result: Tuple = {};\n for (const [attr, value] of Object.entries(tuple)) {\n if (!rightKeys.has(attr)) {\n result[attr] = value;\n }\n }\n return result;\n}\n","import { toPredicateFunc } from \"../support/toPredicateFunc\";\nimport { RelationOperand, Predicate, Tuple } from \"../types\";\nimport { toOperationalOperand } from \"./_helpers\";\n\nexport const restrict = (operand: RelationOperand, p: Predicate): RelationOperand => {\n const op = toOperationalOperand(operand);\n const iterable = op.tuples();\n const f = toPredicateFunc(p)\n const kept: Tuple[] = [];\n for (const tuple of iterable) {\n if (f(tuple)) kept.push(tuple);\n }\n return op.output(kept)\n}\n","import { toPredicateFunc } from \"../support/toPredicateFunc\";\nimport { RelationOperand, Predicate, Tuple } from \"../types\";\nimport { toOperationalOperand } from \"./_helpers\";\n\nexport const exclude = (operand: RelationOperand, p: Predicate): RelationOperand => {\n const op = toOperationalOperand(operand);\n const iterable = op.tuples();\n const f = toPredicateFunc(p)\n const kept: Tuple[] = [];\n for (const tuple of iterable) {\n if (!f(tuple)) kept.push(tuple);\n }\n return op.output(kept)\n}\n","import { RelationOperand, Tuple } from \"../types\";\nimport { toOperationalOperand } from \"./_helpers\";\n\nexport const constants = (operand: RelationOperand, consts: Tuple): RelationOperand => {\n const op = toOperationalOperand(operand);\n const iterable = op.tuples();\n const result: Tuple[] = [];\n for (const tuple of iterable) {\n result.push({ ...tuple, ...consts });\n }\n return op.output(result)\n}\n","import { RelationOperand, Renaming, Tuple } from \"../types\";\nimport { toOperationalOperand, toRenamingFunc } from \"./_helpers\";\n\nexport const rename = (operand: RelationOperand, renaming: Renaming): RelationOperand => {\n const op = toOperationalOperand(operand);\n const iterable = op.tuples();\n const renamingFunc = toRenamingFunc(renaming)\n const result: Tuple[] = [];\n for (const tuple of iterable) {\n const renamed = Object.keys(tuple).reduce((memo, attr) => {\n memo[renamingFunc(attr)] = tuple[attr];\n return memo;\n }, {})\n result.push(renamed);\n }\n return op.output(result)\n}\n","import { PrefixOptions, RelationOperand } from \"../types\";\nimport { rename } from \"./rename\";\n\nexport const prefix = (operand: RelationOperand, pfx: string, options?: PrefixOptions): RelationOperand => {\n const except = new Set(options?.except ?? []);\n return rename(operand, (attr) => except.has(attr) ? attr : `${pfx}${attr}`);\n}\n","import { RelationOperand, SuffixOptions } from \"../types\";\nimport { rename } from \"./rename\";\n\nexport const suffix = (operand: RelationOperand, sfx: string, options?: SuffixOptions): RelationOperand => {\n const except = new Set(options?.except ?? []);\n return rename(operand, (attr) => except.has(attr) ? attr : `${attr}${sfx}`);\n}\n","import { RelationOperand, AttrName, Tuple } from \"../types\";\nimport { toOperationalOperand, deduplicate } from \"./_helpers\";\n\nexport const project = (operand: RelationOperand, attrs: AttrName[]): RelationOperand => {\n const op = toOperationalOperand(operand);\n const iterable = op.tuples();\n const result: Tuple[] = [];\n for (const tuple of iterable) {\n const projected = attrs.reduce((memo, attr) => {\n if (attr in tuple) {\n memo[attr] = tuple[attr];\n }\n return memo;\n }, {} as Tuple);\n result.push(projected);\n }\n return op.output(deduplicate(result));\n}\n","import { RelationOperand, AttrName, Tuple } from \"../types\";\nimport { toOperationalOperand, deduplicate } from \"./_helpers\";\n\nexport const allbut = (operand: RelationOperand, attrs: AttrName[]): RelationOperand => {\n const op = toOperationalOperand(operand);\n const iterable = op.tuples();\n const excluded = new Set(attrs);\n const result: Tuple[] = [];\n for (const tuple of iterable) {\n const projected = Object.keys(tuple).reduce((memo, attr) => {\n if (!excluded.has(attr)) {\n memo[attr] = tuple[attr];\n }\n return memo;\n }, {} as Tuple);\n result.push(projected);\n }\n return op.output(deduplicate(result));\n}\n","import { RelationOperand, Extension, Tuple } from \"../types\";\nimport { toOperationalOperand } from \"./_helpers\";\n\nexport const extend = (operand: RelationOperand, extension: Extension): RelationOperand => {\n const op = toOperationalOperand(operand);\n const iterable = op.tuples();\n const result: Tuple[] = [];\n for (const tuple of iterable) {\n const extended = { ...tuple };\n for (const [attr, spec] of Object.entries(extension)) {\n if (typeof spec === 'function') {\n extended[attr] = spec(tuple);\n } else {\n extended[attr] = tuple[spec];\n }\n }\n result.push(extended);\n }\n return op.output(result);\n}\n","import { RelationOperand, Tuple } from \"../types\";\nimport { toOperationalOperand, tupleKey } from \"./_helpers\";\n\nexport const union = (left: RelationOperand, right: RelationOperand): RelationOperand => {\n const opLeft = toOperationalOperand(left);\n const opRight = toOperationalOperand(right);\n const seen = new Set<string>();\n const result: Tuple[] = [];\n\n for (const tuple of opLeft.tuples()) {\n const key = tupleKey(tuple);\n if (!seen.has(key)) {\n seen.add(key);\n result.push(tuple);\n }\n }\n\n for (const tuple of opRight.tuples()) {\n const key = tupleKey(tuple);\n if (!seen.has(key)) {\n seen.add(key);\n result.push(tuple);\n }\n }\n\n return opLeft.output(result);\n}\n","import { RelationOperand, Tuple } from \"../types\";\nimport { toOperationalOperand, tupleKey } from \"./_helpers\";\n\nexport const minus = (left: RelationOperand, right: RelationOperand): RelationOperand => {\n const opLeft = toOperationalOperand(left);\n const opRight = toOperationalOperand(right);\n\n const rightKeys = new Set<string>();\n for (const tuple of opRight.tuples()) {\n rightKeys.add(tupleKey(tuple));\n }\n\n const seen = new Set<string>();\n const result: Tuple[] = [];\n for (const tuple of opLeft.tuples()) {\n const key = tupleKey(tuple);\n if (!rightKeys.has(key) && !seen.has(key)) {\n seen.add(key);\n result.push(tuple);\n }\n }\n\n return opLeft.output(result);\n}\n","import { RelationOperand, Tuple } from \"../types\";\nimport { toOperationalOperand, tupleKey } from \"./_helpers\";\n\nexport const intersect = (left: RelationOperand, right: RelationOperand): RelationOperand => {\n const opLeft = toOperationalOperand(left);\n const opRight = toOperationalOperand(right);\n\n const rightKeys = new Set<string>();\n for (const tuple of opRight.tuples()) {\n rightKeys.add(tupleKey(tuple));\n }\n\n const seen = new Set<string>();\n const result: Tuple[] = [];\n for (const tuple of opLeft.tuples()) {\n const key = tupleKey(tuple);\n if (rightKeys.has(key) && !seen.has(key)) {\n seen.add(key);\n result.push(tuple);\n }\n }\n\n return opLeft.output(result);\n}\n","import { RelationOperand, JoinKeys, Tuple } from \"../types\";\nimport { toOperationalOperand, normalizeKeys, matchKey } from \"./_helpers\";\n\nexport const matching = (left: RelationOperand, right: RelationOperand, keys?: JoinKeys): RelationOperand => {\n const opLeft = toOperationalOperand(left);\n const opRight = toOperationalOperand(right);\n const leftTuples = [...opLeft.tuples()];\n const rightTuples = [...opRight.tuples()];\n const keyMap = normalizeKeys(keys, leftTuples, rightTuples);\n\n const rightKeys = new Set<string>();\n for (const tuple of rightTuples) {\n rightKeys.add(matchKey(tuple, keyMap, 'right'));\n }\n\n const result: Tuple[] = [];\n for (const tuple of leftTuples) {\n if (rightKeys.has(matchKey(tuple, keyMap, 'left'))) {\n result.push(tuple);\n }\n }\n\n return opLeft.output(result);\n}\n","import { RelationOperand, JoinKeys, Tuple } from \"../types\";\nimport { toOperationalOperand, normalizeKeys, matchKey } from \"./_helpers\";\n\nexport const not_matching = (left: RelationOperand, right: RelationOperand, keys?: JoinKeys): RelationOperand => {\n const opLeft = toOperationalOperand(left);\n const opRight = toOperationalOperand(right);\n const leftTuples = [...opLeft.tuples()];\n const rightTuples = [...opRight.tuples()];\n const keyMap = normalizeKeys(keys, leftTuples, rightTuples);\n\n const rightKeys = new Set<string>();\n for (const tuple of rightTuples) {\n rightKeys.add(matchKey(tuple, keyMap, 'right'));\n }\n\n const result: Tuple[] = [];\n for (const tuple of leftTuples) {\n if (!rightKeys.has(matchKey(tuple, keyMap, 'left'))) {\n result.push(tuple);\n }\n }\n\n return opLeft.output(result);\n}\n","import { RelationOperand, JoinKeys, Tuple, AttrName } from \"../types\";\nimport { toOperationalOperand, normalizeKeys, tuplesMatch, projectOutKeys } from \"./_helpers\";\n\nconst mergeTuples = (left: Tuple, right: Tuple, keyMap: Record<AttrName, AttrName>): Tuple => {\n return { ...left, ...projectOutKeys(right, keyMap) };\n}\n\nexport const join = (left: RelationOperand, right: RelationOperand, keys?: JoinKeys): RelationOperand => {\n const opLeft = toOperationalOperand(left);\n const opRight = toOperationalOperand(right);\n const leftTuples = [...opLeft.tuples()];\n const rightTuples = [...opRight.tuples()];\n const keyMap = normalizeKeys(keys, leftTuples, rightTuples);\n const result: Tuple[] = [];\n\n for (const leftTuple of leftTuples) {\n for (const rightTuple of rightTuples) {\n if (tuplesMatch(leftTuple, rightTuple, keyMap)) {\n result.push(mergeTuples(leftTuple, rightTuple, keyMap));\n }\n }\n }\n\n return opLeft.output(result);\n}\n","import { RelationOperand, JoinKeys, Tuple, AttrName } from \"../types\";\nimport { toOperationalOperand, normalizeKeys, tuplesMatch } from \"./_helpers\";\n\nconst getRightAttrs = (rightTuples: Tuple[], keyMap: Record<AttrName, AttrName>): AttrName[] => {\n if (rightTuples.length === 0) return [];\n const rightKeys = new Set(Object.values(keyMap));\n return Object.keys(rightTuples[0]).filter(attr => !rightKeys.has(attr));\n}\n\nconst mergeTuples = (left: Tuple, right: Tuple | null, rightAttrs: AttrName[]): Tuple => {\n const result = { ...left };\n for (const attr of rightAttrs) {\n result[attr] = right ? right[attr] : null;\n }\n return result;\n}\n\nexport const left_join = (left: RelationOperand, right: RelationOperand, keys?: JoinKeys): RelationOperand => {\n const opLeft = toOperationalOperand(left);\n const opRight = toOperationalOperand(right);\n const leftTuples = [...opLeft.tuples()];\n const rightTuples = [...opRight.tuples()];\n const keyMap = normalizeKeys(keys, leftTuples, rightTuples);\n const rightAttrs = getRightAttrs(rightTuples, keyMap);\n const result: Tuple[] = [];\n\n for (const leftTuple of leftTuples) {\n let matched = false;\n for (const rightTuple of rightTuples) {\n if (tuplesMatch(leftTuple, rightTuple, keyMap)) {\n result.push(mergeTuples(leftTuple, rightTuple, rightAttrs));\n matched = true;\n }\n }\n if (!matched) {\n result.push(mergeTuples(leftTuple, null, rightAttrs));\n }\n }\n\n return opLeft.output(result);\n}\n","import { RelationOperand, Tuple } from \"../types\";\nimport { toOperationalOperand, deduplicate } from \"./_helpers\";\n\nexport const cross_product = (left: RelationOperand, right: RelationOperand): RelationOperand => {\n const opLeft = toOperationalOperand(left);\n const opRight = toOperationalOperand(right);\n const leftTuples = [...opLeft.tuples()];\n const rightTuples = [...opRight.tuples()];\n const result: Tuple[] = [];\n\n for (const l of leftTuples) {\n for (const r of rightTuples) {\n result.push({ ...r, ...l });\n }\n }\n\n return opLeft.output(deduplicate(result));\n}\n\nexport { cross_product as cross_join };\n","import { RelationOperand, JoinKeys, Tuple, AttrName } from \"../types\";\nimport { toOperationalOperand, normalizeKeys, tuplesMatch, projectOutKeys } from \"./_helpers\";\nimport { MemoryRelation } from \"@/Relation\";\n\nexport const image = (left: RelationOperand, right: RelationOperand, as: AttrName, keys?: JoinKeys): RelationOperand => {\n const opLeft = toOperationalOperand(left);\n const opRight = toOperationalOperand(right);\n const leftTuples = [...opLeft.tuples()];\n const rightTuples = [...opRight.tuples()];\n const keyMap = normalizeKeys(keys, leftTuples, rightTuples);\n const result: Tuple[] = [];\n\n for (const leftTuple of leftTuples) {\n const matches: Tuple[] = [];\n for (const rightTuple of rightTuples) {\n if (tuplesMatch(leftTuple, rightTuple, keyMap)) {\n matches.push(projectOutKeys(rightTuple, keyMap));\n }\n }\n result.push({\n ...leftTuple,\n [as]: new MemoryRelation(matches)\n });\n }\n\n return opLeft.output(result);\n}\n","import { RelationOperand, AttrName, Tuple, Aggregator, Aggregators } from \"../types\";\nimport { toOperationalOperand } from \"./_helpers\";\n\nconst groupKey = (tuple: Tuple, by: AttrName[]): string => {\n const keyParts = by.map(attr => JSON.stringify(tuple[attr]));\n return keyParts.join('|');\n}\n\nconst pickAttrs = (tuple: Tuple, attrs: AttrName[]): Tuple => {\n return attrs.reduce((acc, attr) => {\n acc[attr] = tuple[attr];\n return acc;\n }, {} as Tuple);\n}\n\nconst applyAggregator = (tuples: Tuple[], agg: Aggregator): unknown => {\n if (typeof agg === 'function') {\n return agg(tuples);\n }\n\n const spec = typeof agg === 'string' ? { op: agg, attr: '' } : agg;\n const { op, attr } = spec;\n\n switch (op) {\n case 'count':\n return tuples.length;\n\n case 'sum': {\n return tuples.reduce((sum, t) => sum + (Number(t[attr]) || 0), 0);\n }\n\n case 'min': {\n const values = tuples.map(t => t[attr]).filter(v => v !== undefined && v !== null);\n return values.length > 0 ? Math.min(...values.map(Number)) : null;\n }\n\n case 'max': {\n const values = tuples.map(t => t[attr]).filter(v => v !== undefined && v !== null);\n return values.length > 0 ? Math.max(...values.map(Number)) : null;\n }\n\n case 'avg': {\n const values = tuples.map(t => Number(t[attr])).filter(v => !isNaN(v));\n return values.length > 0 ? values.reduce((a, b) => a + b, 0) / values.length : null;\n }\n\n case 'collect': {\n return tuples.map(t => t[attr]);\n }\n\n default:\n throw new Error(`Unknown aggregator: ${op}`);\n }\n}\n\nexport const summarize = (\n operand: RelationOperand,\n by: AttrName[],\n aggs: Aggregators\n): RelationOperand => {\n const op = toOperationalOperand(operand);\n const tuples = [...op.tuples()];\n\n // Group tuples\n const groups = new Map<string, Tuple[]>();\n for (const tuple of tuples) {\n const key = groupKey(tuple, by);\n if (!groups.has(key)) {\n groups.set(key, []);\n }\n groups.get(key)!.push(tuple);\n }\n\n // Apply aggregators to each group\n const result: Tuple[] = [];\n for (const groupTuples of groups.values()) {\n const row: Tuple = pickAttrs(groupTuples[0], by);\n for (const [resultAttr, agg] of Object.entries(aggs)) {\n row[resultAttr] = applyAggregator(groupTuples, agg);\n }\n result.push(row);\n }\n\n return op.output(result);\n}\n","import { RelationOperand, AttrName, Tuple } from \"../types\";\nimport { toOperationalOperand } from \"./_helpers\";\nimport { MemoryRelation } from \"@/Relation\";\n\nconst groupKey = (tuple: Tuple, byAttrs: AttrName[]): string => {\n const keyParts = byAttrs.map(attr => JSON.stringify(tuple[attr]));\n return keyParts.join('|');\n}\n\nconst pickAttrs = (tuple: Tuple, attrs: AttrName[]): Tuple => {\n return attrs.reduce((acc, attr) => {\n acc[attr] = tuple[attr];\n return acc;\n }, {} as Tuple);\n}\n\nexport const group = (operand: RelationOperand, attrs: AttrName[], as: AttrName): RelationOperand => {\n const op = toOperationalOperand(operand);\n const tuples = [...op.tuples()];\n\n if (tuples.length === 0) {\n return op.output([]);\n }\n\n // Determine which attributes to keep at the top level (all except grouped ones)\n const allAttrs = Object.keys(tuples[0]);\n const groupedSet = new Set(attrs);\n const byAttrs = allAttrs.filter(a => !groupedSet.has(a));\n\n // Group tuples\n const groups = new Map<string, { base: Tuple, nested: Tuple[] }>();\n for (const tuple of tuples) {\n const key = groupKey(tuple, byAttrs);\n if (!groups.has(key)) {\n groups.set(key, {\n base: pickAttrs(tuple, byAttrs),\n nested: []\n });\n }\n groups.get(key)!.nested.push(pickAttrs(tuple, attrs));\n }\n\n // Build result with nested relations\n const result: Tuple[] = [];\n for (const { base, nested } of groups.values()) {\n result.push({\n ...base,\n [as]: new MemoryRelation(nested)\n });\n }\n\n return op.output(result);\n}\n","import { RelationOperand, AttrName, Tuple, Relation } from \"../types\";\nimport { toOperationalOperand } from \"./_helpers\";\nimport { isRelation } from \"./isRelation\";\n\nconst toTupleArray = (value: unknown): Tuple[] => {\n if (isRelation(value)) {\n return (value as Relation).toArray();\n }\n if (Array.isArray(value)) {\n return value;\n }\n throw new Error(`Value is not a relation or array`);\n}\n\nexport const ungroup = (operand: RelationOperand, attr: AttrName): RelationOperand => {\n const op = toOperationalOperand(operand);\n const tuples = [...op.tuples()];\n const result: Tuple[] = [];\n\n for (const tuple of tuples) {\n const nested = toTupleArray(tuple[attr]);\n\n // Get base attributes (all except the grouped one)\n const base: Tuple = {};\n for (const [key, value] of Object.entries(tuple)) {\n if (key !== attr) {\n base[key] = value;\n }\n }\n\n // Flatten each nested tuple\n for (const nestedTuple of nested) {\n result.push({\n ...base,\n ...nestedTuple\n });\n }\n }\n\n return op.output(result);\n}\n","import { RelationOperand, AttrName, Tuple } from \"../types\";\nimport { toOperationalOperand } from \"./_helpers\";\n\nexport const wrap = (operand: RelationOperand, attrs: AttrName[], as: AttrName): RelationOperand => {\n const op = toOperationalOperand(operand);\n const iterable = op.tuples();\n const wrappedSet = new Set(attrs);\n const result: Tuple[] = [];\n\n for (const tuple of iterable) {\n const wrapped: Tuple = {};\n const remaining: Tuple = {};\n\n for (const [key, value] of Object.entries(tuple)) {\n if (wrappedSet.has(key)) {\n wrapped[key] = value;\n } else {\n remaining[key] = value;\n }\n }\n\n result.push({\n ...remaining,\n [as]: wrapped\n });\n }\n\n return op.output(result);\n}\n","import { RelationOperand, AttrName, Tuple } from \"../types\";\nimport { toOperationalOperand } from \"./_helpers\";\n\nexport const unwrap = (operand: RelationOperand, attr: AttrName): RelationOperand => {\n const op = toOperationalOperand(operand);\n const iterable = op.tuples();\n const result: Tuple[] = [];\n\n for (const tuple of iterable) {\n const wrapped = tuple[attr] as Tuple;\n if (typeof wrapped !== 'object' || wrapped === null || Array.isArray(wrapped)) {\n throw new Error(`Attribute '${attr}' is not a tuple (object)`);\n }\n\n const unwrapped: Tuple = {};\n for (const [key, value] of Object.entries(tuple)) {\n if (key !== attr) {\n unwrapped[key] = value;\n }\n }\n\n result.push({\n ...unwrapped,\n ...wrapped\n });\n }\n\n return op.output(result);\n}\n","import { AutowrapOptions, RelationOperand, Tuple } from \"../types\";\nimport { toOperationalOperand } from \"./_helpers\";\n\nexport const autowrap = (operand: RelationOperand, options?: AutowrapOptions): RelationOperand => {\n const sep = options?.separator ?? '_';\n const op = toOperationalOperand(operand);\n const iterable = op.tuples();\n const result: Tuple[] = [];\n\n for (const tuple of iterable) {\n const wrapped: Tuple = {};\n for (const [attr, value] of Object.entries(tuple)) {\n const parts = attr.split(sep);\n if (parts.length === 1) {\n wrapped[attr] = value;\n } else {\n const [prefix, ...rest] = parts;\n wrapped[prefix] = wrapped[prefix] ?? {};\n (wrapped[prefix] as Tuple)[rest.join(sep)] = value;\n }\n }\n result.push(wrapped);\n }\n\n return op.output(result);\n}\n","import { RelationOperand, Transformation, Tuple } from \"../types\";\nimport { toOperationalOperand } from \"./_helpers\";\n\nexport const transform = (operand: RelationOperand, transformation: Transformation): RelationOperand => {\n const op = toOperationalOperand(operand);\n const iterable = op.tuples();\n const result: Tuple[] = [];\n\n for (const tuple of iterable) {\n const transformed: Tuple = {};\n\n for (const [attr, value] of Object.entries(tuple)) {\n transformed[attr] = applyTransformation(value, attr, transformation);\n }\n\n result.push(transformed);\n }\n\n return op.output(result);\n}\n\nconst applyTransformation = (value: unknown, attr: string, transformation: Transformation): unknown => {\n if (typeof transformation === 'function') {\n // Single function - apply to all values\n return transformation(value);\n } else if (Array.isArray(transformation)) {\n // Array of functions - chain them\n return transformation.reduce((v, fn) => fn(v), value);\n } else {\n // Object with attr-specific transformers\n const fn = transformation[attr];\n if (fn) {\n if (Array.isArray(fn)) {\n return fn.reduce((v, f) => f(v), value);\n }\n return fn(value);\n }\n return value;\n }\n}\n","import { RelationOperand } from \"../types\";\nimport { toOperationalOperand, tupleKey } from \"./_helpers\";\n\nexport const isEqual = (left: RelationOperand, right: RelationOperand): boolean => {\n const opLeft = toOperationalOperand(left);\n const opRight = toOperationalOperand(right);\n\n const leftKeys = new Set<string>();\n for (const tuple of opLeft.tuples()) {\n leftKeys.add(tupleKey(tuple));\n }\n\n const rightKeys = new Set<string>();\n for (const tuple of opRight.tuples()) {\n rightKeys.add(tupleKey(tuple));\n }\n\n if (leftKeys.size !== rightKeys.size) {\n return false;\n }\n\n for (const key of leftKeys) {\n if (!rightKeys.has(key)) {\n return false;\n }\n }\n\n return true;\n}\n","import { RelationOperand, Tuple } from \"../types\";\nimport { toOperationalOperand, error } from \"./_helpers\";\n\nexport const one = (operand: RelationOperand): Tuple => {\n const op = toOperationalOperand(operand);\n const iterable = op.tuples();\n let tuple;\n for (const t of iterable) {\n if (tuple) {\n return error('More than one tuple found');\n } else {\n tuple = t;\n }\n }\n if (tuple) return tuple;\n return error('Relation is empty');\n}\n","import { AttrName, RelationOperand, Tuple } from \"../types\";\nimport { toOperationalOperand } from \"./_helpers\";\n\nexport const yByX = (operand: RelationOperand, y: AttrName, x: AttrName): Tuple => {\n const op = toOperationalOperand(operand);\n const iterable = op.tuples();\n const hash = {};\n for (const tuple of iterable) {\n hash[`${tuple[x]}`] = tuple[y];\n }\n return hash;\n}\n","export * from './operators';\nexport * from './types';\nexport * from './utility-types';\n\nimport { MemoryRelation } from './Relation';\nimport { isRelation } from './operators';\n\n/**\n * Creates a new in-memory relation from an array of tuples.\n *\n * @typeParam T - The tuple type. Inferred from input or explicitly provided.\n *\n * @example\n * // Untyped usage (backwards compatible)\n * const r = Bmg([{ id: 1, name: 'Alice' }]);\n *\n * @example\n * // Typed usage with explicit type parameter\n * interface Person { id: number; name: string }\n * const r = Bmg<Person>([{ id: 1, name: 'Alice' }]);\n * r.project(['id']); // Autocomplete suggests 'id' | 'name'\n *\n * @example\n * // Type is inferred from input\n * const r = Bmg([{ id: 1, name: 'Alice' }] as const);\n */\nexport function Bmg<T>(tuples: T[]): MemoryRelation<T> {\n return new MemoryRelation<T>(tuples);\n}\n\nBmg.isRelation = isRelation;\n"],"names":["toPredicateFunc","p","expected","t","Object","keys","every","k","MemoryRelation","tuples","this","_proto","prototype","restrict","where","exclude","project","attrs","allbut","extend","e","constants","consts","rename","r","prefix","pfx","options","suffix","sfx","union","right","minus","intersect","matching","not_matching","join","left_join","cross_product","cross_join","image","as","group","ungroup","attr","wrap","unwrap","summarize","by","aggs","transform","autowrap","one","toArray","yByX","y","x","isEqual","isRelation","op","constructor","tupleKey","tuple","entries","map","_ref","v","value","sort","JSON","stringify","_ref2","_ref3","localeCompare","deduplicate","_step","seen","Set","result","_iterator","_createForOfIteratorHelperLoose","done","key","has","add","push","toOperationalOperand","operand","Array","isArray","output","error","msg","normalizeKeys","leftTuples","rightTuples","reduce","acc","left","length","leftAttrs","filter","getCommonAttrs","tuplesMatch","keyMap","_i","_Object$entries","_Object$entries$_i","matchKey","side","values","projectOutKeys","rightKeys","_i2","_Object$entries2","_Object$entries2$_i","iterable","f","kept","_extends","renaming","renamingFunc","toRenamingFunc","_loop","renamed","memo","_options$except","except","projected","excluded","extension","extended","spec","opLeft","opRight","_step2","_iterator2","concat","mergeTuples","leftTuple","rightTuple","rightAttrs","getRightAttrs","_step3","matched","_iterator3","l","_extends2","matches","groupKey","pickAttrs","applyAggregator","agg","sum","Number","Math","min","apply","max","isNaN","a","b","Error","groups","Map","set","get","groupTuples","row","byAttrs","allAttrs","groupedSet","base","nested","_step2$value","toTupleArray","wrappedSet","wrapped","remaining","unwrapped","_options$separator","sep","separator","parts","split","_wrapped$prefix","rest","_arrayLikeToArray","slice","transformation","transformed","applyTransformation","fn","leftKeys","size","hash","Bmg"],"mappings":"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"}