packages feed

hid-examples-0.1.0.0: stockquotes/HtmlReport.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}

module HtmlReport (htmlReport) where

import Data.Foldable (traverse_)
import Data.Semigroup ((<>))
import Data.ByteString.Lazy (ByteString)
import Text.Blaze.Html5 as H 
import Text.Blaze.Html5.Attributes (src)
import Text.Blaze.Html.Renderer.Utf8 (renderHtml)

import QuoteData
import StatReport (showStatEntryValue)
import Statistics
import Fmt

htmlReport :: (Functor t, Foldable t) =>
              String -> t QuoteData -> StatInfo -> [FilePath] -> ByteString
htmlReport title quotes si images = renderHtml $ docTypeHtml $ do
     H.head $ do
       H.title $ string title
       H.style style
     body $ do
       renderDiagrams images
       renderStatInfo si
       renderData quotes
  where
    style = "table {border-collapse: collapse}" <>
            "td, th {border: 1px solid black; padding: 3px}"

    renderDiagrams [] = pure ()
    renderDiagrams images = do
      h1 "Diagrams"
      traverse_ ((img!).src.toValue) images

    renderStatInfo [] = pure ()
    renderStatInfo si@((_, ses):_) = do
      h1 "Statistics Report"
      table $ do
         thead $ tr $ traverse_ th
               $ "Quotes Field" : [text $ fmt $ build $ stat s | s <- ses]
         tbody $ traverse_ statData2TR si

    statData2TR (qf, entries) = tr $ do
      td $ string $ show qf
      traverse_ (td.string.showStatEntryValue) entries

    renderData quotes = do
      h1 "Stock Quotes Data"
      table $ do
         thead $ tr
               $ traverse_ th ["Day", "Close", "Volume", "Open", "High", "Low"]
         tbody $ traverse_ quoteData2TR quotes

    quoteData2TR QuoteData {..} = tr $ do
      td $ string $ show day
      traverse_ (td.string.show) [close, volume, open, high, low]