{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE OverloadedStrings          #-}
{-# LANGUAGE TemplateHaskell            #-}

module CoinbasePro.WebSocketFeed.Channel.Full.Done
    ( Done (..)
    ) where

import           Data.Aeson        (FromJSON, parseJSON)
import           Data.Aeson.Casing (snakeCase)
import           Data.Aeson.TH     (defaultOptions, deriveJSON,
                                    fieldLabelModifier)
import           Data.Text         (Text)
import           Data.Time.Clock   (UTCTime)

import           CoinbasePro.Types (OrderId, Price, ProductId, ProfileId,
                                    Sequence, Side, Size, UserId)


type Reason = Text

newtype RemainingSize = RemainingSize { RemainingSize -> Maybe Size
unRemainingSize :: Maybe Size }
    deriving (RemainingSize -> RemainingSize -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: RemainingSize -> RemainingSize -> Bool
$c/= :: RemainingSize -> RemainingSize -> Bool
== :: RemainingSize -> RemainingSize -> Bool
$c== :: RemainingSize -> RemainingSize -> Bool
Eq, Eq RemainingSize
RemainingSize -> RemainingSize -> Bool
RemainingSize -> RemainingSize -> Ordering
RemainingSize -> RemainingSize -> RemainingSize
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 :: RemainingSize -> RemainingSize -> RemainingSize
$cmin :: RemainingSize -> RemainingSize -> RemainingSize
max :: RemainingSize -> RemainingSize -> RemainingSize
$cmax :: RemainingSize -> RemainingSize -> RemainingSize
>= :: RemainingSize -> RemainingSize -> Bool
$c>= :: RemainingSize -> RemainingSize -> Bool
> :: RemainingSize -> RemainingSize -> Bool
$c> :: RemainingSize -> RemainingSize -> Bool
<= :: RemainingSize -> RemainingSize -> Bool
$c<= :: RemainingSize -> RemainingSize -> Bool
< :: RemainingSize -> RemainingSize -> Bool
$c< :: RemainingSize -> RemainingSize -> Bool
compare :: RemainingSize -> RemainingSize -> Ordering
$ccompare :: RemainingSize -> RemainingSize -> Ordering
Ord, Int -> RemainingSize -> ShowS
[RemainingSize] -> ShowS
RemainingSize -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [RemainingSize] -> ShowS
$cshowList :: [RemainingSize] -> ShowS
show :: RemainingSize -> String
$cshow :: RemainingSize -> String
showsPrec :: Int -> RemainingSize -> ShowS
$cshowsPrec :: Int -> RemainingSize -> ShowS
Show)


instance FromJSON RemainingSize where
    parseJSON :: Value -> Parser RemainingSize
parseJSON = (Maybe Size -> RemainingSize
RemainingSize forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. FromJSON a => Value -> Parser a
parseJSON


data Done = Done
    { Done -> UTCTime
time          :: UTCTime
    , Done -> ProductId
productId     :: ProductId
    , Done -> Int
sequence      :: Sequence
    , Done -> Maybe Price
price         :: Maybe Price
    , Done -> OrderId
orderId       :: OrderId
    , Done -> Reason
reason        :: Reason
    , Done -> Side
side          :: Side
    , Done -> Maybe Size
remainingSize :: Maybe Size
    , Done -> Maybe Reason
userId        :: Maybe UserId
    , Done -> Maybe Reason
profileId     :: Maybe ProfileId
    } deriving (Done -> Done -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Done -> Done -> Bool
$c/= :: Done -> Done -> Bool
== :: Done -> Done -> Bool
$c== :: Done -> Done -> Bool
Eq, Eq Done
Done -> Done -> Bool
Done -> Done -> Ordering
Done -> Done -> Done
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 :: Done -> Done -> Done
$cmin :: Done -> Done -> Done
max :: Done -> Done -> Done
$cmax :: Done -> Done -> Done
>= :: Done -> Done -> Bool
$c>= :: Done -> Done -> Bool
> :: Done -> Done -> Bool
$c> :: Done -> Done -> Bool
<= :: Done -> Done -> Bool
$c<= :: Done -> Done -> Bool
< :: Done -> Done -> Bool
$c< :: Done -> Done -> Bool
compare :: Done -> Done -> Ordering
$ccompare :: Done -> Done -> Ordering
Ord, Int -> Done -> ShowS
[Done] -> ShowS
Done -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Done] -> ShowS
$cshowList :: [Done] -> ShowS
show :: Done -> String
$cshow :: Done -> String
showsPrec :: Int -> Done -> ShowS
$cshowsPrec :: Int -> Done -> ShowS
Show)


deriveJSON defaultOptions {fieldLabelModifier = snakeCase} ''Done