---------------------------------------------------------------------------- -- | -- Module : Logic.Util -- Stability : experimental -- Portability : portable -- -- Utilities. module Logic.Util ( maximumIx , buildArray , traverseArray ) where import Prelude import Data.Array import Data.List import Data.Function import qualified Data.Traversable (mapM) import Control.Arrow -------------------------------------------------------------------------------- -- * Array Utilities -------------------------------------------------------------------------------- -- | Index of the maximum element in an array. maximumIx :: (Ix i, Ord e) => Array i e -> i maximumIx = fst . maximumBy (compare `on` snd) . assocs -- | Build an array by specifying bounds and a function that constructs -- the value for an index. buildArray :: Ix i => (i, i) -> (i -> a) -> Array i a buildArray bs f = array bs $ fmap (id &&& f) $ range bs -- | Distributive law for monad actions in arrays. traverseArray :: (Ix i, Monad m) => (a -> m b) -> Array i a -> m (Array i b) traverseArray = Data.Traversable.mapM