cursedcsv 0.1.2 → 0.1.3
raw patch · 2 files changed
+34/−14 lines, 2 filesdep +conduitdep +conduit-extradep +csv-conduitdep −csv-enumeratordep −enumerator
Dependencies added: conduit, conduit-extra, csv-conduit, primitive, vector
Dependencies removed: csv-enumerator, enumerator
Files
- code/CursedCSV.hs +32/−12
- cursedcsv.cabal +2/−2
code/CursedCSV.hs view
@@ -7,17 +7,14 @@ module Main where -import Control.Applicative import Control.Arrow-import Control.Exception(throwIO) import Control.Monad.State.Strict import Data.Char(isSpace) import Data.ByteString.Char8(unpack,pack,ByteString) import qualified Data.ByteString.Char8 as B-import Data.CSV.Enumerator-import qualified Data.Enumerator as E-import Data.Enumerator (($$))-import Data.Enumerator.Binary (enumHandle)+import Data.CSV.Conduit+import qualified Data.Conduit as C+import qualified Data.Conduit.Binary as C import Data.Function(on) import Data.List(insertBy, intercalate, mapAccumL, sortBy, transpose, find) import Data.Maybe(fromMaybe, isNothing)@@ -26,10 +23,15 @@ import System.Exit import System.IO import Text.Regex.TDFA-import UI.HSCurses.Curses+import UI.HSCurses.Curses hiding (rs, bs) import UI.HSCurses.CursesHelper import qualified Algorithms.NaturalSort as NS import System.Console.ParseArgs+import qualified Data.Vector.Generic as GV+import qualified Data.Vector.Generic.Mutable as GMV+import Control.Monad.Primitive+import qualified Data.Vector as V+ #if defined(mingw32_HOST_OS) || defined(__MINGW32__) #else import System.Posix.Signals@@ -773,6 +775,26 @@ +sinkVector :: (PrimMonad m, GV.Vector v a) => Int -> C.ConduitM a o m (v a)+sinkVector by = do+ v <- lift $ GMV.new by+ go 0 v+ where+ -- i is the index of the next element to be written by go+ -- also exactly the number of elements in v so far+ go i v = do+ res <- C.await+ case res of+ Nothing -> do+ v' <- lift $ GV.freeze $ GMV.slice 0 i v+ return $! v'+ Just x -> do+ v' <- case GMV.length v == i of+ True -> lift $ GMV.grow v by+ False -> return v+ lift $ GMV.write v' i x+ go (i+1) v'+ main :: IO () main = do pargs <- parseArgsIO ArgsComplete@@ -783,13 +805,13 @@ ] when (gotArg pargs "Help") $ usageError pargs "" let sepChar = fromMaybe ',' $ join $ fmap headMay $ getArg pargs "Separator"- foldCSVHandle h csvs f acc = E.run (enumHandle 4096 h $$ iterCSV csvs f acc)- readCSVHandle s h = fmap reverse <$> foldCSVHandle h s collectRows []+ growthFactor = 10+ readCSVHandle set h = runResourceT $ C.runConduit $ C.sourceHandle h C..| intoCSV set C..| C.transPipe lift (sinkVector growthFactor) inHandle <- getArgStdio pargs "Infile" ReadMode canRead <- hReady inHandle when (not canRead) $ usageError pargs ""- mydata <- {-fmap (map (map unpack))$ -} either throwIO return =<< readCSVHandle (defCSVSettings {csvSep = sepChar}) inHandle+ mydata <- V.toList <$> readCSVHandle (defCSVSettings {csvSep = sepChar}) inHandle start -- [headsty,tbsty] <- convertStyles [AttributeStyle [Bold] DarkGreenF BlackB, Style DarkGreenF DefaultB] (_h, w) <- myScrSize@@ -798,5 +820,3 @@ as = AppState [nums, (w - 5, myTbl)] 1 (tcols myTbl) (trows myTbl) [] [] Nothing 0 Nothing evalStateT (processKeys keyTree) $ as bye--
cursedcsv.cabal view
@@ -1,5 +1,5 @@ Name: cursedcsv-Version: 0.1.2+Version: 0.1.3 Synopsis: Terminal tool for viewing tabular data Description: Curses-based tool for quick display, searching, sorting, etc. of tabular data. Help available in the app with either '?' or 'h'.@@ -17,7 +17,7 @@ Main-is: CursedCSV.hs Build-depends: base >= 4 && < 6, parseargs >= 0.1.3, natural-sort >= 0.1.1, hscurses >= 1.4, regex-tdfa >= 1.1.8, safe >= 0.3, mtl >= 2,- csv-enumerator > 0.9, enumerator >= 0.4, bytestring > 0.9+ csv-conduit > 0.7, conduit >= 1.2.8 && < 2.0, conduit-extra, vector >=0.12 && < 0.13, bytestring > 0.9, primitive >=0.6.1 && < 0.7 if !os(windows) Build-depends: unix >= 2.4 ghc-options: -Wall