content: {-# LANGUAGE BlockArguments #-}
  {-# LANGUAGE DataKinds #-}
  {-# LANGUAGE OverloadedStrings #-}
  {-# LANGUAGE TypeApplications #-}
  
  module Main where
  
  import qualified Control.Concurrent as Concurrent
  import qualified Control.Concurrent.Chan as Chan
  import Control.Monad
  import qualified Data.Binary.Builder as Builder
  import qualified Data.Text as Text
  import qualified Network.HTTP.Types as HTTP
  import qualified Network.Wai as Wai
  import qualified Network.Wai.EventSource as Wai
  import qualified Network.Wai.Handler.Warp as Warp
  import Okapi.App
  import Okapi.Response
  import qualified Web.HttpApiData as Web
  
  ticker :: Chan.Chan Wai.ServerEvent -> Node '[]
  ticker source =
      choice
          [ lit "connect" $ events source
          ]
  
  tick source = do
      let event =
              Wai.ServerEvent
                  { Wai.eventName = Nothing
                  , Wai.eventId = Nothing
                  , Wai.eventData = [Builder.putStringUtf8 "tick"]
                  }
      forever do
          Concurrent.threadDelay (1 * (10 ^ 6))
          print "Sending"
          Chan.writeChan source event
  
  main = do
      source <- Chan.newChan
      Concurrent.forkIO $ tick source
      Warp.run 8003
          . withDefault (ticker source)
          $ \_ resp -> resp $ Wai.responseLBS HTTP.status404 [] "Not Found..."
  