packages feed

hid-examples-0.1.0.0: stockquotes/QuoteData.hs

{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE DeriveGeneric, DeriveAnyClass #-}

module QuoteData where

import Data.Fixed (HasResolution (..), Fixed)
import Data.Time (Day, parseTimeM, defaultTimeLocale)
import Safe (readDef)
import Data.ByteString.Char8 (unpack)
import GHC.Generics (Generic)
import Data.Csv (FromNamedRecord, FromField (..))

import BoundedEnum

data E4
  
instance HasResolution E4 where
    resolution _ = 10000

type Fixed4 = Fixed E4

data QuoteData = QuoteData {
                   day :: Day,
                   close :: Fixed4,
                   volume :: Fixed4,
                   open :: Fixed4,
                   high :: Fixed4,
                   low :: Fixed4
                 }
  deriving (Generic, FromNamedRecord)

instance FromField Fixed4 where
  parseField = pure . readDef 0 . unpack

instance FromField Day where
  parseField = parseTimeM False defaultTimeLocale "%Y/%m/%d" . unpack

data QField = Open | Close | High | Low | Volume
  deriving (Show, Enum, Bounded, BoundedEnum)

field2fun :: QField -> QuoteData -> Fixed4
field2fun Open = open
field2fun Close = close
field2fun High = high
field2fun Low = low
field2fun Volume = volume