On Tue, Nov 29, 2011 at 12:35 AM, Stefan Holdermans <ste...@vectorfabrics.com> wrote:
> Have you considered abstracting over the bits in which importFile and > loadFile differ? For example: > > processFile :: (String -> IO [PairBox]) -> Editor -> String -> IO () > processFile f ed path = do > s <- readFile path > ps <- f s > es <- return $ V.fromList ps > writeIORef ed es > > importFile = processFile (mapM (\x -> makePair (x, "")) . lines) > loadFile = processFile (mapM makePair . parseFile) This was what I had tried; my issue was that the resulting code looked harder rather than easier to read, so it felt more like golfing than refactoring. > Or, alternatively: > > processFile :: (String -> [a]) -> (a -> IO PairBox) -> Editor -> String -> > IO () > processFile f g ed path = do > s <- readFile path > ps -> mapM g (f s) > es -> return $ V.fromList ps > writeIORef ed es > > importFile = processFile lines (\x -> makePair (x, "")) > loadFile = processFile parseFile makePair This does look significantly nicer - I hadn't thought of splitting it into two functions rather than one, but it makes the code look much less cluttered. (The trick with `flip` is tempting, but again at the cost of having to peer rather too closely at the implementation of processFile when reading the code). Thanks! martin _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe