-
Notifications
You must be signed in to change notification settings - Fork 0
/
DailyChart.hs
34 lines (28 loc) · 1.11 KB
/
DailyChart.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
{-# LANGUAGE OverloadedStrings #-}
module DailyChart
( fromFile
, DailyChart(..)
) where
import Control.Applicative ((<$>), (<*>))
import qualified Data.ByteString.Lazy as L (readFile)
import Data.Csv (FromNamedRecord(..), decodeByName, (.:))
import Data.Time.Calendar (Day)
import Data.Time.Format (readTime)
import Data.Vector (Vector)
import System.Locale (defaultTimeLocale)
data DailyChart = DailyChart { date :: Day, open, close :: Int } deriving Show
instance FromNamedRecord DailyChart where
parseNamedRecord m =
dailyChart <$> m .: "date" <*> m .: "open" <*> m .: "close"
where
dailyChart d o c = DailyChart (readDate d) (readPrice o) (readPrice c)
readDate :: String -> Day
readDate = readTime defaultTimeLocale "%-m/%-d/%y"
readPrice :: String -> Int
readPrice = read . filter (','/=)
fromFile :: FilePath -> IO (Vector DailyChart)
fromFile path = do
file <- L.readFile path
case decodeByName file of
Left e -> error e
Right (_header, v) -> return v