export type Work = {data:string, user:string, time:number}; export type Part = {name:string, time:number, work:Work[], need:Desk[], make:Desk[]}; export type Need = [part:Part, time:number]; export type DeskMode = "all" | "one"; export type Desk = {name:string, need:Need[], make:Part[], mode:DeskMode, role:[]}; const Part = (name:string):Part=> { return {name, time:0, work:[], need:[], make:[]}; } const Desk = (name:string, need:Need[], make:Part[], mode:DeskMode):Desk=> { const obj:Desk = {name, need, make, mode, role:[]}; for(let i=0; i{ const work = {data, user:"", time}; if(time > part.time){ part.work.unshift(work); part.time = time; } else { part.work.push(work); } part.need.forEach(Recompute); part.make.forEach(Recompute); } const Recompute = (desk:Desk)=>{ let latestMake = -Infinity; for(let i=0; i latestMake) { latestMake = time; } } let latestNeed = -Infinity; const dirtyNeed = []; for(let i=0; i latestNeed) { latestNeed = time; } if(time < latestMake) { dirtyNeed.push(i); } } const dirtyMake = [] for(let i=0; i latestNeed) { dirtyMake.push(i); } } return [dirtyNeed, dirtyMake]; } type User = {name:string}; type Role = [name:string, users:[]] function BlockRole>(r:Records):{[K in keyof Records]: Role} { const result = {}; for (const key in r) { result[key] = [key, []]; } return result; } export {Part, Desk, Work, Recompute, BlockRole};