    {- |

    A /priority search queue/ (henceforth /queue/) efficiently supports the
    operations of both a search tree and a priority queue. A 'Binding' is a
    product of a key and a priority. Bindings can be inserted, deleted, modified
    and queried in logarithmic time, and the binding with the least priority can be
    retrieved in constant time. A queue can be built from a list of bindings,
    sorted by keys, in linear time.

    This implementation is due to Ralf Hinze.

    * [Hinze, R., A Simple Implementation Technique for Priority Search Queues, ICFP 2001, pp. 110-121](http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.18.1149)

    -}

    -- Some modifications by Scott Dillard

    module Data.PSQueue
        (
        -- * Binding Type
        Binding((:->))
        , key
        , prio
        -- * Priority Search Queue Type
        , PSQ
        -- * Query
        , size
        , null
        , lookup
        -- * Construction
        , empty
        , singleton
        -- * Insertion
        , insert
        , insertWith
        -- * Delete/Update
        , delete
        , adjust
        , adjustWithKey
        , update
        , updateWithKey
        , alter
        -- * Conversion
        , keys
        , toList
        , toAscList
        , toDescList
        , fromList
        , fromAscList
        , fromDistinctAscList
        -- * Priority Queue
        , findMin
        , deleteMin
        , minView
        , atMost
        , atMostRange
        -- * Fold
        , foldr
        , foldl
    ) where

    import Prelude ()
    import Data.PSQueue.Internal