module Network.GDAX.Feed
    ( module Core
    , module Exceptions
    , module Feed
    , module Shared

    , defaultClient
    ) where

import           Control.Monad.Catch
import qualified Data.Aeson                as Aeson
import qualified Data.Text                 as T
import           Network.GDAX.Core         as Core
import           Network.GDAX.Exceptions   as Exceptions
import           Network.GDAX.Types.Feed   as Feed
import           Network.GDAX.Types.Shared as Shared
import           Network.WebSockets

defaultClient :: Subscriptions -> (GdaxMessage -> IO b) -> Connection -> IO b
defaultClient subs handler conn = do
    sendTextData conn (Aeson.encode (Subscribe subs))
    loop
    where
        loop = do
            res <- receiveData conn
            let asSum = Aeson.eitherDecode res :: Either String GdaxMessage
            case asSum of
                Left er -> throwM $ MalformedGdaxResponse $ T.pack er
                Right v -> handler v >> loop