{- Rabobank - Convert Rabobank CSV exports to QIF files Copyright (C) 2012 Sander Venema This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . -} -- |The 'ListUtils' module contains some of the list helper functions I've -- written. module ListUtils (takeWhileIndex, dropWhileIndex) where import Data.List (elem, elemIndex, nub) import Data.Maybe (fromJust) -- |The 'dropWhileIndex' helper function will take a '[Int]' of indices -- and a list, and returns a list without the elements with any one of the -- supplied indices. So if you want to drop item 0 and 1 from a list, you can -- do the following: -- -- > dropWhileIndex [0,1] ["this", "is", "a", "list"] -- -- and the function will return the list: -- -- > ["a", "list"] -- -- The advantage of this function with regards to 'drop' etc. is that -- this function will also drop non-consecutive indices. dropWhileIndex :: (Eq a) => [Int] -> [a] -> [a] dropWhileIndex indices list = nub $ filter isIndex list where isIndex e = let curIndex = fromJust (elemIndex e list) in curIndex `notElem` indices -- |The 'takeWhileIndex' helper function will take a '[Int]' of indices -- and a list, and returns a list containing only the elements with any one of -- the supplied indices. So if you want to take item 0 and 1 of a list, you can -- do the following: -- -- > takeWhileIndex [0,1] ["this", "is", "a", "list"] -- -- and the function will return the list: -- -- > ["this", "is"] -- -- The advantage of this function with regards to 'take' etc. is that -- this function will also take non-consecutive indices. takeWhileIndex :: (Eq a) => [Int] -> [a] -> [a] takeWhileIndex indices list = nub $ filter isIndex list where isIndex e = let curIndex = fromJust (elemIndex e list) in curIndex `elem` indices