[issue #9] refactor2022/imports #12
							
								
								
									
										25
									
								
								index.html
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								index.html
									
									
									
									
									
								
							| @ -2,15 +2,22 @@ | ||||
| <html> | ||||
| <head> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1"/> | ||||
|     <script src="./libraries/papaparse.min.js"></script> | ||||
|     <script src="./libraries/n.js"></script> | ||||
|     <script src="./libraries/pivot.js"></script> | ||||
|     <script src="./data/csv.js"></script> | ||||
| </head> | ||||
| <body> | ||||
|     <div id="app"></div> | ||||
|     <!-- initialize table --> | ||||
|     <script> | ||||
|     <script type="module"> | ||||
| 
 | ||||
|     import { h, render, createContext, Fragment } from 'https://cdn.skypack.dev/preact'; | ||||
|     import { useReducer, useState } from 'https://cdn.skypack.dev/preact/hooks'; | ||||
|     import { css, cx } from 'https://cdn.skypack.dev/@emotion/css'; | ||||
|     import htm from 'https://unpkg.com/htm?module'; | ||||
|     const html = htm.bind(h); | ||||
|      | ||||
|     import N from "./src/n.js"; | ||||
|     import Pivot from "./src/pivot.js"; | ||||
| 
 | ||||
|     let columnNames = CSV.shift(); | ||||
|     let columnTypes = ([...columnNames]).fill("hidden"); | ||||
|     columnTypes[29] = "sum"; | ||||
| @ -28,14 +35,7 @@ | ||||
|         columnNames, | ||||
|         CSV | ||||
|     ); | ||||
|     </script> | ||||
|     <!-- rendering --> | ||||
|     <script type="module"> | ||||
|     import { h, render, createContext, Fragment } from 'https://cdn.skypack.dev/preact'; | ||||
|     import { useReducer, useState } from 'https://cdn.skypack.dev/preact/hooks'; | ||||
|     import { css, cx } from 'https://cdn.skypack.dev/@emotion/css'; | ||||
|     import htm from 'https://unpkg.com/htm?module'; | ||||
|     const html = htm.bind(h); | ||||
| 
 | ||||
|      | ||||
|     let PivotForm = props => | ||||
|     { | ||||
| @ -483,6 +483,7 @@ | ||||
|             pivots.map(pivot=>h(PivotRoot, {key:pivot.Meta.Label, pivot})) | ||||
|         ]) | ||||
|     }; | ||||
|      | ||||
|     const Render = () => render(h(ElRoot), document.querySelector("#app")); | ||||
|     Render(); | ||||
|      | ||||
|  | ||||
							
								
								
									
										172
									
								
								libraries/n.js
									
									
									
									
									
								
							
							
						
						
									
										172
									
								
								libraries/n.js
									
									
									
									
									
								
							| @ -1,172 +0,0 @@ | ||||
| var N = | ||||
| { | ||||
| ID:{ | ||||
|     Walk:0, | ||||
|     Instance:0 | ||||
| }, | ||||
| Create(inMeta) | ||||
| { | ||||
|     return { | ||||
|         ID:{ | ||||
|             Walk:0, | ||||
|             Instance:N.ID.Instance++ | ||||
|         }, | ||||
|         Meta:inMeta||{}, | ||||
|         Link:{} | ||||
|     }; | ||||
| }, | ||||
| Connect(inNodeMajor, inNodeMinor, inKey, inUnique) | ||||
| { | ||||
|     if(inUnique) // bail if the nodes are already connected
 | ||||
|     { | ||||
|         let check = N.Step(inNodeMajor, inKey, true); | ||||
|         if(check) | ||||
|         { | ||||
|             if(check.indexOf(inNodeMinor) !== -1) | ||||
|             { | ||||
|                 return; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     N.Step(inNodeMajor, inKey, true, true).push(inNodeMinor); | ||||
|     N.Step(inNodeMinor, inKey, false, true).push(inNodeMajor); | ||||
| }, | ||||
| Disconnect(inNodeMajor, inNodeMinor, inKey) | ||||
| { | ||||
|     let remove = (inArray, inMatch) => inArray.findIndex( (inMember, inIndex, inArray) => (inMember === inMatch) ? inArray.splice(inIndex, 1) : false ); | ||||
| 
 | ||||
|     // if no specific child was passed
 | ||||
|     if(inNodeMinor === null) | ||||
|     { | ||||
|         // get all the children
 | ||||
|         let check = N.Step(inNodeMajor, inKey); | ||||
|         if(!check){ return; } | ||||
| 
 | ||||
|         // go down to each child ...
 | ||||
|         check.forEach( inNodeMinor =>  | ||||
|         { | ||||
|             let connections = inNodeMinor.Link[inKey]; | ||||
|             remove( connections.Get, inNodeMajor); // ... and remove any reference to the parent
 | ||||
| 
 | ||||
|             // if after the remove operation, this child has no connections on inKey, scrub the key
 | ||||
|             if(!connections.Set.length && !connections.Get.length) | ||||
|             { | ||||
|                 delete inNodeMinor.Link[inKey]; | ||||
|             } | ||||
|         }); | ||||
| 
 | ||||
|         // we just wiped out all outgoing connections to the parent, if incoming connections are empty too we can purge the key there as well
 | ||||
|         if(inNodeMajor.Link[inKey].Get.length == 0) | ||||
|         { | ||||
|             delete inNodeMajor.Link[inKey]; | ||||
|         } | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     // if no specific parent was passed
 | ||||
|     if(inNodeMajor === null) | ||||
|     { | ||||
|         // get all the parents
 | ||||
|         let check = N.Step(inNodeMinor, inKey, false); | ||||
|         if(!check){ return; } | ||||
|          | ||||
|         // go up to each parent ...
 | ||||
|         check.forEach( inNodeMajor =>  | ||||
|         { | ||||
|             let connections = inNodeMajor.Link[inKey]; | ||||
|             remove( connections.Set, inNodeMinor); // ... and remove any reference to the child
 | ||||
|              | ||||
|             // if after the remove operation, this parent has no connections on inKey, scrub the key
 | ||||
|             if( !connections.Set.length && !connections.Get.length ) | ||||
|             { | ||||
|                 delete inNodeMajor.Link[inKey]; | ||||
|             } | ||||
|         }); | ||||
| 
 | ||||
|         // we just wiped out all incoming connections to the child, if outgoing connections are empty too we can purge the key there as well
 | ||||
|         if(inNodeMinor.Link[inKey].Set.length == 0) | ||||
|         { | ||||
|             delete inNodeMinor.Link[inKey]; | ||||
|         } | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     // if a specific parent and child were passed
 | ||||
|     if(inNodeMajor.Link[inKey].Set.length == 1) | ||||
|     { | ||||
|         delete inNodeMajor.Link[inKey]; | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         remove(inNodeMajor.Link[inKey].Set, inNodeMinor); | ||||
|     } | ||||
|     if(inNodeMinor.Link[inKey].Get.length == 1) | ||||
|     { | ||||
|         delete inNodeMinor.Link[inKey]; | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         remove(inNodeMinor.Link[inKey].Get, inNodeMajor); | ||||
|     } | ||||
| 
 | ||||
| }, | ||||
| Step(inNode, inKey, inForward, inForceCreate) | ||||
| { | ||||
|     let connectionGroup = inNode.Link[inKey]; | ||||
|     if(!connectionGroup) | ||||
|     { | ||||
|         if(inForceCreate === true) | ||||
|         { | ||||
|             inNode.Link[inKey] = connectionGroup = {Get:[], Set:[]}; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
|     return (inForward === undefined || inForward === true) ? connectionGroup.Set : connectionGroup.Get; | ||||
|      | ||||
| }, | ||||
| Walk(inIterator, inNode, inKey, inForward, inTerminal) | ||||
| { | ||||
|     let array = N.Step(inNode, inKey, inForward); | ||||
| 
 | ||||
|     if(!array.length && inTerminal) | ||||
|     { | ||||
|         return inTerminal(inNode); | ||||
|     } | ||||
| 
 | ||||
|     for(let i=0; i<array.length; i++) | ||||
|     { | ||||
|         let next = array[i]; | ||||
|         if(next.ID.Walk !== N.ID.Walk) | ||||
|         { | ||||
|             next.ID.Walk = N.ID.Walk; | ||||
|             //console.log("processing", next.Meta)
 | ||||
|             let results = inIterator(next); | ||||
|             if(results !== false) | ||||
|             { | ||||
|                 N.Walk(inIterator, next, inKey, inForward, inTerminal); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 //console.log("routine exited");
 | ||||
|             } | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             //console.log("id collision");
 | ||||
|         } | ||||
|     } | ||||
| }, | ||||
| Path(inArray, inNode, inKey, inForward) | ||||
| { | ||||
|     var current = inNode; | ||||
|     var direction = inForward||true; | ||||
|     for(let i=0; i<inArray.length; i++) | ||||
|     { | ||||
|         current = N.Step(current, inKey, direction)[inArray[i]]; | ||||
|     } | ||||
|     return current; | ||||
| } | ||||
| }; | ||||
							
								
								
									
										7
									
								
								libraries/papaparse.min.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								libraries/papaparse.min.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										0
									
								
								src/app.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								src/app.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										174
									
								
								src/n.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										174
									
								
								src/n.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,174 @@ | ||||
| const N = | ||||
| { | ||||
|     ID:{ | ||||
|         Walk:0, | ||||
|         Instance:0 | ||||
|     }, | ||||
|     Create(inMeta) | ||||
|     { | ||||
|         return { | ||||
|             ID:{ | ||||
|                 Walk:0, | ||||
|                 Instance:N.ID.Instance++ | ||||
|             }, | ||||
|             Meta:inMeta||{}, | ||||
|             Link:{} | ||||
|         }; | ||||
|     }, | ||||
|     Connect(inNodeMajor, inNodeMinor, inKey, inUnique) | ||||
|     { | ||||
|         if(inUnique) // bail if the nodes are already connected
 | ||||
|         { | ||||
|             let check = N.Step(inNodeMajor, inKey, true); | ||||
|             if(check) | ||||
|             { | ||||
|                 if(check.indexOf(inNodeMinor) !== -1) | ||||
|                 { | ||||
|                     return; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         N.Step(inNodeMajor, inKey, true, true).push(inNodeMinor); | ||||
|         N.Step(inNodeMinor, inKey, false, true).push(inNodeMajor); | ||||
|     }, | ||||
|     Disconnect(inNodeMajor, inNodeMinor, inKey) | ||||
|     { | ||||
|         let remove = (inArray, inMatch) => inArray.findIndex( (inMember, inIndex, inArray) => (inMember === inMatch) ? inArray.splice(inIndex, 1) : false ); | ||||
| 
 | ||||
|         // if no specific child was passed
 | ||||
|         if(inNodeMinor === null) | ||||
|         { | ||||
|             // get all the children
 | ||||
|             let check = N.Step(inNodeMajor, inKey); | ||||
|             if(!check){ return; } | ||||
| 
 | ||||
|             // go down to each child ...
 | ||||
|             check.forEach( inNodeMinor =>  | ||||
|             { | ||||
|                 let connections = inNodeMinor.Link[inKey]; | ||||
|                 remove( connections.Get, inNodeMajor); // ... and remove any reference to the parent
 | ||||
| 
 | ||||
|                 // if after the remove operation, this child has no connections on inKey, scrub the key
 | ||||
|                 if(!connections.Set.length && !connections.Get.length) | ||||
|                 { | ||||
|                     delete inNodeMinor.Link[inKey]; | ||||
|                 } | ||||
|             }); | ||||
| 
 | ||||
|             // we just wiped out all outgoing connections to the parent, if incoming connections are empty too we can purge the key there as well
 | ||||
|             if(inNodeMajor.Link[inKey].Get.length == 0) | ||||
|             { | ||||
|                 delete inNodeMajor.Link[inKey]; | ||||
|             } | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         // if no specific parent was passed
 | ||||
|         if(inNodeMajor === null) | ||||
|         { | ||||
|             // get all the parents
 | ||||
|             let check = N.Step(inNodeMinor, inKey, false); | ||||
|             if(!check){ return; } | ||||
|              | ||||
|             // go up to each parent ...
 | ||||
|             check.forEach( inNodeMajor =>  | ||||
|             { | ||||
|                 let connections = inNodeMajor.Link[inKey]; | ||||
|                 remove( connections.Set, inNodeMinor); // ... and remove any reference to the child
 | ||||
|                  | ||||
|                 // if after the remove operation, this parent has no connections on inKey, scrub the key
 | ||||
|                 if( !connections.Set.length && !connections.Get.length ) | ||||
|                 { | ||||
|                     delete inNodeMajor.Link[inKey]; | ||||
|                 } | ||||
|             }); | ||||
| 
 | ||||
|             // we just wiped out all incoming connections to the child, if outgoing connections are empty too we can purge the key there as well
 | ||||
|             if(inNodeMinor.Link[inKey].Set.length == 0) | ||||
|             { | ||||
|                 delete inNodeMinor.Link[inKey]; | ||||
|             } | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         // if a specific parent and child were passed
 | ||||
|         if(inNodeMajor.Link[inKey].Set.length == 1) | ||||
|         { | ||||
|             delete inNodeMajor.Link[inKey]; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             remove(inNodeMajor.Link[inKey].Set, inNodeMinor); | ||||
|         } | ||||
|         if(inNodeMinor.Link[inKey].Get.length == 1) | ||||
|         { | ||||
|             delete inNodeMinor.Link[inKey]; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             remove(inNodeMinor.Link[inKey].Get, inNodeMajor); | ||||
|         } | ||||
| 
 | ||||
|     }, | ||||
|     Step(inNode, inKey, inForward, inForceCreate) | ||||
|     { | ||||
|         let connectionGroup = inNode.Link[inKey]; | ||||
|         if(!connectionGroup) | ||||
|         { | ||||
|             if(inForceCreate === true) | ||||
|             { | ||||
|                 inNode.Link[inKey] = connectionGroup = {Get:[], Set:[]}; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 return false; | ||||
|             } | ||||
|         } | ||||
|         return (inForward === undefined || inForward === true) ? connectionGroup.Set : connectionGroup.Get; | ||||
|          | ||||
|     }, | ||||
|     Walk(inIterator, inNode, inKey, inForward, inTerminal) | ||||
|     { | ||||
|         let array = N.Step(inNode, inKey, inForward); | ||||
| 
 | ||||
|         if(!array.length && inTerminal) | ||||
|         { | ||||
|             return inTerminal(inNode); | ||||
|         } | ||||
| 
 | ||||
|         for(let i=0; i<array.length; i++) | ||||
|         { | ||||
|             let next = array[i]; | ||||
|             if(next.ID.Walk !== N.ID.Walk) | ||||
|             { | ||||
|                 next.ID.Walk = N.ID.Walk; | ||||
|                 //console.log("processing", next.Meta)
 | ||||
|                 let results = inIterator(next); | ||||
|                 if(results !== false) | ||||
|                 { | ||||
|                     N.Walk(inIterator, next, inKey, inForward, inTerminal); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     //console.log("routine exited");
 | ||||
|                 } | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 //console.log("id collision");
 | ||||
|             } | ||||
|         } | ||||
|     }, | ||||
|     Path(inArray, inNode, inKey, inForward) | ||||
|     { | ||||
|         var current = inNode; | ||||
|         var direction = inForward||true; | ||||
|         for(let i=0; i<inArray.length; i++) | ||||
|         { | ||||
|             current = N.Step(current, inKey, direction)[inArray[i]]; | ||||
|         } | ||||
|         return current; | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| export default N; | ||||
| @ -1,4 +1,6 @@ | ||||
| var Pivot =  | ||||
| import N from "./n.js"; | ||||
| 
 | ||||
| const Pivot =  | ||||
| { | ||||
| Leaves:{}, | ||||
| Root:N.Create({Label:"All Pivots"}), | ||||
| @ -196,3 +198,5 @@ Unmodify(inModifier) | ||||
|     N.Disconnect(null, inModifier, "Modifier"); | ||||
| } | ||||
| }; | ||||
| 
 | ||||
| export default Pivot; | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user