package DupletListModule /** Turns a class into a linked list where each instance knows it's previous and next member in the list */ public module DupletListModule static thistype firstActive = null static thistype lastActive = null static thistype firstInactive = null static thistype lastInactive = null static int activeSize = 0 static int inactiveSize = 0 thistype prev thistype next boolean active = true boolean linked = false construct() addToActive() function deactivate() if active and linked active = false removeFromActive() addToInactive() function activate() if not active and linked active = true removeFromInactive() addToActive() function remove() if not linked return if active active = false removeFromActive() else removeFromInactive() function removeFromActive() activeSize-- if this != firstActive prev.next = next else firstActive = next if this != lastActive next.prev = prev else lastActive = prev if firstActive != null if firstActive == lastActive firstActive.prev = null else firstActive.prev = lastActive linked = false prev = null next = null function removeFromInactive() inactiveSize-- if this != firstInactive prev.next = next else firstInactive = next if this != lastInactive next.prev = prev else lastInactive = prev if firstInactive != null if firstInactive == lastInactive firstInactive.prev = null else firstInactive.prev = lastInactive linked = false prev = null next = null function addToActive() activeSize++ if activeSize == 1 firstActive = this prev = null else prev = lastActive lastActive.next = this firstActive.prev = this next = null lastActive = this linked = true function addToInactive() inactiveSize++ if inactiveSize == 1 firstInactive = this prev = null else prev = lastInactive lastInactive.next = this firstInactive.prev = this next = null lastInactive = this linked = true ondestroy remove() /** an iterator which iterates over all instances of this class */ static function iterator() returns Iterator return new Iterator() static class Iterator DupletListModule.thistype current = firstActive DupletListModule.thistype lastReturned = null private function syncCurrent() // Re-anchor from the last returned active node so iteration survives // removals/deactivations of what used to be `current`. if lastReturned != null and lastReturned.active current = lastReturned.next function hasNext() returns boolean syncCurrent() return current != null function next() returns DupletListModule.thistype syncCurrent() let res = current current = current.next lastReturned = res return res function close() destroy this function reset() current = firstActive lastReturned = null