Skip to content

Instantly share code, notes, and snippets.

@justanr
Created January 31, 2025 22:38
Show Gist options
  • Save justanr/e1ee9b99f674c972306333c8d0597619 to your computer and use it in GitHub Desktop.
Save justanr/e1ee9b99f674c972306333c8d0597619 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python3
import random as _rng
class ShuffleQueue:
def __init__(self, items, rng=None):
self._idx = 0
self._items = items
self._rng = rng or _rng
def dequeue(self):
upper = len(self._items)
if self._idx == upper:
return None
swap = self._rng.randrange(self._idx, upper)
self._items[self._idx], self._items[swap] = self._items[swap], self._items[self._idx]
self._idx += 1
return self._items[self._idx-1]
def __next__(self):
if (item := self.dequeue()) is None:
raise StopIteration
return item
def __iter__(self):
return self
def requeue(self, item):
if self._idx == 0 or item != self._items[self._idx-1]:
return False
self._idx -= 1
return True
def peek(self):
return self._items[self._idx]
if __name__ == "__main__":
for n in ShuffleQueue([1, 2, 3, 4, 5]):
print(n)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment