packages feed

monomer-1.0.0.0: examples/ticker/BinanceTypes.hs

{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}

module BinanceTypes where

import Control.Applicative ((<|>))
import Control.Concurrent.STM.TChan
import Control.Lens.TH
import Data.Aeson
import Data.Default
import Data.Foldable (asum)
import Data.Maybe
import Data.Map (Map)
import Data.Scientific
import Data.Text (Text, pack)

data ServerRequest = ServerRequest {
  _srqRequestId :: Int,
  _srqMethod :: Text,
  _srqParams :: [Text]
} deriving (Eq, Show)

instance ToJSON ServerRequest where
  toJSON (ServerRequest reqId method params) = object [
    "id" .= reqId,
    "method" .= method,
    "params" .= params
    ]

data ServerResponse = ServerResponse {
  _srpRequestId :: Int,
  _srpResult :: [Text]
} deriving (Eq, Show)

instance FromJSON ServerResponse where
  parseJSON = withObject "response" $ \o -> do
    _srpRequestId <- o .: "id"
    _srpResult <- o .: "result" <|> pure []

    return ServerResponse{..}

data ServerError = ServerError {
  _sveCode :: Int,
  _sveMessage :: Text
} deriving (Eq, Show)

instance FromJSON ServerError where
  parseJSON = withObject "error" $ \o -> do
    _sveCode <- o .: "code"
    _sveMessage <- o .: "msg"

    return ServerError{..}

data Ticker = Ticker {
  _tckSymbolPair :: Text,
  _tckTs :: Int,
  _tckOpen :: Scientific,
  _tckClose :: Scientific,
  _tckHigh :: Scientific,
  _tckLow :: Scientific,
  _tckVolume :: Scientific,
  _tckTrades :: Scientific
} deriving (Eq, Show)

instance FromJSON Ticker where
  parseJSON = withObject "ticker" $ \o -> do
    _tckSymbolPair <- o .: "s"
    _tckTs <- o .: "E"
    _tckOpen <- read <$> o .: "o"
    _tckClose <- read <$> o .: "c"
    _tckHigh <- read <$> o .: "h"
    _tckLow <- read <$> o .: "l"
    _tckVolume <- read <$> o .: "v"
    _tckTrades <- read <$> o .: "q"

    return Ticker{..}

data ServerMsg
  = MsgResponse ServerResponse
  | MsgError ServerError
  | MsgTicker Ticker
  deriving (Eq, Show)

instance FromJSON ServerMsg where
  parseJSON v = asum [
    MsgResponse <$> parseJSON v,
    MsgError <$> parseJSON v,
    MsgTicker <$> parseJSON v
    ]

makeLensesWith abbreviatedFields 'Ticker