module Session where import IO import System import IOExts import Array import Foreign import CForeign data Session = Session {stockId, date, sessionId :: Int, lowestValue, highestValue, lastValue, averageValue, lot, volume :: Float} deriving (Eq, Show) emptySession = Session { stockId = 0, date = 0, sessionId = 0, lowestValue = 0, highestValue = 0, lastValue = 0, averageValue = 0, lot = 0, volume = 0 } readSession :: Handle -> IO (Maybe Session) readSession h = do eof <- hIsEOF h if eof then return Nothing else do buf <- mallocArray 73:: IO (Ptr CChar) readChars <- hGetBuf h buf 73 -- putStrLn ("read " ++ (show readChars)) let sidptr = castPtr buf :: Ptr CShort dateptr = castPtr (plusPtr buf 2) :: Ptr CUInt sesptr = (plusPtr buf 6) :: Ptr CChar ptr = castPtr (plusPtr buf 7) :: Ptr CLLong in do stockid <- peek sidptr date <- peek dateptr sessid <- peek sesptr rec <- peekArray 8 ptr -- destructArray 73 buf let list = map (\x -> (fromIntegral x) / 10000) rec :: [Float] vals = array (1,8) (zip [1..8] list) in return (Just Session {stockId = (fromIntegral stockid), date = (fromIntegral date), sessionId = (fromIntegral sessid), lowestValue = vals!1, highestValue = vals!2, lastValue = vals!3, averageValue = vals!4, lot = vals!5, volume = vals!6 })