diff --git a/data/users.js b/data/users.js new file mode 100644 index 0000000..ee16d25 --- /dev/null +++ b/data/users.js @@ -0,0 +1,4 @@ +export default { + u1:"seth", + u2:"seth2" +} \ No newline at end of file diff --git a/graph.js b/graph.js new file mode 100644 index 0000000..385629f --- /dev/null +++ b/graph.js @@ -0,0 +1,128 @@ +/** @import * as TYPES from "./types.ts" */ + +/** @type {TYPES.GraphBuilder} */ +export default function({users, roles, parts, desks}) +{ + +// mutate users + /** @type {Record} */ + //@ts-ignore + const UserList = users; + for(let userId in users) + { + const name = users[userId]; + UserList[userId] = {name, desk:new Set()}; + } + +// mutate roles + /** @type {Record} */ + //@ts-ignore + const RoleList = roles; + for(let roleId in roles) + { + const [name, ...userIds] = roles[roleId]; + RoleList[roleId] = {name, user:userIds.map(uId=>UserList[uId])}; + } + +// mutate parts + /** @type {Record} */ + //@ts-ignore + const PartList = parts; + for(let partId in parts) + { + const name = parts[partId]; + PartList[partId] = /** @type {TYPES.Part} */({name, work:[], time:0, need:[], make:[]}); + } + + +// mutate desks + /** @type {Record} */ + //@ts-ignore + const DeskList = desks; + + for(let deskId in desks) + { + const [name, roleIDs, mode, needObj, ...makePartIDs] = desks[deskId]; + const need =[]; + const time =[]; + + /** @type {TYPES.Desk} */ + const desk = { + name, + mode, + need, + time, + make:[], + role:[] + }; + + for(const partId in needObj) + { + const part = PartList[partId]; + need.push(part); + part.need.push(desk); + time.push(needObj[partId]); + } + + desk.role = roleIDs.map(roleId=> + { + const role = RoleList[/**@type{string}*/(roleId)]; + role.user.forEach(u =>u.desk.add(desk)); + return role; + }); + + desk.make = makePartIDs.map( partId=> + { + const part = PartList[/**@type{string}*/(partId)]; + part.make.push(desk); + return part; + } ) + + DeskList[deskId] = desk; + } + + console.log(users, parts, desks); +} + +const Scan =(desk)=> +{ + const need = Object.keys(desk.need); + const make = desk.make; + + const dirtyNeed = []; + const dirtyMake = []; + + let makeMin = Infinity; + let needMax = -Infinity; + + for(let i=0; i needMax) needMax = part.time; + } + + for(let i=0; i makeMin) + { + dirtyNeed.push(id); + } + } + + console.log("scan", dirtyNeed, dirtyMake); + return [dirtyNeed, dirtyMake]; +}; \ No newline at end of file diff --git a/index.js b/index.js index 5550f4a..1e922e7 100644 --- a/index.js +++ b/index.js @@ -1,62 +1,19 @@ -/** @import * as TYPES from "./types.ts" */ +import Graph from "./graph.js"; +import User from "./data/users.js" -/** @type {TYPES.GraphBuilder} */ -function Desk(users, roles, parts, ...desks) -{ - for(let id in parts) - { - const name = parts[id]; - parts[id] = {name, work:[], time:0, need:[], make:[]} - } - - for(let i=0; i - { - const part = parts[p] - part.make.push(desk); - return part; - } ) - - desks[i] = desk; - } - - console.log(parts, desks); - -} - -const users = { - u1:"seth2" -} - -Desk -( - users, +Graph({ + users:User, + roles: { dev:["Development", "u1"] }, + parts: { p1:"hey", p2:"sup" }, - ["d1", ["dev"], "all", {p2:3}, "p1"] -) \ No newline at end of file + desks: + { + d1:["Desk 01", ["dev"], "all", {p2:3}, "p1"] + } +}); \ No newline at end of file diff --git a/deno.json b/tsconfig.json similarity index 100% rename from deno.json rename to tsconfig.json diff --git a/types.ts b/types.ts index 8a84708..e9815d0 100644 --- a/types.ts +++ b/types.ts @@ -6,12 +6,20 @@ export type GraphBuilder= Users extends Record, Roles extends Record]>, Parts extends Record, - Desk extends [ name:string, roles:Array, mode:"all"|"one", need:Partial>, ...make:Array] + Desks extends Record, mode:"all"|"one", need:Partial>, ...make:Array]> > ( - users:Users, + params:{users:Users, roles:Roles, parts:Parts, - ...desks:Desk[] + desks:Desks} ) =>void + + +export type User = {name:string, desk:Set}; +export type Role = {name:string, user:User[]}; +export type Desk = {name:string, need:Part[], time:number[], make:Part[], mode:string, role:Role[]}; +export type Work = [user:User, part:Part, time:number, data:string]; +export type Part = {name:string, time:number, work:Work[], need:Desk[], make:Desk[]}; +