module Main where
programmingPerformance file =
let filteredFile = filter filterLine (lines file)
filterLine [] = False
filterLine ('#':_) = False
filterLine _ = True
closingList = reverse (map extractClosing filteredFile) :: [Double]
extractClosing line = read ((tokenize line) !! 6)
tokenize [] = []
tokenize line = let (token, rest) = getToken line in token : tokenize rest
getToken [] = ("", [])
getToken (' ':xs) = ("", xs)
getToken (x :xs) = let (token, rest) = getToken xs in (x:token, rest)
result = parseClosingSell 10000.0 [] closingList
parseClosingSell :: Double -> [(Double, Double)] -> [Double] -> Double
parseClosingSell cash shares c@(_:y:rest) =
let (sale, remShares) = foldr maybeSell (0, []) shares
maybeSell (shClosing, shNum) (accCash, accShares) | (y - shClosing) >= shClosing * 0.06 = (accCash + y * shNum, accShares)
maybeSell sh (accCash, accShares) = (accCash , sh:accShares)
in parseClosingBuy (cash + sale) remShares c
parseClosingSell cash shares [y] =
let sale = foldr sell 0 shares
sell (shClosing, shNum) accCash = accCash + y * shNum
in cash + sale
parseClosingBuy cash shares (x:y:rest) | (x - y) >= x * 0.03 = parseClosingSell (cash * 0.90) ((y, cash*0.10 / y):shares) (y:rest)
parseClosingBuy cash shares (x:rest) = parseClosingSell cash shares rest
in result
main = do
file <- readFile "C:\\JCAB\\ProgrammingPerformance\\gspc.txt"
let result = programmingPerformance file
print result