packages feed

psqueues-0.2.3.0: tests/Data/PSQ/Class.hs

-- | Generic class with properties and methods that are available for all
-- different implementations ('IntPSQ', 'OrdPSQ' and 'HashPSQ').
{-# LANGUAGE TypeFamilies        #-}
{-# LANGUAGE FlexibleInstances   #-}
{-# LANGUAGE Rank2Types          #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Data.PSQ.Class
    ( PSQ (..)
    ) where

import           Data.Hashable (Hashable)

import qualified Data.IntPSQ   as IntPSQ
import qualified Data.HashPSQ  as HashPSQ
import qualified Data.OrdPSQ   as OrdPSQ

class PSQ (psq :: * -> * -> *) where
    type Key psq :: *

    -- Query
    null
        :: Ord p => psq p v -> Bool
    size
        :: Ord p => psq p v -> Int
    member
        :: Ord p => Key psq -> psq p v -> Bool
    lookup
        :: Ord p => Key psq -> psq p v -> Maybe (p, v)
    findMin
        :: Ord p => psq p v -> Maybe (Key psq, p, v)

    -- Construction
    empty
        :: Ord p => psq p v
    singleton
        :: Ord p => Key psq -> p -> v -> psq p v

    -- Insertion
    insert
        :: Ord p => Key psq -> p -> v -> psq p v -> psq p v

    -- Delete/update
    delete
        :: Ord p => Key psq -> psq p v -> psq p v
    deleteMin
        :: Ord p => psq p v -> psq p v
    alter
        :: Ord p
        => (Maybe (p, v) -> (b, Maybe (p, v)))
        -> Key psq -> psq p v -> (b, psq p v)
    alterMin
        :: Ord p
        => (Maybe (Key psq, p, v) -> (b, Maybe (Key psq, p, v)))
        -> psq p v -> (b, psq p v)

    -- Lists
    fromList
        :: Ord p => [(Key psq, p, v)] -> psq p v
    toList
        :: Ord p => psq p v -> [(Key psq, p, v)]
    keys
        :: Ord p => psq p v -> [Key psq]

    -- Views
    insertView
        :: Ord p => Key psq -> p -> v -> psq p v -> (Maybe (p, v), psq p v)
    deleteView
        :: Ord p => Key psq -> psq p v -> Maybe (p, v, psq p v)
    minView
        :: Ord p => psq p v -> Maybe (Key psq, p, v, psq p v)
    atMostView
        :: Ord p => p -> psq p v -> ([(Key psq, p, v)], psq p v)

    -- Traversals
    map :: Ord p => (Key psq -> p -> v -> w) -> psq p v -> psq p w
    fold'
        :: Ord p => (Key psq -> p -> v -> a -> a) -> a -> psq p v -> a

    -- Validity check
    valid
        :: Ord p => psq p v -> Bool

instance PSQ IntPSQ.IntPSQ where
    type Key IntPSQ.IntPSQ = Int

    null       = IntPSQ.null
    size       = IntPSQ.size
    member     = IntPSQ.member
    lookup     = IntPSQ.lookup
    findMin    = IntPSQ.findMin
    empty      = IntPSQ.empty
    singleton  = IntPSQ.singleton
    insert     = IntPSQ.insert
    delete     = IntPSQ.delete
    deleteMin  = IntPSQ.deleteMin
    alter      = IntPSQ.alter
    alterMin   = IntPSQ.alterMin
    fromList   = IntPSQ.fromList
    toList     = IntPSQ.toList
    keys       = IntPSQ.keys
    insertView = IntPSQ.insertView
    deleteView = IntPSQ.deleteView
    minView    = IntPSQ.minView
    atMostView = IntPSQ.atMostView
    map        = IntPSQ.map
    fold'      = IntPSQ.fold'
    valid      = IntPSQ.valid

instance forall k. Ord k => PSQ (OrdPSQ.OrdPSQ k) where
    type Key (OrdPSQ.OrdPSQ k) = k

    null       = OrdPSQ.null
    size       = OrdPSQ.size
    member     = OrdPSQ.member
    lookup     = OrdPSQ.lookup
    findMin    = OrdPSQ.findMin
    empty      = OrdPSQ.empty
    singleton  = OrdPSQ.singleton
    insert     = OrdPSQ.insert
    delete     = OrdPSQ.delete
    deleteMin  = OrdPSQ.deleteMin
    alter      = OrdPSQ.alter
    alterMin   = OrdPSQ.alterMin
    fromList   = OrdPSQ.fromList
    toList     = OrdPSQ.toList
    keys       = OrdPSQ.keys
    insertView = OrdPSQ.insertView
    deleteView = OrdPSQ.deleteView
    minView    = OrdPSQ.minView
    atMostView = OrdPSQ.atMostView
    map        = OrdPSQ.map
    fold'      = OrdPSQ.fold'
    valid      = OrdPSQ.valid

instance forall k. (Hashable k, Ord k) => PSQ (HashPSQ.HashPSQ k) where
    type Key (HashPSQ.HashPSQ k) = k

    null       = HashPSQ.null
    size       = HashPSQ.size
    member     = HashPSQ.member
    lookup     = HashPSQ.lookup
    findMin    = HashPSQ.findMin
    empty      = HashPSQ.empty
    singleton  = HashPSQ.singleton
    insert     = HashPSQ.insert
    delete     = HashPSQ.delete
    deleteMin  = HashPSQ.deleteMin
    alter      = HashPSQ.alter
    alterMin   = HashPSQ.alterMin
    fromList   = HashPSQ.fromList
    toList     = HashPSQ.toList
    keys       = HashPSQ.keys
    insertView = HashPSQ.insertView
    deleteView = HashPSQ.deleteView
    minView    = HashPSQ.minView
    atMostView = HashPSQ.atMostView
    map        = HashPSQ.map
    fold'      = HashPSQ.fold'
    valid      = HashPSQ.valid