Advertisement
Guest User

Untitled

a guest
Oct 13th, 2015
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.24 KB | None | 0 0
  1. module PriorityQueue where
  2.  
  3. import Data.Map (Map)
  4. import qualified Data.Map as Map
  5.  
  6. data Unique = U
  7.  
  8. instance Eq Unique where
  9. U == U = False
  10.  
  11. instance Ord Unique where
  12. compare U U = LT
  13.  
  14. data PriorityQueue k v = PriorityQueue (v -> k) (Map (k, Unique) v)
  15.  
  16. instance (Ord k, Show k, Show v) => Show (PriorityQueue k v) where
  17. show (PriorityQueue _ m) = "PriorityQueue\n" ++ table
  18. where (table, _) = Map.mapAccumWithKey acc "" m
  19. acc str (k, U) v = (str ++ "\t" ++ show v ++ " -> " ++ show k ++ "\n", v)
  20.  
  21. empty :: Ord k => (v -> k) -> PriorityQueue k v
  22. empty k = PriorityQueue k Map.empty
  23.  
  24. insert :: Ord k => v -> PriorityQueue k v -> PriorityQueue k v
  25. insert v (PriorityQueue k m) = PriorityQueue k (Map.insert (k v, U) v m)
  26.  
  27. findMin :: Ord k => PriorityQueue k v -> (k, v)
  28. findMin (PriorityQueue _ m) = let ((k, _), v) = Map.findMin m in (k, v)
  29.  
  30. deleteMin :: Ord k => PriorityQueue k v -> PriorityQueue k v
  31. deleteMin (PriorityQueue k m) = PriorityQueue k (Map.deleteMin m)
  32.  
  33. minView :: Ord k => PriorityQueue k v -> ((k, v), PriorityQueue k v)
  34. minView p = (findMin p, deleteMin p)
  35.  
  36. size :: Ord k => PriorityQueue k v -> Int
  37. size (PriorityQueue _ m) = Map.size m
  38.  
  39. null :: Ord k => PriorityQueue k v -> Bool
  40. null (PriorityQueue _ m) = Map.null m
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement