uvector-algorithms-0.1: Data/Array/Vector/Algorithms/Common.hs
-- ---------------------------------------------------------------------------
-- |
-- Module : Data.Array.Vector.Algorithms.Common
-- Copyright : (c) 2008 Dan Doel
-- Maintainer : Dan Doel
-- Stability : Experimental
-- Portability : Portable
--
-- Common operations and utility functions for all sorts
module Data.Array.Vector.Algorithms.Common where
import Control.Monad.ST
import Data.Array.Vector
-- | A type of comparisons between two values of a given type.
type Comparison e = e -> e -> Ordering
-- | Swaps the elements at two positions in an array.
swap :: (UA e) => MUArr e s -> Int -> Int -> ST s ()
swap arr i j = do ei <- readMU arr i
readMU arr j >>= writeMU arr i
writeMU arr j ei
{-# INLINE swap #-}
mcopyMU :: (UA e) => MUArr e s -> MUArr e s -> Int -> Int -> Int -> ST s ()
mcopyMU from to iFrom iTo len = go 0
where
go n | n < len = readMU from (iFrom + n) >>= writeMU to (iTo + n) >> go (n+1)
| otherwise = return ()
{-# INLINE mcopyMU #-}