11{-# LANGUAGE NamedFieldPuns #-}
22{-# LANGUAGE ScopedTypeVariables #-}
3+ {-# LANGUAGE TupleSections #-}
34
45-- | The module should be imported qualified.
56--
@@ -16,13 +17,11 @@ module Ouroboros.Network.TxSubmission.Mempool.Simple
1617import Prelude hiding (read , seq )
1718
1819import Control.Concurrent.Class.MonadSTM.Strict
19- import Control.Monad (filterM )
20- import Control.Monad.Class.MonadTime.SI
21-
20+ import Data.Bifunctor (bimap )
21+ import Data.Either
2222import Data.Foldable (toList )
2323import Data.Foldable qualified as Foldable
24- import Data.Function (on )
25- import Data.List (find , nubBy )
24+ import Data.List (find )
2625import Data.Maybe (isJust )
2726import Data.Sequence (Seq )
2827import Data.Sequence qualified as Seq
@@ -102,9 +101,8 @@ getReader getTxId getTxSize (Mempool mempool) =
102101
103102-- | A simple mempool writer.
104103--
105- getWriter :: forall tx txid ctx metadata m .
104+ getWriter :: forall tx txid ctx failure m .
106105 ( MonadSTM m
107- , MonadTime m
108106 , Ord txid
109107 )
110108 => (tx -> txid )
@@ -121,38 +119,22 @@ getWriter getTxId acquireCtx validateTx failureFilterFn (Mempool mempool) =
121119 TxSubmissionMempoolWriter {
122120 txId = getTxId,
123121
124- -- let metaTxs = getMetaData <$> txs
125- -- now <- getCurrentTime
126- -- atomically $ do
127- -- mempoolTxs <- readTVar mempool
128- -- let currentIds = Set.fromList (map getTxId (toList mempoolTxs))
129- -- validTxs <- fmap (fmap fst <$> nubBy ((==) `on` getTxId . fst))
130- -- . filterM
131- -- (\(tx, meta) -> do
132- -- valid <- validateTx now meta
133- -- return $ valid && getTxId tx `Set.notMember` currentIds)
134- -- $ zip txs metaTxs
135- -- let mempoolTxs' = Foldable.foldl' (Seq.|>) mempoolTxs validTxs
136- -- writeTVar mempool mempoolTxs'
137122 mempoolAddTxs = \ txs -> do
138123 ctx <- acquireCtx
139- (invalidTxIds, validTxs) <- atomically $ do
124+ atomically $ do
140125 MempoolSeq { mempoolSet, mempoolSeq } <- readTVar mempool
141- let (invalidTxIds, validTxs) =
142- first (filter (failureFilterFn . snd ))
143- . partitionEithers
144- . map (\ tx -> case validateTx ctx tx of
145- Left e -> Left (getTxId tx, e)
146- Right _ -> Right tx
147- )
148- . filter (\ tx -> getTxId tx `Set.notMember` mempoolSet)
149- $ txs
150- mempoolTxs' = MempoolSeq {
151- mempoolSet = Foldable. foldl' (\ s tx -> getTxId tx `Set.insert` s)
152- mempoolSet
153- validTxs,
154- mempoolSeq = Foldable. foldl' (Seq. |>) mempoolSeq validTxs
155- }
126+ (invalidTxIds, (validIds, validTxs)) <-
127+ bimap (filter (failureFilterFn . snd )) unzip
128+ . partitionEithers <$>
129+ sequence [bimap (txid,) (const (txid, tx)) <$> validateTx ctx tx
130+ | tx <- txs
131+ , let txid = getTxId tx
132+ , txid `Set.notMember` mempoolSet
133+ ]
134+ let mempoolTxs' = MempoolSeq {
135+ mempoolSet = Set. union mempoolSet (Set. fromList validIds),
136+ mempoolSeq = Foldable. foldl' (Seq. |>) mempoolSeq validTxs
137+ }
156138 writeTVar mempool mempoolTxs'
157- return ( map getTxId validTxs)
139+ return validIds
158140 }
0 commit comments