packages feed

Frames-0.6.2: demo/framestack/app/Main.hs

{-# LANGUAGE BangPatterns, DataKinds, TemplateHaskell #-}
{-# LANGUAGE FlexibleContexts, TypeApplications, TypeOperators #-}
module Main where
import Data.Functor.Identity
import Frames
import Lens.Micro
import qualified Pipes as P
import qualified Pipes.Prelude as P

tableTypes "Row" "data/data1.csv"

tbl :: IO [Row]
tbl = runSafeT . P.toListM $ readTable "data/data1.csv"


ageDoubler :: (Age ∈ rs) => Record rs -> Record rs
ageDoubler = age %~ (* 2)

tbl2 :: IO [Row]
tbl2 = runSafeT . P.toListM $ readTable "data/data2.csv"

tbl2a :: IO [ColFun Maybe Row]
tbl2a = runSafeT . P.toListM $ readTableMaybe "data/data2.csv"

-- Sample data from http://support.spatialkey.com/spatialkey-sample-csv-data/
-- Note: We have to replace carriage returns (\r) with line feed
-- characters (\n) for the text library's line parsing to work.
tableTypes "Ins" "data/FL2.csv"

insuranceTbl :: MonadSafe m => P.Producer Ins m ()
insuranceTbl = readTable "data/FL2.csv"

insMaybe :: MonadSafe m => P.Producer (ColFun Maybe Ins) m ()
insMaybe = readTableMaybe "data/FL2.csv"

type TinyIns = Record [PolicyID, PointLatitude, PointLongitude]

main :: IO ()
main = do itbl <- inCore $ P.for insuranceTbl (P.yield . rcast)
            :: IO (P.Producer TinyIns Identity ())
          putStrLn "In-core representation prepared"
          let Identity (n,sumLat) =
                P.fold (\ !(!i,!s) r -> (i+1, s+rgetField @PointLatitude r))
                       (0::Int,0)
                       id
                       itbl
          putStrLn $ "Considering " ++ show n ++ " records..."
          putStrLn $ "Average latitude: " ++ show (sumLat / fromIntegral n)
          let Identity sumLong =
                P.fold (\ !s r -> (s + rgetField @PointLongitude r)) 0 id itbl
          putStrLn $ "Average longitude: " ++ show (sumLong / fromIntegral n)