{-# LANGUAGE
    NamedFieldPuns
  #-}

module Network.WebSockets.Simple.Logger where

import Network.WebSockets.Simple (WebSocketsApp (..), WebSocketsAppParams (..))
import Control.Monad.IO.Class (MonadIO, liftIO)


logStdout :: MonadIO m
          => Show receive
          => Show send
          => WebSocketsApp m receive send
          -> WebSocketsApp m receive send
logStdout WebSocketsApp{onOpen,onReceive,onClose} =
  WebSocketsApp
    { onOpen = onOpen . newParams
    , onReceive = \params x -> do
        liftIO $ putStrLn $ "Received: " ++ show x
        onReceive (newParams params) x
    , onClose
    }
  where
    newParams WebSocketsAppParams{send,close} =
      WebSocketsAppParams
        { send = \x -> do
            liftIO $ putStrLn $ "Sent: " ++ show x
            send x
        , close
        }