packages feed

prettychart-0.1.0: src/Prettychart/ExampleData.hs

{-# LANGUAGE TemplateHaskell #-}

-- | Data for testing prettychart.
module Prettychart.ExampleData
  ( getReturns,
    taker,
  )
where

import Chart.FlatParse
import qualified Data.ByteString as BS
import qualified Data.ByteString.Char8 as C
import Data.Time.Calendar
import FlatParse.Basic (Parser, Result (OK), char, runParser)

dayP :: Parser e Day
dayP = do
  y <- int
  _ <- $(char '-')
  m <- int
  _ <- $(char '-')
  d <- int
  pure $ fromGregorian (fromIntegral y) m d

runParserError :: Parser e a -> BS.ByteString -> a
runParserError p bs = case runParser p bs of
  OK r _ -> r
  _ -> error "uncaught flatparse error"

dayReturnP :: Parser e (Day, Double)
dayReturnP = (,) <$> dayP <*> ($(char ',') *> signed double)

-- | Read and parse example data, which is daily stock market returns since 1980.
getReturns :: IO [(Day, Double)]
getReturns = do
  bs <- BS.readFile "other/returns.csv"
  pure $ runParserError dayReturnP <$> C.lines bs

-- | Take the last n of a list.
taker :: Int -> [a] -> [a]
taker n = reverse . take n . reverse