blob: a832c58ac49a89a912f89d1d3c8228c61a0b1dba (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
import Control.Monad
import Foreign
import Foreign.Ptr
type CInt = Int32
type CSize = Word32
foreign import ccall "wrapper"
mkComparator :: (Ptr Int -> Ptr Int -> IO CInt)
-> IO (Ptr (Ptr Int -> Ptr Int -> IO CInt))
foreign import ccall
qsort :: Ptr Int -> CSize -> CSize -> Ptr (Ptr Int -> Ptr Int -> IO CInt)
-> IO ()
compareInts :: Ptr Int -> Ptr Int -> IO CInt
compareInts a1 a2 = do
i1 <- peek a1
i2 <- peek a2
return (fromIntegral (i1 - i2 :: Int))
main :: IO ()
main = do
let values = [ 12, 56, 90, 34, 78 ] :: [Int]
n = length values
buf <- mallocArray n
zipWithM_ (pokeElemOff buf) [ 0 .. ] values
c <- mkComparator compareInts
qsort buf (fromIntegral n) (fromIntegral (sizeOf (head values))) c
mapM (peekElemOff buf) [ 0 .. n-1 ] >>= (print :: [Int] -> IO ())
|