16 import Prelude hiding (read)
17 import List hiding (insert)
20 new :: Int -> ST s (BoundedSet s a)
21 readBound :: BoundedSet s a -> ST s Int
22 readSize :: BoundedSet s a -> ST s Int
23 read :: BoundedSet s a -> ST s [a]
24 clear :: BoundedSet s a -> ST s [a]
25 insert :: BoundedSet s a -> [a] -> ST s ()
26 spaceAvail :: BoundedSet s a -> ST s Int
27 rmSuch :: BoundedSet s a -> (a -> Bool) -> ST s [a]
28 rmSuchN :: BoundedSet s a -> Int -> (a -> Bool) -> ST s [a]
29 iterateSet :: BoundedSet s a -> (a -> a) -> ST s ()
32 -- Implementation ----------------------------------------------------
33 type BoundedSet s a = (STRef s [a],Int)
41 read (s,n) = readSTRef s
45 ; let (yes,no) = partition f set
51 = do { such <- rmSuch s f
52 ; let (big,small) = splitAt n such
57 write :: BoundedSet s a -> [a] -> ST s ()
58 write (s,n) x = writeSTRef s x
61 readBound (s,n) = return n
64 = do { set <- newSTRef []
76 ; return ( length set)
80 = do { bnd <- readBound s
89 ; write s $ take n (set ++ l)