1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
|
-- | 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
unsafeMapMonotonic
:: (Ord p, Ord q) => (Key psq -> p -> v -> (q, w)) -> psq p v -> psq q 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
unsafeMapMonotonic = IntPSQ.unsafeMapMonotonic
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
unsafeMapMonotonic = OrdPSQ.unsafeMapMonotonic
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
unsafeMapMonotonic = HashPSQ.unsafeMapMonotonic
fold' = HashPSQ.fold'
valid = HashPSQ.valid
|