
Matthias Fischmann wrote:
On Sat, Sep 30, 2006 at 11:54:19AM -0400, Mark T.B. Carroll wrote:
module WordWrap (wrap) where import Data.Maybe
options :: String -> [(String, String)]
options [] = [("", "")]
options (x:xs) = let rest = map (\(ys, zs) -> (x:ys, zs)) (options xs) in if x == ' ' then ("", xs) : rest else rest
bestSplit :: Int -> String -> (String, String)
bestSplit width string = last (head wraps : takeWhile ((<= width) . length . fst) (options string))
Works better if you just skip the "head wraps" part. (and now i am curious: what was it supposed to mean? how did it get there?)
I'll venture a guess: The code originally read | bestSplit width string = | let wraps = options string | in last (head wraps : takeWhile ((<= width) . length . fst) wraps) Without a precaution like this, long words will cause wrap to go into an infinite loop. Depending on your requirements you could also consider | bestSplit width string = | last (splitAt width string : takeWhile ((<= width) . length . fst) | (options string)) which will cut too long words into pieces fitting on the lines. (code untested) regards, Bertram