[Haskell-cafe] Problem with pipe/Is there a function that "lifts" functions to Producers?

Cody Goodman codygman.consulting at gmail.com
Fri Jun 30 05:08:44 UTC 2017


Hi all,

I have a function from Text -> Text which I want to apply to each line
using pipes-text and pipes-group.


I'm pretty sure my pipe is not doing what I expect. I'm going back over the
pipes tutorial now, but I think I could use some help figuring it out.

I have the following (buildable github project:
https://github.com/codygman/fixedWidthToDelimited) code:

import Data.Monoid
import Pipes
import qualified Pipes.Text as Text
import qualified Pipes.Text.IO as Text
import System.IO
import Lens.Family
import qualified Pipes.Group as Group
import qualified Data.Text as T



appendAt :: Int -> T.Text -> T.Text -> (T.Text,T.Text)
appendAt i appendBS bs = let (first, rest) = T.splitAt i bs in (first <>
appendBS <> rest,rest)

-- TODO figure out how to test a pipe (I'm sure pipes-text or any other
libraries test their pipes)
toDelimPipe :: Monad m => [Int] -> Pipe T.Text T.Text m r
toDelimPipe offsets = do
    chunk <- await
    let text = (fixedWidthLine offsets) chunk
    if T.null text
      then (toDelimPipe offsets)
      else do yield text
              cat

fixedWidthLine :: [Int] -> T.Text -> T.Text
fixedWidthLine offsets bs = fst $ go offsets ("" :: T.Text,bs)
  where go :: [Int] -> (T.Text,T.Text) -> (T.Text,T.Text)
        go [] x = x
        go (x:xs) (acc,rest) = let (newAcc,newRest) = T.splitAt x rest in
go xs (acc <> (fst $ appendAt x "|" newAcc),newRest)

{-
got:
runEffect $ over Text.lines (Group.maps (>-> toDelimPipe [2,2,2] ))
(Text.fromLazy (LT.replicate 2 "x" <> LT.replicate 2 "y" <> LT.replicate 2
"z")) >-> Text.stdout
xx|||yyzz

Expected:

xx|yy|zz|

When I use fixedWidthLine alone with the same offsets I get:

λ> fixedWidthLine [2,2,2] (T.replicate 2 "x" <> T.replicate 2 "y" <>
T.replicate 2 "z")
"xx|yy|zz|"

I think my pipe is wrong

-}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20170630/059e2a69/attachment.html>


More information about the Haskell-Cafe mailing list