module Statistics.Function
(
minMax
, sort
, partialSort
, indices
, createU
, createIO
) where
import Control.Exception (assert)
import Control.Monad.ST (ST, unsafeIOToST, unsafeSTToIO)
import Data.Array.Vector.Algorithms.Combinators (apply)
import Data.Array.Vector
import qualified Data.Array.Vector.Algorithms.Intro as I
sort :: (UA e, Ord e) => UArr e -> UArr e
sort = apply I.sort
partialSort :: (UA e, Ord e) =>
Int
-> UArr e
-> UArr e
partialSort k = apply (\a -> I.partialSort a k)
indices :: (UA a) => UArr a -> UArr Int
indices a = enumFromToU 0 (lengthU a 1)
data MM = MM !Double !Double
minMax :: UArr Double -> Double :*: Double
minMax = fini . foldlU go (MM (1/0) (1/0))
where
go (MM lo hi) k = MM (min lo k) (max hi k)
fini (MM lo hi) = lo :*: hi
createU :: (UA e) => forall s. Int -> (Int -> ST s e) -> ST s (UArr e)
createU size itemAt = assert (size >= 0) $
newMU size >>= loop 0
where
loop k arr | k >= size = unsafeFreezeAllMU arr
| otherwise = do
r <- itemAt k
writeMU arr k r
loop (k+1) arr
createIO :: (UA e) => Int -> (Int -> IO e) -> IO (UArr e)
createIO size itemAt =
unsafeSTToIO $ createU size (unsafeIOToST . itemAt)