src/algorithms/moore/index.js
fe944750
 import { addIndex, findIndex, find, map, propEq, reduce, sort, range, concat } from 'rambda';
 import type { JobId } from '../../types';
 import { remove, slice } from 'ramda';
 
 type JobTime = {
   jobId: JobId,
   t: number,
   d: number,
   c: number
 };
 
 const mapWithIndex = addIndex(map);
 
 // const byAsc = (a: JobTime, b: JobTime) => a.time - b.time;
 
 const findJobById = (jobId: JobId, jobTimes: JobTime[]): JobTime =>
   find(propEq('jobId', jobId), jobTimes);
 
 const findLateJob = (jobTimes: JobTime[]) =>
   find(({ c, d }: JobTime) => c > d, jobTimes);
 
 const findMaxTJob = (jobTimes: JobTime[]) =>
   reduce(
     (maxTJob: JobTime, jobTime: JobTime) => maxTJob.t > jobTime.t ? maxTJob : jobTime,
     { t: -Infinity },
     jobTimes
   );
 
 const updateCTime = (jobTimes: JobTime[]) => {
   let prev = 0;
 
   const cj = map((jobTime: JobTime) => {
     prev += jobTime.t;
 
     return { ...jobTime, c: prev };
   }, jobTimes);
 
   return cj;
 };
 
 export const createSchedule = (jobs: JobTime[]) => {
   const F = sort((a: JobTime, b: JobTime) => a.d - b.d, jobs);
   const L = [];
 
   let cj = updateCTime(F);
   let lateJob;
 
   while (lateJob = findLateJob(cj)) {
     const lateJobIndex = findIndex(propEq('jobId', lateJob.jobId), cj);
     const jobsBeforeLateJob = slice(0, lateJobIndex + 1, cj);
 
     const maxTJob = findMaxTJob(jobsBeforeLateJob);
     const maxTJobIndex = findIndex(propEq('jobId', maxTJob.jobId), cj);
 
     cj = remove(maxTJobIndex, 1, cj);
     cj = updateCTime(cj);
 
     L.push(maxTJob);
   }
 
   const schedule = concat(cj, L);
 
   return updateCTime(schedule);
 };
 
 export default (jobs: JobTime[]) => {
   const schedule = createSchedule(jobs);
 
   const normalizedSchedule = map((jobTime: JobTime) => ({
     processor: 1,
     startTime: jobTime.c - jobTime.t,
     endTime: jobTime.c,
   }), schedule);
 
   return [normalizedSchedule];
 };