@doenet/doenetml 0.6.0-alpha1

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 (549) hide show
  1. package/.prettierrc +3 -0
  2. package/LICENSE +661 -0
  3. package/README.md +146 -0
  4. package/cypress/e2e/ActivityViewer/activityVariants.cy.js +1770 -0
  5. package/cypress/e2e/ActivityViewer/compiledActivity.cy.js +83 -0
  6. package/cypress/e2e/ActivityViewer/relationshipsAmongPages.cy.js +697 -0
  7. package/cypress/e2e/answerValidation/errorinnumbers.cy.js +2125 -0
  8. package/cypress/e2e/answerValidation/factoring.cy.js +1945 -0
  9. package/cypress/e2e/answerValidation/factoringOldAlgorithm.cy.js +892 -0
  10. package/cypress/e2e/answerValidation/functionanswers.cy.js +314 -0
  11. package/cypress/e2e/answerValidation/matchingpatterns.cy.js +287 -0
  12. package/cypress/e2e/answerValidation/matchpartial.cy.js +6711 -0
  13. package/cypress/e2e/answerValidation/pointlocation.cy.js +3989 -0
  14. package/cypress/e2e/answerValidation/symbolicequality.cy.js +1893 -0
  15. package/cypress/e2e/answerValidation/videoProgress.cy.js +210 -0
  16. package/cypress/e2e/assignNames/basiccopy.cy.js +2376 -0
  17. package/cypress/e2e/assignNames/collections.cy.js +9247 -0
  18. package/cypress/e2e/assignNames/selects.cy.js +105 -0
  19. package/cypress/e2e/assignNames/sequences.cy.js +1964 -0
  20. package/cypress/e2e/baseComponent/basecomponentproperties.cy.js +999 -0
  21. package/cypress/e2e/baseComponent/doenetMLtext.cy.js +427 -0
  22. package/cypress/e2e/chemistry/atom.cy.js +201 -0
  23. package/cypress/e2e/chemistry/ion.cy.js +608 -0
  24. package/cypress/e2e/chemistry/ioniccompound.cy.js +133 -0
  25. package/cypress/e2e/dynamicalsystem/cobwebpolyline.cy.js +2653 -0
  26. package/cypress/e2e/dynamicalsystem/equilibriumcurve.cy.js +311 -0
  27. package/cypress/e2e/dynamicalsystem/equilibriumline.cy.js +279 -0
  28. package/cypress/e2e/dynamicalsystem/equilibriumpoint.cy.js +283 -0
  29. package/cypress/e2e/dynamicalsystem/odesystem.cy.js +1834 -0
  30. package/cypress/e2e/equality/mathexpressions.cy.js +948 -0
  31. package/cypress/e2e/graphing/graphreferences.cy.js +978 -0
  32. package/cypress/e2e/graphing/graphreferences2.cy.js +615 -0
  33. package/cypress/e2e/linearAlgebra/eigenDecomposition.cy.js +401 -0
  34. package/cypress/e2e/tagSpecific/angle.cy.js +3898 -0
  35. package/cypress/e2e/tagSpecific/animatefromsequence.cy.js +2306 -0
  36. package/cypress/e2e/tagSpecific/answer.cy.js +31647 -0
  37. package/cypress/e2e/tagSpecific/bestfitline.cy.js +612 -0
  38. package/cypress/e2e/tagSpecific/blockquote.cy.js +30 -0
  39. package/cypress/e2e/tagSpecific/boolean.cy.js +742 -0
  40. package/cypress/e2e/tagSpecific/booleaninput.cy.js +1283 -0
  41. package/cypress/e2e/tagSpecific/booleanlist.cy.js +588 -0
  42. package/cypress/e2e/tagSpecific/booleanoperators.cy.js +596 -0
  43. package/cypress/e2e/tagSpecific/booleanoperatorsonmath.cy.js +498 -0
  44. package/cypress/e2e/tagSpecific/callaction.cy.js +2835 -0
  45. package/cypress/e2e/tagSpecific/choiceinput.cy.js +3205 -0
  46. package/cypress/e2e/tagSpecific/circle.cy.js +22036 -0
  47. package/cypress/e2e/tagSpecific/codeeditor.cy.js +1995 -0
  48. package/cypress/e2e/tagSpecific/collect.cy.js +5035 -0
  49. package/cypress/e2e/tagSpecific/componentsize.cy.js +502 -0
  50. package/cypress/e2e/tagSpecific/conditionalcontent.cy.js +3495 -0
  51. package/cypress/e2e/tagSpecific/contentBrowser.cy.js +335 -0
  52. package/cypress/e2e/tagSpecific/contentpicker.cy.js +261 -0
  53. package/cypress/e2e/tagSpecific/copy.cy.js +12627 -0
  54. package/cypress/e2e/tagSpecific/copy2.cy.js +5698 -0
  55. package/cypress/e2e/tagSpecific/curve.bezier.cy.js +12440 -0
  56. package/cypress/e2e/tagSpecific/curve.cy.js +1716 -0
  57. package/cypress/e2e/tagSpecific/curve.function.cy.js +1471 -0
  58. package/cypress/e2e/tagSpecific/curve.parametrized.cy.js +920 -0
  59. package/cypress/e2e/tagSpecific/document.cy.js +234 -0
  60. package/cypress/e2e/tagSpecific/endpoint.cy.js +197 -0
  61. package/cypress/e2e/tagSpecific/evaluate.cy.js +8895 -0
  62. package/cypress/e2e/tagSpecific/extract.cy.js +2282 -0
  63. package/cypress/e2e/tagSpecific/feedback.cy.js +2941 -0
  64. package/cypress/e2e/tagSpecific/function.cy.js +9450 -0
  65. package/cypress/e2e/tagSpecific/functioniterates.cy.js +1178 -0
  66. package/cypress/e2e/tagSpecific/functionoperators.cy.js +4047 -0
  67. package/cypress/e2e/tagSpecific/graph.cy.js +2491 -0
  68. package/cypress/e2e/tagSpecific/group.cy.js +683 -0
  69. package/cypress/e2e/tagSpecific/hint.cy.js +204 -0
  70. package/cypress/e2e/tagSpecific/image.cy.js +770 -0
  71. package/cypress/e2e/tagSpecific/integer.cy.js +206 -0
  72. package/cypress/e2e/tagSpecific/label.cy.js +800 -0
  73. package/cypress/e2e/tagSpecific/legend.cy.js +1001 -0
  74. package/cypress/e2e/tagSpecific/line.cy.js +12167 -0
  75. package/cypress/e2e/tagSpecific/linesegment.cy.js +4749 -0
  76. package/cypress/e2e/tagSpecific/lorem.cy.js +289 -0
  77. package/cypress/e2e/tagSpecific/map.cy.js +4476 -0
  78. package/cypress/e2e/tagSpecific/matchespattern.cy.js +693 -0
  79. package/cypress/e2e/tagSpecific/math.cy.js +10990 -0
  80. package/cypress/e2e/tagSpecific/mathdisplay.cy.js +2689 -0
  81. package/cypress/e2e/tagSpecific/mathinput.cy.js +15628 -0
  82. package/cypress/e2e/tagSpecific/mathinputgraph.cy.js +566 -0
  83. package/cypress/e2e/tagSpecific/mathlist.cy.js +4073 -0
  84. package/cypress/e2e/tagSpecific/mathoperators.cy.js +13851 -0
  85. package/cypress/e2e/tagSpecific/matrix.cy.js +8825 -0
  86. package/cypress/e2e/tagSpecific/matrixinput.cy.js +16277 -0
  87. package/cypress/e2e/tagSpecific/module.cy.js +1771 -0
  88. package/cypress/e2e/tagSpecific/number.cy.js +2221 -0
  89. package/cypress/e2e/tagSpecific/numberlist.cy.js +1285 -0
  90. package/cypress/e2e/tagSpecific/p.cy.js +72 -0
  91. package/cypress/e2e/tagSpecific/paginator.cy.js +2983 -0
  92. package/cypress/e2e/tagSpecific/parabola.cy.js +14331 -0
  93. package/cypress/e2e/tagSpecific/paragraphmarkup.cy.js +104 -0
  94. package/cypress/e2e/tagSpecific/periodicset.cy.js +1439 -0
  95. package/cypress/e2e/tagSpecific/piecewisefunction.cy.js +1055 -0
  96. package/cypress/e2e/tagSpecific/pluralize.cy.js +274 -0
  97. package/cypress/e2e/tagSpecific/point.cy.js +8895 -0
  98. package/cypress/e2e/tagSpecific/point2.cy.js +10259 -0
  99. package/cypress/e2e/tagSpecific/polygon.cy.js +5039 -0
  100. package/cypress/e2e/tagSpecific/polyline.cy.js +4704 -0
  101. package/cypress/e2e/tagSpecific/problem.cy.js +2768 -0
  102. package/cypress/e2e/tagSpecific/ray.cy.js +10770 -0
  103. package/cypress/e2e/tagSpecific/rectangle.cy.js +2143 -0
  104. package/cypress/e2e/tagSpecific/ref.cy.js +420 -0
  105. package/cypress/e2e/tagSpecific/regularPolygon.cy.js +1006 -0
  106. package/cypress/e2e/tagSpecific/regularPolygon2.cy.js +100 -0
  107. package/cypress/e2e/tagSpecific/regularPolygon3.cy.js +777 -0
  108. package/cypress/e2e/tagSpecific/samplerandomnumbers.cy.js +3619 -0
  109. package/cypress/e2e/tagSpecific/sectioning.cy.js +3530 -0
  110. package/cypress/e2e/tagSpecific/select.cy.js +5376 -0
  111. package/cypress/e2e/tagSpecific/selectfromsequence.cy.js +3846 -0
  112. package/cypress/e2e/tagSpecific/selectrandomnumbers.cy.js +2914 -0
  113. package/cypress/e2e/tagSpecific/sequence.cy.js +2093 -0
  114. package/cypress/e2e/tagSpecific/shuffle.cy.js +490 -0
  115. package/cypress/e2e/tagSpecific/sidebyside.cy.js +8057 -0
  116. package/cypress/e2e/tagSpecific/singlecharactercomponents.cy.js +72 -0
  117. package/cypress/e2e/tagSpecific/slider.cy.js +914 -0
  118. package/cypress/e2e/tagSpecific/solution.cy.js +109 -0
  119. package/cypress/e2e/tagSpecific/solveequations.cy.js +1026 -0
  120. package/cypress/e2e/tagSpecific/sort.cy.js +1685 -0
  121. package/cypress/e2e/tagSpecific/spreadsheet.cy.js +5971 -0
  122. package/cypress/e2e/tagSpecific/subsetofreals.cy.js +2725 -0
  123. package/cypress/e2e/tagSpecific/substitute.cy.js +2646 -0
  124. package/cypress/e2e/tagSpecific/tabular.cy.js +36 -0
  125. package/cypress/e2e/tagSpecific/text.cy.js +975 -0
  126. package/cypress/e2e/tagSpecific/textinput.cy.js +2177 -0
  127. package/cypress/e2e/tagSpecific/textlist.cy.js +369 -0
  128. package/cypress/e2e/tagSpecific/triangle.cy.js +1936 -0
  129. package/cypress/e2e/tagSpecific/triggerset.cy.js +2023 -0
  130. package/cypress/e2e/tagSpecific/updatevalue.cy.js +3288 -0
  131. package/cypress/e2e/tagSpecific/vector.cy.js +20183 -0
  132. package/cypress/e2e/tagSpecific/video.cy.js +612 -0
  133. package/cypress/e2e/tagSpecific/when.cy.js +202 -0
  134. package/cypress/e2e/variants/specifysinglevariant.cy.js +6726 -0
  135. package/cypress/e2e/variants/uniquevariants.cy.js +4846 -0
  136. package/cypress/fixtures/example.json +5 -0
  137. package/cypress/support/commands.js +32 -0
  138. package/cypress/support/e2e.js +31 -0
  139. package/cypress.config.js +18 -0
  140. package/docs/codeSnippet.jsx +11 -0
  141. package/docs/index.html +133 -0
  142. package/docs/index.jsx +138 -0
  143. package/docs/prism.css +3 -0
  144. package/index.html +14 -0
  145. package/index.js +21 -0
  146. package/media/answer_example.png +0 -0
  147. package/media/graph_example.png +0 -0
  148. package/media/graph_markup_example.png +0 -0
  149. package/package.json +83 -0
  150. package/public/favicon.ico +0 -0
  151. package/public/fonts/files/open-sans-v18-latin-700.woff +0 -0
  152. package/public/fonts/files/open-sans-v18-latin-700.woff2 +0 -0
  153. package/public/fonts/files/open-sans-v18-latin-700italic.woff +0 -0
  154. package/public/fonts/files/open-sans-v18-latin-700italic.woff2 +0 -0
  155. package/public/fonts/files/open-sans-v18-latin-italic.woff +0 -0
  156. package/public/fonts/files/open-sans-v18-latin-italic.woff2 +0 -0
  157. package/public/fonts/files/open-sans-v18-latin-light-italic.woff +0 -0
  158. package/public/fonts/files/open-sans-v18-latin-light-italic.woff2 +0 -0
  159. package/public/fonts/files/open-sans-v18-latin-light.woff +0 -0
  160. package/public/fonts/files/open-sans-v18-latin-light.woff2 +0 -0
  161. package/public/fonts/files/open-sans-v18-latin-regular.woff +0 -0
  162. package/public/fonts/files/open-sans-v18-latin-regular.woff2 +0 -0
  163. package/src/Core/ComponentTypes.js +426 -0
  164. package/src/Core/Core.js +11852 -0
  165. package/src/Core/CoreWorker.js +127 -0
  166. package/src/Core/Dependencies.js +8226 -0
  167. package/src/Core/Numerics.js +473 -0
  168. package/src/Core/ParameterStack.js +36 -0
  169. package/src/Core/ReadOnlyProxyHandler.js +41 -0
  170. package/src/Core/StateProxyHandler.js +88 -0
  171. package/src/Core/components/Aliases.js +67 -0
  172. package/src/Core/components/Angle.js +758 -0
  173. package/src/Core/components/AnimateFromSequence.js +922 -0
  174. package/src/Core/components/Answer.js +2087 -0
  175. package/src/Core/components/AsList.js +83 -0
  176. package/src/Core/components/AttractTo.js +245 -0
  177. package/src/Core/components/AttractToAngles.js +262 -0
  178. package/src/Core/components/AttractToConstraint.js +104 -0
  179. package/src/Core/components/AttractToGrid.js +315 -0
  180. package/src/Core/components/Award.js +906 -0
  181. package/src/Core/components/BestFitLine.js +318 -0
  182. package/src/Core/components/BezierControls.js +719 -0
  183. package/src/Core/components/BlockQuote.js +35 -0
  184. package/src/Core/components/Boolean.js +500 -0
  185. package/src/Core/components/BooleanInput.js +330 -0
  186. package/src/Core/components/BooleanList.js +396 -0
  187. package/src/Core/components/BooleanOperators.js +35 -0
  188. package/src/Core/components/BooleanOperatorsOfMath.js +148 -0
  189. package/src/Core/components/CallAction.js +261 -0
  190. package/src/Core/components/Caption.js +73 -0
  191. package/src/Core/components/Case.js +56 -0
  192. package/src/Core/components/Cell.js +439 -0
  193. package/src/Core/components/CellBlock.js +64 -0
  194. package/src/Core/components/Chart.js +795 -0
  195. package/src/Core/components/Choice.js +266 -0
  196. package/src/Core/components/ChoiceInput.js +1407 -0
  197. package/src/Core/components/Circle.js +2884 -0
  198. package/src/Core/components/CodeEditor.js +647 -0
  199. package/src/Core/components/CodeViewer.js +294 -0
  200. package/src/Core/components/CollaborateGroupSetup.js +46 -0
  201. package/src/Core/components/CollaborateGroups.js +119 -0
  202. package/src/Core/components/Collect.js +850 -0
  203. package/src/Core/components/Column.js +608 -0
  204. package/src/Core/components/ConditionalContent.js +468 -0
  205. package/src/Core/components/ConsiderAsResponses.js +49 -0
  206. package/src/Core/components/ConstrainTo.js +161 -0
  207. package/src/Core/components/ConstrainToAngles.js +244 -0
  208. package/src/Core/components/ConstrainToGraph.js +142 -0
  209. package/src/Core/components/ConstrainToGrid.js +175 -0
  210. package/src/Core/components/ConstraintUnion.js +119 -0
  211. package/src/Core/components/Constraints.js +497 -0
  212. package/src/Core/components/ContentBrowser.js +441 -0
  213. package/src/Core/components/ContentPicker.js +263 -0
  214. package/src/Core/components/ControlVectors.js +25 -0
  215. package/src/Core/components/Coords.js +63 -0
  216. package/src/Core/components/Copy.js +3412 -0
  217. package/src/Core/components/Curve.js +4130 -0
  218. package/src/Core/components/CustomAttribute.js +175 -0
  219. package/src/Core/components/DataFrame.js +357 -0
  220. package/src/Core/components/DiscreteSimulationResultList.js +342 -0
  221. package/src/Core/components/DiscreteSimulationResultPolyline.js +581 -0
  222. package/src/Core/components/Divisions.js +55 -0
  223. package/src/Core/components/Document.js +888 -0
  224. package/src/Core/components/Embed.js +65 -0
  225. package/src/Core/components/Endpoint.js +62 -0
  226. package/src/Core/components/Evaluate.js +321 -0
  227. package/src/Core/components/Extract.js +656 -0
  228. package/src/Core/components/Extrema.js +556 -0
  229. package/src/Core/components/Feedback.js +200 -0
  230. package/src/Core/components/FeedbackDefinitions.js +97 -0
  231. package/src/Core/components/Figure.js +148 -0
  232. package/src/Core/components/Footnote.js +73 -0
  233. package/src/Core/components/Function.js +5344 -0
  234. package/src/Core/components/FunctionIterates.js +306 -0
  235. package/src/Core/components/FunctionOperators.js +702 -0
  236. package/src/Core/components/Graph.js +1679 -0
  237. package/src/Core/components/Group.js +7 -0
  238. package/src/Core/components/HasSameFactoring.js +407 -0
  239. package/src/Core/components/Hint.js +241 -0
  240. package/src/Core/components/Image.js +524 -0
  241. package/src/Core/components/Indexing.js +79 -0
  242. package/src/Core/components/IntComma.js +64 -0
  243. package/src/Core/components/Integer.js +81 -0
  244. package/src/Core/components/Intersection.js +328 -0
  245. package/src/Core/components/Interval.js +29 -0
  246. package/src/Core/components/Label.js +492 -0
  247. package/src/Core/components/Latex.js +104 -0
  248. package/src/Core/components/Legend.js +329 -0
  249. package/src/Core/components/Line.js +2040 -0
  250. package/src/Core/components/LineSegment.js +882 -0
  251. package/src/Core/components/Lists.js +180 -0
  252. package/src/Core/components/Lorem.js +249 -0
  253. package/src/Core/components/MMeMen.js +377 -0
  254. package/src/Core/components/Map.js +873 -0
  255. package/src/Core/components/Markers.js +101 -0
  256. package/src/Core/components/MatchesPattern.js +339 -0
  257. package/src/Core/components/Math.js +2552 -0
  258. package/src/Core/components/MathInput.js +948 -0
  259. package/src/Core/components/MathList.js +828 -0
  260. package/src/Core/components/MathOperators.js +1286 -0
  261. package/src/Core/components/Matrix.js +497 -0
  262. package/src/Core/components/MatrixInput.js +3157 -0
  263. package/src/Core/components/MdMdnMrow.js +394 -0
  264. package/src/Core/components/Module.js +16 -0
  265. package/src/Core/components/Number.js +1031 -0
  266. package/src/Core/components/NumberList.js +550 -0
  267. package/src/Core/components/Option.js +24 -0
  268. package/src/Core/components/P.js +71 -0
  269. package/src/Core/components/Paginator.js +338 -0
  270. package/src/Core/components/Panel.js +126 -0
  271. package/src/Core/components/Parabola.js +1561 -0
  272. package/src/Core/components/ParagraphMarkup.js +59 -0
  273. package/src/Core/components/Pegboard.js +43 -0
  274. package/src/Core/components/PeriodicSet.js +291 -0
  275. package/src/Core/components/PiecewiseFunction.js +832 -0
  276. package/src/Core/components/Pluralize.js +198 -0
  277. package/src/Core/components/Point.js +1295 -0
  278. package/src/Core/components/Polygon.js +408 -0
  279. package/src/Core/components/Polyline.js +841 -0
  280. package/src/Core/components/RandomizedTextList.js +225 -0
  281. package/src/Core/components/Ray.js +1737 -0
  282. package/src/Core/components/Rectangle.js +1535 -0
  283. package/src/Core/components/Ref.js +350 -0
  284. package/src/Core/components/RegionBetweenCurveXAxis.js +124 -0
  285. package/src/Core/components/RegionHalfPlane.js +107 -0
  286. package/src/Core/components/RegularPolygon.js +2118 -0
  287. package/src/Core/components/RenderDoenetML.js +181 -0
  288. package/src/Core/components/Row.js +780 -0
  289. package/src/Core/components/SampleRandomNumbers.js +653 -0
  290. package/src/Core/components/Sectioning.js +303 -0
  291. package/src/Core/components/Select.js +947 -0
  292. package/src/Core/components/SelectFromSequence.js +1242 -0
  293. package/src/Core/components/SelectRandomNumbers.js +225 -0
  294. package/src/Core/components/Sequence.js +444 -0
  295. package/src/Core/components/Setup.js +53 -0
  296. package/src/Core/components/Shuffle.js +470 -0
  297. package/src/Core/components/SideBySide.js +2130 -0
  298. package/src/Core/components/SingleCharacterComponents.js +41 -0
  299. package/src/Core/components/Slider.js +819 -0
  300. package/src/Core/components/SolutionContainer.js +67 -0
  301. package/src/Core/components/Solutions.js +334 -0
  302. package/src/Core/components/SolveEquations.js +568 -0
  303. package/src/Core/components/Sort.js +398 -0
  304. package/src/Core/components/Sources.js +108 -0
  305. package/src/Core/components/Split.js +205 -0
  306. package/src/Core/components/Spreadsheet.js +1507 -0
  307. package/src/Core/components/StyleDefinitions.js +111 -0
  308. package/src/Core/components/SubsetOfReals.js +348 -0
  309. package/src/Core/components/SubsetOfRealsInput.js +1474 -0
  310. package/src/Core/components/Substitute.js +496 -0
  311. package/src/Core/components/SummaryStatistics.js +652 -0
  312. package/src/Core/components/Table.js +145 -0
  313. package/src/Core/components/Tabular.js +384 -0
  314. package/src/Core/components/Template.js +360 -0
  315. package/src/Core/components/Text.js +341 -0
  316. package/src/Core/components/TextInput.js +566 -0
  317. package/src/Core/components/TextList.js +442 -0
  318. package/src/Core/components/TextListFromString.js +137 -0
  319. package/src/Core/components/TextOperatorsOfMath.js +21 -0
  320. package/src/Core/components/Triangle.js +280 -0
  321. package/src/Core/components/TriggerSet.js +189 -0
  322. package/src/Core/components/TupleList.js +43 -0
  323. package/src/Core/components/UpdateValue.js +435 -0
  324. package/src/Core/components/VariantControl.js +36 -0
  325. package/src/Core/components/Vector.js +2478 -0
  326. package/src/Core/components/Verbatim.js +125 -0
  327. package/src/Core/components/Video.js +673 -0
  328. package/src/Core/components/When.js +198 -0
  329. package/src/Core/components/abstract/AngleListComponent.js +140 -0
  330. package/src/Core/components/abstract/BaseComponent.js +1496 -0
  331. package/src/Core/components/abstract/BlockComponent.js +5 -0
  332. package/src/Core/components/abstract/BooleanBaseOperator.js +88 -0
  333. package/src/Core/components/abstract/BooleanBaseOperatorOfMath.js +100 -0
  334. package/src/Core/components/abstract/BooleanBaseOperatorOneInput.js +44 -0
  335. package/src/Core/components/abstract/ComponentSize.js +789 -0
  336. package/src/Core/components/abstract/ComponentWithSelectableType.js +537 -0
  337. package/src/Core/components/abstract/CompositeComponent.js +142 -0
  338. package/src/Core/components/abstract/ConstraintComponent.js +19 -0
  339. package/src/Core/components/abstract/FunctionBaseOperator.js +680 -0
  340. package/src/Core/components/abstract/GraphicalComponent.js +56 -0
  341. package/src/Core/components/abstract/InlineComponent.js +5 -0
  342. package/src/Core/components/abstract/InlineRenderInlineChildren.js +63 -0
  343. package/src/Core/components/abstract/Input.js +192 -0
  344. package/src/Core/components/abstract/IntervalListComponent.js +218 -0
  345. package/src/Core/components/abstract/LineListComponent.js +114 -0
  346. package/src/Core/components/abstract/MathBaseOperator.js +631 -0
  347. package/src/Core/components/abstract/MathBaseOperatorOneInput.js +112 -0
  348. package/src/Core/components/abstract/PointListComponent.js +238 -0
  349. package/src/Core/components/abstract/SectioningComponent.js +1262 -0
  350. package/src/Core/components/abstract/SingleCharacterInline.js +23 -0
  351. package/src/Core/components/abstract/TextBaseOperatorOfMath.js +47 -0
  352. package/src/Core/components/abstract/TextOrInline.js +66 -0
  353. package/src/Core/components/abstract/VariableName.js +31 -0
  354. package/src/Core/components/abstract/VariableNameList.js +83 -0
  355. package/src/Core/components/abstract/VectorListComponent.js +235 -0
  356. package/src/Core/components/chemistry/Atom.js +910 -0
  357. package/src/Core/components/chemistry/ElectronConfiguration.js +36 -0
  358. package/src/Core/components/chemistry/Ion.js +684 -0
  359. package/src/Core/components/chemistry/IonicCompound.js +189 -0
  360. package/src/Core/components/chemistry/OrbitalDiagram.js +175 -0
  361. package/src/Core/components/chemistry/OrbitalDiagramInput.js +753 -0
  362. package/src/Core/components/chemistry/index.js +6 -0
  363. package/src/Core/components/commonsugar/breakstrings.js +627 -0
  364. package/src/Core/components/commonsugar/lists.js +177 -0
  365. package/src/Core/components/dynamicalSystems/CobwebPolyline.js +913 -0
  366. package/src/Core/components/dynamicalSystems/EquilibriumCurve.js +95 -0
  367. package/src/Core/components/dynamicalSystems/EquilibriumLine.js +93 -0
  368. package/src/Core/components/dynamicalSystems/EquilibriumPoint.js +93 -0
  369. package/src/Core/components/dynamicalSystems/ODESystem.js +943 -0
  370. package/src/Core/components/dynamicalSystems/index.js +5 -0
  371. package/src/Core/components/linearAlgebra/EigenDecomposition.js +294 -0
  372. package/src/Core/utils/array.js +30 -0
  373. package/src/Core/utils/booleanLogic.js +965 -0
  374. package/src/Core/utils/checkEquality.js +818 -0
  375. package/src/Core/utils/cid.js +29 -0
  376. package/src/Core/utils/componentInfoObjects.js +100 -0
  377. package/src/Core/utils/constraints.js +23 -0
  378. package/src/Core/utils/copy.js +572 -0
  379. package/src/Core/utils/deepFunctions.js +173 -0
  380. package/src/Core/utils/descendants.js +252 -0
  381. package/src/Core/utils/enumeration.js +234 -0
  382. package/src/Core/utils/feedback.js +84 -0
  383. package/src/Core/utils/function.js +1343 -0
  384. package/src/Core/utils/graphical.js +196 -0
  385. package/src/Core/utils/label.js +396 -0
  386. package/src/Core/utils/math.js +1056 -0
  387. package/src/Core/utils/naming.js +45 -0
  388. package/src/Core/utils/periodicSetEquality.js +403 -0
  389. package/src/Core/utils/randomNumbers.js +70 -0
  390. package/src/Core/utils/retrieveMedia.js +98 -0
  391. package/src/Core/utils/retrieveTextFile.js +140 -0
  392. package/src/Core/utils/returnAllPossibleVariants.js +73 -0
  393. package/src/Core/utils/rounding.js +316 -0
  394. package/src/Core/utils/sequence.js +754 -0
  395. package/src/Core/utils/serializedStateProcessing.js +4049 -0
  396. package/src/Core/utils/size.js +22 -0
  397. package/src/Core/utils/stateVariables.js +138 -0
  398. package/src/Core/utils/style.js +535 -0
  399. package/src/Core/utils/subset-of-reals.js +796 -0
  400. package/src/Core/utils/table.js +41 -0
  401. package/src/Core/utils/text.js +16 -0
  402. package/src/Core/utils/triggering.js +167 -0
  403. package/src/Core/utils/variants.js +477 -0
  404. package/src/DoenetML.css +308 -0
  405. package/src/DoenetML.jsx +201 -0
  406. package/src/Parser/doenet.grammar +90 -0
  407. package/src/Parser/doenet.js +33 -0
  408. package/src/Parser/doenet.terms.js +20 -0
  409. package/src/Parser/parser.js +266 -0
  410. package/src/Parser/tokens.js +129 -0
  411. package/src/Tools/CodeMirror.jsx +440 -0
  412. package/src/Tools/DarkmodeController.jsx +21 -0
  413. package/src/Tools/Footers/MathInputSelector.jsx +34 -0
  414. package/src/Tools/Footers/VirtualKeyboard.jsx +751 -0
  415. package/src/Tools/cypressTest/CypressTest.jsx +341 -0
  416. package/src/Tools/cypressTest/index.html +102 -0
  417. package/src/Tools/cypressTest/index.jsx +40 -0
  418. package/src/Viewer/ActivityViewer.jsx +1461 -0
  419. package/src/Viewer/PageViewer.jsx +1329 -0
  420. package/src/Viewer/renderers/alert.jsx +17 -0
  421. package/src/Viewer/renderers/angle.jsx +209 -0
  422. package/src/Viewer/renderers/answer.jsx +206 -0
  423. package/src/Viewer/renderers/asList.jsx +25 -0
  424. package/src/Viewer/renderers/blockQuote.jsx +41 -0
  425. package/src/Viewer/renderers/boolean.jsx +17 -0
  426. package/src/Viewer/renderers/booleanInput.css +105 -0
  427. package/src/Viewer/renderers/booleanInput.jsx +636 -0
  428. package/src/Viewer/renderers/button.jsx +369 -0
  429. package/src/Viewer/renderers/c.jsx +17 -0
  430. package/src/Viewer/renderers/callAction.jsx +18 -0
  431. package/src/Viewer/renderers/cell.jsx +59 -0
  432. package/src/Viewer/renderers/chart.jsx +83 -0
  433. package/src/Viewer/renderers/choiceInput.css +223 -0
  434. package/src/Viewer/renderers/choiceInput.jsx +535 -0
  435. package/src/Viewer/renderers/circle.jsx +990 -0
  436. package/src/Viewer/renderers/cobwebPolyline.jsx +442 -0
  437. package/src/Viewer/renderers/codeEditor.jsx +248 -0
  438. package/src/Viewer/renderers/codeViewer.jsx +105 -0
  439. package/src/Viewer/renderers/containerBlock.jsx +41 -0
  440. package/src/Viewer/renderers/containerInline.jsx +17 -0
  441. package/src/Viewer/renderers/contentBrowser.jsx +159 -0
  442. package/src/Viewer/renderers/contentPicker.jsx +160 -0
  443. package/src/Viewer/renderers/curve.jsx +1072 -0
  444. package/src/Viewer/renderers/ellipsis.jsx +17 -0
  445. package/src/Viewer/renderers/em.jsx +17 -0
  446. package/src/Viewer/renderers/embed.jsx +110 -0
  447. package/src/Viewer/renderers/feedback.jsx +74 -0
  448. package/src/Viewer/renderers/figure.jsx +131 -0
  449. package/src/Viewer/renderers/footnote.jsx +52 -0
  450. package/src/Viewer/renderers/graph.jsx +925 -0
  451. package/src/Viewer/renderers/hint.jsx +142 -0
  452. package/src/Viewer/renderers/image.jsx +581 -0
  453. package/src/Viewer/renderers/jsxgraph-distrib/jsxgraphcore.mjs +2 -0
  454. package/src/Viewer/renderers/jsxgraph-distrib/jsxgraphcore.mjs.map +1 -0
  455. package/src/Viewer/renderers/label.jsx +470 -0
  456. package/src/Viewer/renderers/legend.jsx +306 -0
  457. package/src/Viewer/renderers/line.jsx +511 -0
  458. package/src/Viewer/renderers/lineSegment.jsx +754 -0
  459. package/src/Viewer/renderers/list.jsx +111 -0
  460. package/src/Viewer/renderers/lq.jsx +12 -0
  461. package/src/Viewer/renderers/lsq.jsx +12 -0
  462. package/src/Viewer/renderers/math.jsx +582 -0
  463. package/src/Viewer/renderers/mathInput.css +10 -0
  464. package/src/Viewer/renderers/mathInput.jsx +425 -0
  465. package/src/Viewer/renderers/mathInputog.jsx +534 -0
  466. package/src/Viewer/renderers/mathList.jsx +39 -0
  467. package/src/Viewer/renderers/matrixInput.jsx +317 -0
  468. package/src/Viewer/renderers/mdash.jsx +12 -0
  469. package/src/Viewer/renderers/nbsp.jsx +12 -0
  470. package/src/Viewer/renderers/ndash.jsx +12 -0
  471. package/src/Viewer/renderers/number.jsx +454 -0
  472. package/src/Viewer/renderers/numberList.jsx +35 -0
  473. package/src/Viewer/renderers/orbitalDiagram.jsx +247 -0
  474. package/src/Viewer/renderers/orbitalDiagramInput.jsx +450 -0
  475. package/src/Viewer/renderers/p.jsx +38 -0
  476. package/src/Viewer/renderers/paginatorControls.jsx +41 -0
  477. package/src/Viewer/renderers/pegboard.jsx +239 -0
  478. package/src/Viewer/renderers/point.jsx +649 -0
  479. package/src/Viewer/renderers/polygon.jsx +612 -0
  480. package/src/Viewer/renderers/polyline.jsx +608 -0
  481. package/src/Viewer/renderers/pre.jsx +34 -0
  482. package/src/Viewer/renderers/q.jsx +17 -0
  483. package/src/Viewer/renderers/ray.jsx +410 -0
  484. package/src/Viewer/renderers/ref.jsx +149 -0
  485. package/src/Viewer/renderers/regionBetweenCurveXAxis.jsx +182 -0
  486. package/src/Viewer/renderers/renderDoenetML.jsx +56 -0
  487. package/src/Viewer/renderers/row.jsx +31 -0
  488. package/src/Viewer/renderers/rq.jsx +12 -0
  489. package/src/Viewer/renderers/rsq.jsx +12 -0
  490. package/src/Viewer/renderers/section.jsx +427 -0
  491. package/src/Viewer/renderers/sideBySide.jsx +80 -0
  492. package/src/Viewer/renderers/slider.jsx +800 -0
  493. package/src/Viewer/renderers/solution.jsx +134 -0
  494. package/src/Viewer/renderers/spreadsheet.jsx +83 -0
  495. package/src/Viewer/renderers/sq.jsx +17 -0
  496. package/src/Viewer/renderers/styles/global.css +14 -0
  497. package/src/Viewer/renderers/subsetOfRealsInput.jsx +392 -0
  498. package/src/Viewer/renderers/summaryStatistics.jsx +83 -0
  499. package/src/Viewer/renderers/table.jsx +78 -0
  500. package/src/Viewer/renderers/tabular.jsx +58 -0
  501. package/src/Viewer/renderers/tag.jsx +26 -0
  502. package/src/Viewer/renderers/text.jsx +439 -0
  503. package/src/Viewer/renderers/textInput.jsx +774 -0
  504. package/src/Viewer/renderers/textList.jsx +30 -0
  505. package/src/Viewer/renderers/triggerSet.jsx +52 -0
  506. package/src/Viewer/renderers/updateValue.jsx +30 -0
  507. package/src/Viewer/renderers/utils/css.js +13 -0
  508. package/src/Viewer/renderers/utils/graph.js +159 -0
  509. package/src/Viewer/renderers/utils/offGraphIndicators.js +91 -0
  510. package/src/Viewer/renderers/vector.jsx +678 -0
  511. package/src/Viewer/renderers/video.jsx +494 -0
  512. package/src/Viewer/useDoenetRenderer.jsx +128 -0
  513. package/src/main.jsx +16 -0
  514. package/src/media/fonts/files/open-sans-v18-latin-700.woff +0 -0
  515. package/src/media/fonts/files/open-sans-v18-latin-700.woff2 +0 -0
  516. package/src/media/fonts/files/open-sans-v18-latin-700italic.woff +0 -0
  517. package/src/media/fonts/files/open-sans-v18-latin-700italic.woff2 +0 -0
  518. package/src/media/fonts/files/open-sans-v18-latin-italic.woff +0 -0
  519. package/src/media/fonts/files/open-sans-v18-latin-italic.woff2 +0 -0
  520. package/src/media/fonts/files/open-sans-v18-latin-light-italic.woff +0 -0
  521. package/src/media/fonts/files/open-sans-v18-latin-light-italic.woff2 +0 -0
  522. package/src/media/fonts/files/open-sans-v18-latin-light.woff +0 -0
  523. package/src/media/fonts/files/open-sans-v18-latin-light.woff2 +0 -0
  524. package/src/media/fonts/files/open-sans-v18-latin-regular.woff +0 -0
  525. package/src/media/fonts/files/open-sans-v18-latin-regular.woff2 +0 -0
  526. package/src/test/testCode.doenet +26 -0
  527. package/src/test/testViewer.jsx +158 -0
  528. package/src/uiComponents/ActionButton.jsx +157 -0
  529. package/src/uiComponents/ActionButtonGroup.jsx +93 -0
  530. package/src/uiComponents/Button.jsx +160 -0
  531. package/src/uiComponents/ButtonGroup.jsx +56 -0
  532. package/src/uiComponents/ToggleButton.jsx +194 -0
  533. package/src/uiComponents/ToggleButtonGroup.jsx +77 -0
  534. package/src/utils/activityUtils.js +713 -0
  535. package/src/utils/array.js +17 -0
  536. package/src/utils/cid.js +34 -0
  537. package/src/utils/componentInfoObjects.js +89 -0
  538. package/src/utils/deepFunctions.js +165 -0
  539. package/src/utils/enumeration.js +226 -0
  540. package/src/utils/math.js +624 -0
  541. package/src/utils/naming.js +44 -0
  542. package/src/utils/retrieveTextFile.js +156 -0
  543. package/src/utils/returnAllPossibleVariants.js +81 -0
  544. package/src/utils/sequence.js +715 -0
  545. package/src/utils/serialize.js +29 -0
  546. package/src/utils/serializedStateProcessing.js +2587 -0
  547. package/src/utils/subset-of-reals.js +783 -0
  548. package/src/utils/url.js +19 -0
  549. package/vite.config.js +14 -0
@@ -0,0 +1,17 @@
1
+
2
+ // from: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat
3
+ export function flattenDeep(arr1) {
4
+ return arr1.reduce((acc, val) => Array.isArray(val) ? acc.concat(flattenDeep(val)) : acc.concat(val), []);
5
+ }
6
+
7
+ export function flattenLevels(arr1, levels) {
8
+ console.log(`levels: ${levels}`)
9
+ return arr1.reduce((acc, val) => Array.isArray(val) && levels > 1 ? acc.concat(flattenLevels(val, levels - 1)) : acc.concat(val), []);
10
+ }
11
+
12
+ export function mapDeep(arr, f, iprefix = [], origArr) {
13
+ if(!origArr) {
14
+ origArr = arr;
15
+ }
16
+ return arr.map((v, i) => Array.isArray(v) ? mapDeep(v, f, [...iprefix, i], origArr) : f(v, [...iprefix, i], origArr));
17
+ }
@@ -0,0 +1,34 @@
1
+ import base32 from 'hi-base32';
2
+
3
+
4
+ export async function cidFromText(text) {
5
+
6
+ let encoder = new TextEncoder();
7
+ let data = encoder.encode(text);
8
+
9
+ return await cidFromArrayBuffer(data);
10
+
11
+ }
12
+
13
+ export async function cidFromArrayBuffer(data) {
14
+
15
+ let hashBuffer = await crypto.subtle.digest("SHA-256", data);
16
+
17
+ let cidArray = new Uint8Array(36);
18
+
19
+ // 0x01: cidV1
20
+ // 0x55: raw binary IPLD
21
+ // 0x12: code for SHA256
22
+ // 0x20: 32 bytes (or 256 bits)
23
+ cidArray.set([0x01, 0x55, 0x12, 0x20]);
24
+
25
+ cidArray.set(new Uint8Array(hashBuffer), 4);
26
+
27
+ // b: prefix for base 32
28
+ // base32: hi-base uses RFC 4648 encoding
29
+ // cid uses lowercase letter and does not include the padding at the end
30
+ let cid = 'b' + base32.encode(cidArray).toLowerCase().replace(/=+/, "");
31
+
32
+ return cid;
33
+
34
+ }
@@ -0,0 +1,89 @@
1
+ // import * as ComponentTypes from '../ComponentTypes'
2
+ let ComponentTypes= {};
3
+
4
+ export default function createComponentInfoObjects() {
5
+
6
+ let allComponentClasses = ComponentTypes.allComponentClasses();
7
+ let componentTypesCreatingVariants = ComponentTypes.componentTypesCreatingVariants();
8
+
9
+ let componentTypeLowerCaseMapping = {};
10
+ for (let componentType in allComponentClasses) {
11
+ componentTypeLowerCaseMapping[componentType.toLowerCase()] = componentType;
12
+ }
13
+
14
+ let stateVariableInfo = {};
15
+ for (let componentType in allComponentClasses) {
16
+ Object.defineProperty(stateVariableInfo, componentType, {
17
+ get: function () {
18
+ let info = allComponentClasses[componentType].returnStateVariableInfo();
19
+ delete stateVariableInfo[componentType];
20
+ return stateVariableInfo[componentType] = info;
21
+ }.bind(this),
22
+ configurable: true
23
+ })
24
+ }
25
+
26
+ let publicStateVariableInfo = {};
27
+ for (let componentType in allComponentClasses) {
28
+ Object.defineProperty(publicStateVariableInfo, componentType, {
29
+ get: function () {
30
+ let info = allComponentClasses[componentType].returnStateVariableInfo({
31
+ onlyPublic: true
32
+ });
33
+ delete publicStateVariableInfo[componentType];
34
+ return publicStateVariableInfo[componentType] = info;
35
+ }.bind(this),
36
+ configurable: true
37
+ })
38
+ }
39
+
40
+
41
+ function isInheritedComponentType({ inheritedComponentType, baseComponentType }) {
42
+ if (inheritedComponentType === baseComponentType) {
43
+ return true;
44
+ }
45
+ if (inheritedComponentType === "string") {
46
+ return baseComponentType === "_base" || baseComponentType === "_inline";
47
+ } else if (baseComponentType === "string") {
48
+ return false;
49
+ }
50
+
51
+ let baseClass = allComponentClasses[baseComponentType];
52
+ if (!baseClass) {
53
+ return false;
54
+ }
55
+ return baseClass.isPrototypeOf(
56
+ allComponentClasses[inheritedComponentType]
57
+ );
58
+ }
59
+
60
+
61
+ function isCompositeComponent({ componentType, includeNonStandard = true }) {
62
+ let componentClass = allComponentClasses[componentType];
63
+ if (!componentClass) {
64
+ return false;
65
+ }
66
+
67
+ let isComposite = isInheritedComponentType({
68
+ inheritedComponentType: componentType,
69
+ baseComponentType: "_composite"
70
+ })
71
+
72
+ return isComposite &&
73
+ (includeNonStandard || !componentClass.treatAsComponentForRecursiveReplacements)
74
+ }
75
+
76
+
77
+ return {
78
+ allComponentClasses,
79
+ componentTypesCreatingVariants,
80
+ componentTypeLowerCaseMapping,
81
+ isInheritedComponentType,
82
+ isCompositeComponent,
83
+ stateVariableInfo,
84
+ publicStateVariableInfo
85
+ };
86
+
87
+
88
+ }
89
+
@@ -0,0 +1,165 @@
1
+ import me from 'math-expressions';
2
+ import subsets from './subset-of-reals';
3
+
4
+
5
+ // from https://stackoverflow.com/a/40293777
6
+ export function deepClone(obj, BaseComponent, hash) {
7
+
8
+ // Do not try to clone primitives or functions
9
+ if (Object(obj) !== obj || obj instanceof Function) return obj;
10
+
11
+ // Do not try to clone Doenet components
12
+ if (BaseComponent !== undefined && obj instanceof BaseComponent) return obj;
13
+
14
+ if (obj instanceof me.class || obj instanceof subsets.Subset) {
15
+ return obj.copy();
16
+ }
17
+
18
+ if (hash === undefined) {
19
+ hash = new WeakMap();
20
+ }
21
+
22
+ if (Array.isArray(obj)) {
23
+ return [...obj.map(x => deepClone(x, BaseComponent, hash))]
24
+ }
25
+
26
+ // seem to get empty object a lot, so short circuit it
27
+ if (obj.constructor === Object && Object.entries(obj).length === 0) {
28
+ return {};
29
+ }
30
+
31
+
32
+ if (hash.has(obj)) return hash.get(obj); // Cyclic reference
33
+ try { // Try to run constructor (without arguments, as we don't know them)
34
+ var result = new obj.constructor();
35
+ } catch (e) { // Constructor failed, create object without running the constructor
36
+ result = Object.create(Object.getPrototypeOf(obj));
37
+ }
38
+ // Optional: support for some standard constructors (extend as desired)
39
+ if (obj instanceof Map)
40
+ Array.from(obj, ([key, val]) => result.set(deepClone(key, BaseComponent, hash),
41
+ deepClone(val, BaseComponent, hash)));
42
+ else if (obj instanceof Set) {
43
+ // result.values = result.values.bind(result);
44
+ Array.from(obj, (key) => result.add(deepClone(key, BaseComponent, hash)));
45
+ }
46
+ // Register in hash
47
+ hash.set(obj, result);
48
+ // Clone and assign enumerable own properties recursively
49
+ return Object.assign(result, ...Object.keys(obj).map(
50
+ key => ({ [key]: deepClone(obj[key], BaseComponent, hash) })));
51
+ }
52
+
53
+
54
+
55
+ // based on https://stackoverflow.com/a/1144249
56
+ export function deepCompare(a, b, BaseComponent) {
57
+ var leftChain, rightChain;
58
+
59
+ function compare2Objects(x, y) {
60
+ var p;
61
+
62
+ // remember that NaN === NaN returns false
63
+ if (Number.isNaN(x) && Number.isNaN(y)) {
64
+ return true;
65
+ }
66
+
67
+ if (x === y) {
68
+ return true;
69
+ }
70
+
71
+ // if components, equal if same component name
72
+ if (BaseComponent !== undefined && x instanceof BaseComponent && y instanceof BaseComponent) {
73
+ return x.componentName === y.componentName;
74
+ }
75
+
76
+ // if math-expressions, equal if exact same syntax tree
77
+ if (x instanceof me.class && y instanceof me.class) {
78
+ return compare2Objects(x.tree, y.tree)
79
+ }
80
+
81
+ // Works in case when functions are created in constructor.
82
+ // Comparing dates is a common scenario. Another built-ins?
83
+ // We can even handle functions passed across iframes
84
+ if ((typeof x === 'function' && typeof y === 'function') ||
85
+ (x instanceof Date && y instanceof Date) ||
86
+ (x instanceof RegExp && y instanceof RegExp) ||
87
+ (x instanceof String && y instanceof String) ||
88
+ (x instanceof Number && y instanceof Number)) {
89
+ return x.toString() === y.toString();
90
+ }
91
+
92
+ // At last checking prototypes as good as we can
93
+ if (!(x instanceof Object && y instanceof Object)) {
94
+ return false;
95
+ }
96
+
97
+ if (x.isPrototypeOf(y) || y.isPrototypeOf(x)) {
98
+ return false;
99
+ }
100
+
101
+ if (x.constructor !== y.constructor) {
102
+ return false;
103
+ }
104
+
105
+ if (x.prototype !== y.prototype) {
106
+ return false;
107
+ }
108
+
109
+ // Check for infinitive linking loops
110
+ if (leftChain.indexOf(x) > -1 || rightChain.indexOf(y) > -1) {
111
+ return false;
112
+ }
113
+
114
+ // Quick checking of one object being a subset of another.
115
+ for (p in y) {
116
+ if (y.hasOwnProperty(p) !== x.hasOwnProperty(p)) {
117
+ return false;
118
+ }
119
+ else if (typeof y[p] !== typeof x[p]) {
120
+ return false;
121
+ }
122
+ }
123
+
124
+ for (p in x) {
125
+ if (y.hasOwnProperty(p) !== x.hasOwnProperty(p)) {
126
+ return false;
127
+ }
128
+ else if (typeof y[p] !== typeof x[p]) {
129
+ return false;
130
+ }
131
+
132
+ switch (typeof (x[p])) {
133
+ case 'object':
134
+ case 'function':
135
+
136
+ leftChain.push(x);
137
+ rightChain.push(y);
138
+
139
+ if (!compare2Objects(x[p], y[p])) {
140
+ // console.log(`false because objects weren't equal`);
141
+ // console.log(x[p])
142
+ // console.log(y[p])
143
+ return false;
144
+ }
145
+
146
+ leftChain.pop();
147
+ rightChain.pop();
148
+ break;
149
+
150
+ default:
151
+ if (x[p] !== y[p] && !(Number.isNaN(x[p]) && Number.isNaN(y[p]))) {
152
+ return false;
153
+ }
154
+ break;
155
+ }
156
+ }
157
+
158
+ return true;
159
+ }
160
+
161
+ leftChain = [];
162
+ rightChain = [];
163
+
164
+ return compare2Objects(a, b);
165
+ }
@@ -0,0 +1,226 @@
1
+ import me from 'math-expressions';
2
+
3
+
4
+
5
+ // Enumerates the unique combinations of repeeated selecting an index
6
+ // from the same set of options, with or without replacement
7
+ // The number of options to choose from is numberOfOptions
8
+ // so that each index is an integer between 0 and numberOfOptions-1
9
+ // The number of indices to choose for each combination is numberOfIndices.
10
+ // Begins with combinations that contain distinct indices, if possible
11
+ // Returns a maximum of maxNumber
12
+ export function enumerateSelectionCombinations({
13
+ numberOfIndices, numberOfOptions, maxNumber = Infinity,
14
+ withReplacement = false,
15
+ skipZero = false // for case when generating offsets but without replacement
16
+ }) {
17
+
18
+ if (numberOfIndices === 1) {
19
+ let options = [...Array(numberOfOptions).keys()];
20
+ // remove zero
21
+ options = options.slice(1);
22
+ if (!skipZero) {
23
+ // but put 0 last (so in recursion where the numbers are offsets, repeated combination is last)
24
+ options = [...options, 0];
25
+ }
26
+ options = options.slice(0, maxNumber)
27
+ // convert to array of arrays
28
+ options = options.map(x => [x]);
29
+ return options;
30
+ }
31
+
32
+ let allOffsetsCombinations = enumerateSelectionCombinations({
33
+ numberOfIndices: numberOfIndices - 1,
34
+ numberOfOptions: numberOfOptions,
35
+ maxNumber,
36
+ withReplacement,
37
+ skipZero: !withReplacement
38
+ });
39
+
40
+ let results = [];
41
+ let numberSoFar = 0;
42
+ for (let offsets of allOffsetsCombinations) {
43
+ for (let ind0 = 1; ind0 <= numberOfOptions; ind0++) {
44
+ let combination = [ind0 % numberOfOptions,
45
+ ...offsets.map(x => (ind0 + x) % numberOfOptions)];
46
+ if (skipZero && combination.includes(0)) {
47
+ continue;
48
+ }
49
+ results.push(combination);
50
+ numberSoFar++;
51
+ if (numberSoFar >= maxNumber) {
52
+ return results;
53
+ }
54
+ }
55
+ }
56
+
57
+ return results;
58
+
59
+ }
60
+
61
+
62
+ // Enumerate the unique combinations of picking a set of indices
63
+ // The number of possible options for each index is given
64
+ // by the array numberOfOptionsByIndex
65
+ // whose length gives the total number of options
66
+ // Returns an array of arrays, where each array gives an index for each option
67
+ // Returns at most maxNumber of combinations
68
+ export function enumerateCombinations({
69
+ numberOfOptionsByIndex,
70
+ maxNumber = Infinity
71
+ }) {
72
+
73
+ let numberOfIndices = numberOfOptionsByIndex.length;
74
+
75
+ if (numberOfIndices === 0) {
76
+ return [];
77
+ }
78
+
79
+ let gcds = [];
80
+ for (let ind1 = 0; ind1 < numberOfIndices; ind1++) {
81
+ let g = [];
82
+ for (let ind2 = 0; ind2 < ind1; ind2++) {
83
+ g.push(me.math.gcd(numberOfOptionsByIndex[ind1], numberOfOptionsByIndex[ind2]));
84
+ }
85
+ gcds.push(g);
86
+ }
87
+
88
+ // flatten and take max
89
+ let maxGCD = gcds.reduce((a, c) => [...c, ...a], []).reduce((a, c) => Math.max(a, c), 1);
90
+
91
+ // if maxGCD is one, then can just sequentially pick the same component for each index
92
+ // (mod the size)
93
+ // and we encounter every possibility
94
+ if (maxGCD === 1) {
95
+ let totalCombinations = numberOfOptionsByIndex.reduce((a, c) => a * c);
96
+ totalCombinations = Math.min(totalCombinations, maxNumber);
97
+ let results = [];
98
+ for (let ind = 0; ind < totalCombinations; ind++) {
99
+ let r = numberOfOptionsByIndex.map(x => ind % x);
100
+ results.push(r);
101
+ }
102
+ return results;
103
+ }
104
+
105
+ // if have two indices, then run sequentially for lcm,
106
+ // then shift second index and run sequentially for another lcm
107
+ // if continue gcd times, will have all combinations
108
+ if (numberOfIndices === 2) {
109
+ let gcd = maxGCD;
110
+ let lcm = me.math.lcm(...numberOfOptionsByIndex);
111
+
112
+ let results = [];
113
+ let numberSoFar = 0;
114
+ for (let offset = 0; offset < gcd; offset++) {
115
+ for (let ind = 0; ind < lcm; ind++) {
116
+ let r = [ind % numberOfOptionsByIndex[0], (ind + offset) % numberOfOptionsByIndex[1]];
117
+ results.push(r);
118
+ numberSoFar++;
119
+ if (numberSoFar >= maxNumber) {
120
+ return results;
121
+ }
122
+ }
123
+ }
124
+ return results;
125
+ }
126
+
127
+ // if have more than 2 indices and gcd isn't one
128
+ // then combine two together (which can treat with above case)
129
+ // and recurse with the result that has one fewer index
130
+ // (will need to splice together final result)
131
+
132
+ // will combine the first pair encountered that, along with gcd > 1,
133
+ // has the smallest least common multiple
134
+ let lcms = [];
135
+ for (let ind1 = 0; ind1 < numberOfIndices; ind1++) {
136
+ let m = [];
137
+ for (let ind2 = 0; ind2 < ind1; ind2++) {
138
+ if (gcds[ind1][ind2] > 1) {
139
+ m.push(me.math.lcm(numberOfOptionsByIndex[ind1], numberOfOptionsByIndex[ind2]));
140
+ } else {
141
+ m.push(null); // be sure to skip those with gcd == 1
142
+ }
143
+ }
144
+ lcms.push(m);
145
+ }
146
+
147
+ // flatten and take min, filering out the nulls
148
+ let minLCM = lcms.reduce((a, c) => [...c, ...a], [])
149
+ .filter(x => x !== null)
150
+ .reduce((a, c) => Math.min(a, c), Infinity);
151
+
152
+ // find indices where minimum occurs
153
+ let matchInds;
154
+
155
+ for (let ind1 = 0; ind1 < numberOfIndices; ind1++) {
156
+ for (let ind2 = 0; ind2 < ind1; ind2++) {
157
+ if (lcms[ind1][ind2] === minLCM) {
158
+ matchInds = [ind2, ind1]; // want lowest index first
159
+ break;
160
+ }
161
+ }
162
+ if (matchInds) {
163
+ break;
164
+ }
165
+ }
166
+
167
+ // create new options of just the matched results
168
+ let n0 = numberOfOptionsByIndex[matchInds[0]];
169
+ let n1 = numberOfOptionsByIndex[matchInds[1]];
170
+
171
+ let innerOptions = [n0, n1];
172
+
173
+ // create new options where replace matched results with single one
174
+ // that has number of options set equal to the total number of inner options (n1*n2)
175
+ let outerOptions = numberOfOptionsByIndex;
176
+ outerOptions[matchInds[0]] = n0 * n1; // replace first with total number of combinations
177
+ outerOptions.splice(matchInds[1], 1); // delete second matched ind
178
+
179
+ let outerResult = enumerateCombinations({
180
+ numberOfOptionsByIndex: outerOptions,
181
+ maxNumber: maxNumber
182
+ });
183
+ let innerResult = enumerateCombinations({
184
+ numberOfOptionsByIndex: innerOptions,
185
+ maxNumber: maxNumber
186
+ });
187
+
188
+
189
+ // to splice back together
190
+ // - replace the combined entry (which is at the lower index)
191
+ // with the first inner result
192
+ // - insert in the second inner result at the larger index
193
+ for (let r of outerResult) {
194
+ let ires = innerResult[r[matchInds[0]]];
195
+ r.splice(matchInds[0], 1, ires[0]);
196
+ r.splice(matchInds[1], 0, ires[1]);
197
+ }
198
+
199
+ return outerResult;
200
+
201
+ }
202
+
203
+ // from https://stackoverflow.com/a/20871714
204
+ export function enumeratePermutations({ values, maxNumber }) {
205
+
206
+ let result = [];
207
+
208
+ const permute = (arr, m = []) => {
209
+ if (arr.length === 0) {
210
+ result.push(m)
211
+ } else {
212
+ for (let i = 0; i < arr.length; i++) {
213
+ let curr = arr.slice();
214
+ let next = curr.splice(i, 1);
215
+ permute(curr.slice(), m.concat(next))
216
+ if(result.length >= maxNumber) {
217
+ return;
218
+ }
219
+ }
220
+ }
221
+ }
222
+
223
+ permute(values)
224
+
225
+ return result;
226
+ }