Skip to content

Instantly share code, notes, and snippets.

@timnew
Created June 17, 2018 13:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save timnew/05d3ab164bc1381b0bd819d05bcc41cc to your computer and use it in GitHub Desktop.
Save timnew/05d3ab164bc1381b0bd819d05bcc41cc to your computer and use it in GitHub Desktop.
ElevatorSaga
{
init(elevators, floors) {
floors.forEach((floor) => {
floor.on('up_button_pressed', () => {
floor.up = true
})
floor.on('down_button_pressed', () => {
floor.down = true
})
})
elevators.forEach((elevator) => {
elevator.on('floor_button_pressed', (floorNum) => {
smartAddDest(elevator, floorNum)
})
elevator.on('passing_floor', (floorNum, direction) => {
let floor = floors[floorNum]
if (floor[direction] && elevator.loadFactor() < 0.8) {
elevator.goToFloor(floorNum, true)
floor[direction] = false
}
})
elevator.on('stopped_at_floor', (floorNum) => {
const floor = floors[floorNum]
floor[elevator.destinationDirection()] = false
removeFloorFromQueue(elevator, floorNum)
})
elevator.on('idle', () => {
const destFloor = findFurthestFloor(elevator.currentFloor())
if (destFloor != null) {
elevator.goToFloor(destFloor.floorNum())
destFloor.up = false
destFloor.down = false
}
})
})
function findFurthestFloor(currentFloor) {
return floors.filter(floor => floor.up || floor.down)
.sort((floor) => -Math.abs(floor.floorNum - currentFloor))[0]
}
function removeFloorFromQueue(elevator, floorNum) {
const filteredDestinationQueue = elevator.destinationQueue.filter((i) => i !== floorNum)
if (elevator.destinationQueue.length !== filteredDestinationQueue.length) {
elevator.destinationQueue = filteredDestinationQueue
elevator.checkDestinationQueue()
}
}
function smartAddDest(elevator, floorNum) {
const queue = elevator.destinationQueue
if (queue.includes(floorNum)) {
return
}
queue.push(floorNum)
let direction = elevator.destinationDirection()
const current = elevator.currentFloor()
if (direction === 'stopped') {
const closet = queue.sort((num) => Math.abs(num - current))[0]
direction = (closet - current > 0) ? 'up' : 'down'
}
if (direction === 'up') {
queue.sort((dest) => (dest - current) % floors.length)
} else { // 'down'
queue.sort((dest) => (current - dest) % floors.length)
}
elevator.checkDestinationQueue()
}
},
update(dt, elevators, floors) {
function findFurthestFloor(currentFloor) {
return floors.filter(floor => floor.up || floor.down)
.sort((floor) => -Math.abs(floor.floorNum - currentFloor))[0]
}
elevators.filter((elevator) => elevator.loadFactor() === 0)
.filter((elevator) => elevator.destinationDirection() === 'stopped ')
.forEach((elevator) => {
const destFloor = findFurthestFloor(elevator.currentFloor())
if (destFloor != null) {
elevator.goToFloor(destFloor.floorNum())
destFloor.up = false
destFloor.down = false
}
})
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment