Skip to content

Commit 1b117bc

Browse files
committed
io-sim: remove dependency on deque package
It doesn't seem to be well maintained.
1 parent 9f13703 commit 1b117bc

File tree

4 files changed

+48
-9
lines changed

4 files changed

+48
-9
lines changed

io-sim/io-sim.cabal

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,8 @@ library
5656
Control.Monad.IOSimPOR.Internal,
5757
Control.Monad.IOSimPOR.Types,
5858
Control.Monad.IOSimPOR.QuickCheckUtils,
59-
Control.Monad.IOSimPOR.Timeout
59+
Control.Monad.IOSimPOR.Timeout,
60+
Data.Deque.Strict
6061
default-language: Haskell2010
6162
other-extensions: BangPatterns,
6263
CPP,
@@ -79,7 +80,6 @@ library
7980
io-classes ^>=1.0,
8081
exceptions >=0.10,
8182
containers,
82-
deque,
8383
nothunks,
8484
parallel,
8585
psqueues >=0.2 && <0.3,

io-sim/src/Control/Monad/IOSim/Internal.hs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,8 @@ import qualified Data.OrdPSQ as PSQ
5555
import Data.Set (Set)
5656
import qualified Data.Set as Set
5757
import Data.Time (UTCTime (..), fromGregorian)
58-
import Deque.Strict (Deque)
59-
import qualified Deque.Strict as Deque
60-
61-
import GHC.Exts (fromList)
58+
import Data.Deque.Strict (Deque)
59+
import qualified Data.Deque.Strict as Deque
6260

6361
import Control.Exception (NonTermination (..), assert, throw)
6462
import Control.Monad (join, when)
@@ -828,7 +826,7 @@ unblockThreads !onlySTM !wakeup !simstate@SimState {runqueue, threads} =
828826
-- To preserve our invariants (that threadBlocked is correct)
829827
-- we update the runqueue and threads together here
830828
(unblocked, simstate {
831-
runqueue = runqueue <> fromList unblocked,
829+
runqueue = runqueue <> Deque.fromList unblocked,
832830
threads = threads'
833831
})
834832
where

io-sim/src/Control/Monad/IOSim/STM.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ import Control.Monad.Class.MonadThrow
2121

2222
import Numeric.Natural (Natural)
2323

24-
import Deque.Strict (Deque)
25-
import qualified Deque.Strict as Deque
24+
import Data.Deque.Strict (Deque)
25+
import qualified Data.Deque.Strict as Deque
2626

2727
--
2828
-- Default TQueue implementation in terms of a 'TVar' (used by sim)

io-sim/src/Data/Deque/Strict.hs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
{-# LANGUAGE LambdaCase #-}
2+
3+
-- | A minimal implementation of a strict deque.
4+
--
5+
module Data.Deque.Strict where
6+
7+
import Prelude hiding (head, init, tail)
8+
import Data.Foldable (foldl', foldr')
9+
import qualified Data.List as List
10+
11+
data Deque a = Deque ![a] ![a]
12+
13+
instance Semigroup (Deque a) where
14+
Deque as bs <> Deque as' bs' =
15+
Deque as (bs' ++ reverse as' ++ bs)
16+
17+
instance Monoid (Deque a) where
18+
mempty = Deque [] []
19+
20+
instance Foldable Deque where
21+
foldr step init (Deque head tail) =
22+
foldr step (foldl' (flip step) init tail) head
23+
foldl' step init (Deque head tail) =
24+
foldr' (flip step) (foldl' step init head) tail
25+
26+
fromList :: [a] -> Deque a
27+
fromList as = Deque as []
28+
29+
snoc :: a -> Deque a -> Deque a
30+
snoc a (Deque as bs) = Deque as (a : bs)
31+
32+
uncons :: Deque a -> Maybe (a, Deque a)
33+
uncons = \case
34+
Deque (a : head') tail -> Just (a, Deque head' tail)
35+
Deque [] tail ->
36+
case reverse tail of
37+
(a : head') -> Just (a, Deque head' [])
38+
[] -> Nothing
39+
40+
filter :: (a -> Bool) -> Deque a -> Deque a
41+
filter f (Deque head tail) = Deque (List.filter f head) (List.filter f tail)

0 commit comments

Comments
 (0)