<table cellspacing="0" cellpadding="0" border="0" ><tr><td valign="top" style="font: inherit;">Hi Bill,<br><br>Very clever.<br><br>You are an inspiration.<br><br>Michael<br><br>--- On <b>Sat, 8/14/10, Bill Atkins <i>&lt;watkins@alum.rpi.edu&gt;</i></b> wrote:<br><blockquote style="border-left: 2px solid rgb(16, 16, 255); margin-left: 5px; padding-left: 5px;"><br>From: Bill Atkins &lt;watkins@alum.rpi.edu&gt;<br>Subject: Re: [Haskell-cafe] Unwrapping long lines in text files<br>To: "michael rice" &lt;nowgate@yahoo.com&gt;<br>Cc: "Felipe Lessa" &lt;felipe.lessa@gmail.com&gt;, haskell-cafe@haskell.org<br>Date: Saturday, August 14, 2010, 12:33 PM<br><br><div class="plainMail">Try this one (<a href="http://gist.github.com/524460" target="_blank">http://gist.github.com/524460</a>):<br><br>import Data.Char<br><br>maxLineLength :: Int<br>maxLineLength = 72<br><br>trim :: String -&gt; String<br>trim = reverse . dropSpaces . reverse . dropSpaces<br>&nbsp; where
 dropSpaces = dropWhile isSpace<br><br>none :: (a -&gt; Bool) -&gt; [a] -&gt; Bool<br>none f = not . any f<br><br>reverseBreak :: (a -&gt; Bool) -&gt; [a] -&gt; ([a], [a])<br>reverseBreak f xs = (reverse before, reverse after)<br>&nbsp; where (after, before) = break f $ reverse xs<br><br>wrapLine :: String -&gt; [String]<br>wrapLine "" = [[]]<br>wrapLine line <br>&nbsp; | length line &lt;= maxLineLength&nbsp; &nbsp; = [line]<br>&nbsp; | none isSpace line&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;= beforeMax : wrapLine afterMax<br>&nbsp; | otherwise&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;= beforeSpace : (wrapLine $ afterSpace ++ afterMax)<br>&nbsp; &nbsp; where (beforeMax, afterMax)&nbsp; &nbsp; = splitAt maxLineLength line<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (beforeSpace, afterSpace) = reverseBreak isSpace beforeMax<br><br>main :: IO ()<br>main = interact $ unlines . concatMap (map trim .
 wrapLine) . lines<br><br><br>On Saturday Aug 14, 2010, at 9:41 AM, michael rice wrote:<br><br>&gt; Hi Filipe, Bill<br>&gt; <br>&gt; Your corrected version works, while the original didn't, but it still produces incorrect<br>&gt; output:<br>&gt; <br>&gt; However mean your life is, meet it and live it: do not shun it and call <br>&gt; it hard names. Cultivate poverty like a garden herb, like sage. Do not t<br>&gt; rouble yourself much to get new things, whether clothes or friends. Thin<br>&gt; gs do not change, we change. Sell your clothes and keep your thoughts. G<br>&gt; od will see that you do want society.<br>&gt; Men have become the tools of their tools.<br>&gt; I know of no more encouraging fact than the unquestioned ability of a ma<br>&gt; n to elevate his life by conscious endeavor.<br>&gt; I once had a sparrow alight upon my shoulder for a moment, while I was h<br>&gt; oeing in a village garden, and I felt that I was more distinguished by
 t<br>&gt; hat circumstance that I should have been by any epaulet I could have wor<br>&gt; n.<br>&gt; -Thoreau<br>&gt; <br>&gt; I don't want to break lines in the middle of words and I want to retain the original structure of the text with respect to blank lines between individual quotes. THe only thing in the input text that should change are the lines longer than 72 characters, and they should be reformatted to one or more lines less than or equal to 72 characters.<br>&gt; <br>&gt; Michael<br>&gt; <br>&gt; --- On Sat, 8/14/10, Felipe Lessa &lt;<a ymailto="mailto:felipe.lessa@gmail.com" href="/mc/compose?to=felipe.lessa@gmail.com">felipe.lessa@gmail.com</a>&gt; wrote:<br>&gt; <br>&gt; From: Felipe Lessa &lt;<a ymailto="mailto:felipe.lessa@gmail.com" href="/mc/compose?to=felipe.lessa@gmail.com">felipe.lessa@gmail.com</a>&gt;<br>&gt; Subject: Re: [Haskell-cafe] Unwrapping long lines in text files<br>&gt; To: "Bill Atkins" &lt;<a
 ymailto="mailto:watkins@alum.rpi.edu" href="/mc/compose?to=watkins@alum.rpi.edu">watkins@alum.rpi.edu</a>&gt;<br>&gt; Cc: "michael rice" &lt;<a ymailto="mailto:nowgate@yahoo.com" href="/mc/compose?to=nowgate@yahoo.com">nowgate@yahoo.com</a>&gt;, <a ymailto="mailto:haskell-cafe@haskell.org" href="/mc/compose?to=haskell-cafe@haskell.org">haskell-cafe@haskell.org</a><br>&gt; Date: Saturday, August 14, 2010, 9:17 AM<br>&gt; <br>&gt; On Sat, Aug 14, 2010 at 9:59 AM, Bill Atkins &lt;<a ymailto="mailto:watkins@alum.rpi.edu" href="/mc/compose?to=watkins@alum.rpi.edu">watkins@alum.rpi.edu</a>&gt; wrote:<br>&gt; &gt;&nbsp; | otherwise&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = let (line, rest) = splitAt maxLineLength line in<br>&gt; &gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;line : wrapLine rest<br>&gt; <br>&gt; I haven't tested myself, but does this work at all?&nbsp; If I am reading<br>&gt; it correctly, this is the same as<br>&gt; <br>&gt;&nbsp;&nbsp;&nbsp;let (foo, rest) = splitAt maxLineLength foo<br>&gt;&nbsp;&nbsp;&nbsp;in foo : wrapLine rest<br>&gt; <br>&gt; In other words, no mention of wrapLine's argument 'line', and a<br>&gt; recursive call that will bottom out and be the same as 'undefined' :).<br>&gt; GHC would warn you, though, if you used -Wall.&nbsp; That expression<br>&gt; should read:<br>&gt; <br>&gt;&nbsp;&nbsp;&nbsp;let (thisLine, rest) = splitAt maxLineLength line<br>&gt;&nbsp;&nbsp;&nbsp;in thisLine : wrapLine rest<br>&gt; <br>&gt; Cheers,<br>&gt; <br>&gt; -- <br>&gt; Felipe.<br>&gt; <br><br></div></blockquote></td></tr></table><br>