Since there are many useful per-line functions, do a little refactoring, placing the following into a library:
perLine :: (String -> String) -> (String -> String)
perLine f = unlines . map f . lines
Tommy M McGuire wrote:You have a scary feeling for a moment, then it passes. ;)
> (Plus, interact is scary. :-D )
> Gwern Branwen wrote:
>> I... I want to provide a one-liner for 'detab', but it looks
>> impressively monstrous and I'm not sure I understand it.
>> On the other hand, I'm not looking for one-liners; I really want claritytabwidth = 4
> as opposed to cleverness.
-- tabstop !! (col-1) == there is a tabstop at column col
-- This is an infinite list, so no need to limit the line width
tabstops = map (\col -> col `mod` tabwidth == 1) [1..]
-- calculate spaces needed to fill to the next tabstop in advance
tabspaces = snd $ mapAccumR addspace [] tabstops
addspace cs isstop = let cs'=' ':cs in (if isstop then [] else cs',cs')
main = interact $ unlines . map detabLine . lines
where
detabLine = concat $ zipWith replace tabspaces
replace cs '\t' = cs -- replace with adequate number of spaces
replace _ char = [char] -- pass through
How about that?
Regards,
apfelmus
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe