{-# LANGUAGE OverloadedStrings #-} module CoinbasePro.MarketData.FullOrderBook ( FullOrderBook (..) , Order (..) ) where import Data.Aeson (FromJSON (..), withArray, withObject, (.:)) import qualified Data.Vector as V import CoinbasePro.Types (OrderId (..), Price, Size) data FullOrderBook = FullOrderBook { FullOrderBook -> Int sequence :: Int , FullOrderBook -> [Order] bids :: [Order] , FullOrderBook -> [Order] asks :: [Order] } deriving (FullOrderBook -> FullOrderBook -> Bool forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a /= :: FullOrderBook -> FullOrderBook -> Bool $c/= :: FullOrderBook -> FullOrderBook -> Bool == :: FullOrderBook -> FullOrderBook -> Bool $c== :: FullOrderBook -> FullOrderBook -> Bool Eq, Eq FullOrderBook FullOrderBook -> FullOrderBook -> Bool FullOrderBook -> FullOrderBook -> Ordering FullOrderBook -> FullOrderBook -> FullOrderBook forall a. Eq a -> (a -> a -> Ordering) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> a) -> (a -> a -> a) -> Ord a min :: FullOrderBook -> FullOrderBook -> FullOrderBook $cmin :: FullOrderBook -> FullOrderBook -> FullOrderBook max :: FullOrderBook -> FullOrderBook -> FullOrderBook $cmax :: FullOrderBook -> FullOrderBook -> FullOrderBook >= :: FullOrderBook -> FullOrderBook -> Bool $c>= :: FullOrderBook -> FullOrderBook -> Bool > :: FullOrderBook -> FullOrderBook -> Bool $c> :: FullOrderBook -> FullOrderBook -> Bool <= :: FullOrderBook -> FullOrderBook -> Bool $c<= :: FullOrderBook -> FullOrderBook -> Bool < :: FullOrderBook -> FullOrderBook -> Bool $c< :: FullOrderBook -> FullOrderBook -> Bool compare :: FullOrderBook -> FullOrderBook -> Ordering $ccompare :: FullOrderBook -> FullOrderBook -> Ordering Ord, Int -> FullOrderBook -> ShowS [FullOrderBook] -> ShowS FullOrderBook -> String forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a showList :: [FullOrderBook] -> ShowS $cshowList :: [FullOrderBook] -> ShowS show :: FullOrderBook -> String $cshow :: FullOrderBook -> String showsPrec :: Int -> FullOrderBook -> ShowS $cshowsPrec :: Int -> FullOrderBook -> ShowS Show) instance FromJSON FullOrderBook where parseJSON :: Value -> Parser FullOrderBook parseJSON = forall a. String -> (Object -> Parser a) -> Value -> Parser a withObject String "orderbook" forall a b. (a -> b) -> a -> b $ \Object o -> Int -> [Order] -> [Order] -> FullOrderBook FullOrderBook forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> Object o forall a. FromJSON a => Object -> Key -> Parser a .: Key "sequence" forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b <*> Object o forall a. FromJSON a => Object -> Key -> Parser a .: Key "bids" forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b <*> Object o forall a. FromJSON a => Object -> Key -> Parser a .: Key "asks" data Order = Order { Order -> Price price :: Price , Order -> Size size :: Size , Order -> OrderId orderId :: OrderId } deriving (Order -> Order -> Bool forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a /= :: Order -> Order -> Bool $c/= :: Order -> Order -> Bool == :: Order -> Order -> Bool $c== :: Order -> Order -> Bool Eq, Eq Order Order -> Order -> Bool Order -> Order -> Ordering Order -> Order -> Order forall a. Eq a -> (a -> a -> Ordering) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> a) -> (a -> a -> a) -> Ord a min :: Order -> Order -> Order $cmin :: Order -> Order -> Order max :: Order -> Order -> Order $cmax :: Order -> Order -> Order >= :: Order -> Order -> Bool $c>= :: Order -> Order -> Bool > :: Order -> Order -> Bool $c> :: Order -> Order -> Bool <= :: Order -> Order -> Bool $c<= :: Order -> Order -> Bool < :: Order -> Order -> Bool $c< :: Order -> Order -> Bool compare :: Order -> Order -> Ordering $ccompare :: Order -> Order -> Ordering Ord, Int -> Order -> ShowS [Order] -> ShowS Order -> String forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a showList :: [Order] -> ShowS $cshowList :: [Order] -> ShowS show :: Order -> String $cshow :: Order -> String showsPrec :: Int -> Order -> ShowS $cshowsPrec :: Int -> Order -> ShowS Show) instance FromJSON Order where parseJSON :: Value -> Parser Order parseJSON = forall a. String -> (Array -> Parser a) -> Value -> Parser a withArray String "order" forall a b. (a -> b) -> a -> b $ \Array a -> do let l :: [Value] l = forall a. Vector a -> [a] V.toList Array a Price px <- forall a. FromJSON a => Value -> Parser a parseJSON forall a b. (a -> b) -> a -> b $ forall a. [a] -> a head [Value] l Size sz <- forall a. FromJSON a => Value -> Parser a parseJSON forall a b. (a -> b) -> a -> b $ [Value] l forall a. [a] -> Int -> a !! Int 1 OrderId oid <- forall a. FromJSON a => Value -> Parser a parseJSON forall a b. (a -> b) -> a -> b $ [Value] l forall a. [a] -> Int -> a !! Int 2 forall (m :: * -> *) a. Monad m => a -> m a return forall a b. (a -> b) -> a -> b $ Price -> Size -> OrderId -> Order Order Price px Size sz OrderId oid