5 changed files with 147 additions and 60 deletions
@ -0,0 +1,58 @@
@@ -0,0 +1,58 @@
|
||||
|
||||
module MockBroker ( |
||||
MockBrokerState(..), |
||||
mockSubmitOrder, |
||||
mockCancelOrder, |
||||
mockStopBroker, |
||||
mkMockBroker |
||||
) where |
||||
|
||||
import ATrade.Types |
||||
import ATrade.Broker.Protocol |
||||
import ATrade.Broker.Server |
||||
import ATrade.Util |
||||
import Data.IORef |
||||
import qualified Data.List as L |
||||
|
||||
data MockBrokerState = MockBrokerState { |
||||
orders :: [Order], |
||||
cancelledOrders :: [Order], |
||||
notificationCallback :: Maybe (Notification -> IO ()) |
||||
} |
||||
|
||||
mockSubmitOrder :: IORef MockBrokerState -> Order -> IO () |
||||
mockSubmitOrder state order = do |
||||
atomicMapIORef state (\s -> s { orders = submittedOrder : orders s }) |
||||
maybeCb <- notificationCallback <$> readIORef state |
||||
case maybeCb of |
||||
Just cb -> cb $ OrderNotification (orderId order) Submitted |
||||
Nothing -> return () |
||||
where |
||||
submittedOrder = order { orderState = Submitted } |
||||
|
||||
mockCancelOrder :: IORef MockBrokerState -> OrderId -> IO Bool |
||||
mockCancelOrder state oid = do |
||||
ors <- orders <$> readIORef state |
||||
case L.find (\o -> orderId o == oid) ors of |
||||
Just order -> atomicModifyIORef' state (\s -> (s { cancelledOrders = order : cancelledOrders s}, True)) |
||||
Nothing -> return False |
||||
|
||||
mockStopBroker :: IORef MockBrokerState -> IO () |
||||
mockStopBroker state = return () |
||||
|
||||
|
||||
mkMockBroker accs = do |
||||
state <- newIORef MockBrokerState { |
||||
orders = [], |
||||
cancelledOrders = [], |
||||
notificationCallback = Nothing |
||||
} |
||||
|
||||
return (BrokerInterface { |
||||
accounts = accs, |
||||
setNotificationCallback = \cb -> atomicMapIORef state (\s -> s { notificationCallback = cb }), |
||||
submitOrder = mockSubmitOrder state, |
||||
cancelOrder = mockCancelOrder state, |
||||
stopBroker = mockStopBroker state |
||||
}, state) |
||||
|
||||
Loading…
Reference in new issue