{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeOperators #-}
module Main where
import Servant.API.WebSocketConduit (WebSocketConduit, WebSocketSource)
import Control.Concurrent (threadDelay)
import Control.Monad (forever)
import Control.Monad.IO.Class (MonadIO (..))
import Data.Aeson (Value (..))
import Data.Conduit (ConduitT, yield)
import Data.Text (Text)
import Network.Wai (Application)
import Network.Wai.Handler.Warp (run)
import Servant ((:<|>) (..), (:>), Proxy (..), Server, serve)
import qualified Data.Conduit.List as CL
type API = "echo" :> WebSocketConduit Value Value
:<|> "hello" :> WebSocketSource Text
startApp :: IO ()
startApp = do
putStrLn "Starting server on http://localhost:8080"
run 8080 app
app :: Application
app = serve api server
api :: Proxy API
api = Proxy
server :: Server API
server = echo :<|> hello
echo :: Monad m => ConduitT Value Value m ()
echo = CL.map id
hello :: MonadIO m => ConduitT () Text m ()
hello = forever $ do
yield "hello world"
liftIO $ threadDelay 1000000
main :: IO ()
main = startApp