1
1
module Development.IDE.Session.OrderedSet where
2
2
3
- import Control.Concurrent.STM (STM , TQueue , flushTQueue ,
4
- newTQueueIO )
3
+ import Control.Concurrent.STM (STM , TQueue , newTQueueIO )
5
4
import Control.Concurrent.STM.TQueue (readTQueue , writeTQueue )
6
5
import Control.Monad (when )
7
6
import Data.Hashable (Hashable )
@@ -12,13 +11,16 @@ import qualified StmContainers.Set as S
12
11
import StmContainers.Set (Set )
13
12
14
13
15
- type OrderedSet a = (TQueue a , Set a )
14
+ data OrderedSet a = OrderedSet
15
+ { insertionOrder :: TQueue a
16
+ , elements :: Set a
17
+ }
16
18
17
19
-- | Insert an element into the ordered set.
18
20
-- If the element is not already present, it is added to both the queue and set.
19
21
-- If the element already exists, ignore it
20
22
insert :: Hashable a => a -> OrderedSet a -> STM ()
21
- insert a (que, s) = do
23
+ insert a (OrderedSet que s) = do
22
24
(_, inserted) <- S. focus (Focus. testingIfInserts $ Focus. insert () ) a s
23
25
-- if already in the set
24
26
when inserted $ writeTQueue que a
@@ -27,26 +29,26 @@ newIO :: Hashable a => IO (OrderedSet a)
27
29
newIO = do
28
30
que <- newTQueueIO
29
31
s <- S. newIO
30
- return (que, s)
32
+ return (OrderedSet que s)
31
33
32
34
-- | Read the first element from the queue.
33
35
-- If an element is not in the set, it means it has been deleted,
34
36
-- so we retry until we find a valid element that exists in the set.
35
37
readQueue :: Hashable a => OrderedSet a -> STM a
36
- readQueue rs@ (que, s) = do
38
+ readQueue rs@ (OrderedSet que s) = do
37
39
f <- readTQueue que
38
40
b <- S. lookup f s
39
41
-- retry if no files are left in the queue
40
42
if b then return f else readQueue rs
41
43
42
44
lookup :: Hashable a => a -> OrderedSet a -> STM Bool
43
- lookup a (_, s) = S. lookup a s
45
+ lookup a (OrderedSet _ s) = S. lookup a s
44
46
45
47
-- | Delete an element from the set.
46
48
-- The queue is not modified directly; stale entries are filtered out lazily
47
49
-- during reading operations (see 'readQueue').
48
50
delete :: Hashable a => a -> OrderedSet a -> STM ()
49
- delete a (_, s) = S. delete a s
51
+ delete a (OrderedSet _ s) = S. delete a s
50
52
51
53
toHashSet :: Hashable a => OrderedSet a -> STM (Data.HashSet. HashSet a )
52
- toHashSet (_, s) = Data.HashSet. fromList <$> LT. toList (S. listT s)
54
+ toHashSet (OrderedSet _ s) = Data.HashSet. fromList <$> LT. toList (S. listT s)
0 commit comments