content: {-# LANGUAGE DataKinds, FlexibleContexts, TemplateHaskell, TypeApplications #-}
  -- | Demonstration of streaming data processing. Try building with
  -- cabal (@cabal build benchdemo@), then running in bash with
  -- something like,
  --
  -- @$ /usr/bin/time -l dist/build/benchdemo/benchdemo 2>&1 | head -n 4@
  -- Or, for cabal-install 3 (using Linux and GHC-8.8.2 as an example),
  -- @$ time dist-newstyle/build/x86_64-linux/ghc-8.8.2/Frames-0.6.2/x/benchdemo/build/benchdemo/benchdemo@
  -- Or, for all resource usage on linux (avoid the bash builtin time),
  -- @$ $(which time) -v dist-newstyle/build/x86_64-linux/ghc-8.8.2/Frames-0.6.2/x/benchdemo/build/benchdemo/benchdemo@
  import qualified Control.Foldl as F
  import Frames
  import Frames.TH (rowGen, RowGen (rowTypeName, inferencePrefix))
  import Pipes.Prelude (fold)
  
  -- The simple use of 'tableTypes' commented out here is what one
  -- typically uses; it infers column types based the first 1000 rows of
  -- the data file. In this data file, however, we need to see more rows
  -- to properly identify the types.
  
  -- tableTypes "Ins" "data/FL2.csv"
  tableTypes' (rowGen "data/FL2.csv") { rowTypeName = "Ins", inferencePrefix = 2500 }
  
  main :: IO ()
  main = do (lat,lng,n) <- runSafeT $ F.purely fold f (readTable "data/FL2.csv")
            print $ lat / n
            print $ lng / n
    where f :: F.Fold Ins (Double,Double,Double)
          f = (,,) <$> F.handles pointLatitude F.sum
                   <*> F.handles pointLongitude F.sum
                   <*> F.genericLength
  