uvector-0.1: examples/concomp/Graph.hs
module Graph
where
import Data.Array.Parallel.Unlifted
import System.IO
import Foreign
data Graph = Graph { nodeCount :: Int
, edgeCount :: Int
, edges :: UArr (Int :*: Int)
}
deriving(Read,Show)
hPutGraph :: Handle -> Graph -> IO ()
hPutGraph h (Graph { nodeCount = n, edgeCount = e, edges = edges })
= alloca $ \iptr ->
do
poke iptr n
hPutBuf h iptr (sizeOf n)
poke iptr e
hPutBuf h iptr (sizeOf e)
hPutU h edges
hGetGraph :: Handle -> IO Graph
hGetGraph h
= alloca $ \iptr ->
do
hGetBuf h iptr (sizeOf (undefined :: Int))
n <- peek iptr
hGetBuf h iptr (sizeOf (undefined :: Int))
e <- peek iptr
edges <- hGetU h
return $ Graph { nodeCount = n, edgeCount = e, edges = edges }
storeGraph :: FilePath -> Graph -> IO ()
storeGraph file g = withBinaryFile file WriteMode (`hPutGraph` g)
loadGraph :: FilePath -> IO Graph
loadGraph file = withBinaryFile file ReadMode hGetGraph