#!/usr/bin/env python

# Jacob Joseph
# 11 Aug 2008

# A heap-based priority queue implementation

from heapq import *

class pqueue( object):
    
    def __init__(self, l=None):
        if l is None:
            self.__heap = []
        else:
            self.__heap = l
            heapify( self.__heap)

        self.__delset = set()

    def __repr__(self):
        return (self.__heap, self.__delset).__repr__()

    def __str__(self):
        return self.__repr__()

    def push(self, obj):
        """Add an object to the queue"""
        heappush( self.__heap, obj)

    def pop(self):
        """Pop the minimum from the queue"""
        m = heappop( self.__heap)
        while m in self.__delset:
            m = heappop( self.__heap)

        return m

    def fetch_min(self):
        """Nondestructively fetch the min from the queue"""
        if len(self.__heap) == 0:
            return None
        
        m = self.__heap[0]
        while m in self.__delset:
            heappop( self.__heap)
            m = self.__heap[0]
        return m

    def delete(self, obj):
        """Delete an object, lazily"""
        # lazy delete
        self.__delset.add( obj)


        
        
