From 82cb1c4265c0c4a55fcd3fec9bcaec6647d11030 Mon Sep 17 00:00:00 2001 From: Jed Barber Date: Sun, 8 Jan 2017 23:49:21 +1100 Subject: Should be operating at acceptable speed/memusage rates now --- src/Storage.hs | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/Storage.hs (limited to 'src/Storage.hs') diff --git a/src/Storage.hs b/src/Storage.hs new file mode 100644 index 0000000..a97a5fc --- /dev/null +++ b/src/Storage.hs @@ -0,0 +1,47 @@ +module Storage( + Store, + + createStore, + setPref, + checkPref + ) where + + + + +import qualified Control.Monad.Primitive as Prim +import qualified Data.Vector.Unboxed.Mutable as Vec +import qualified Data.Int as Ints + + + + +data Store = Store { pointer :: Vec.MVector Prim.RealWorld Ints.Int8 + , sizeOfBallot :: Int} + + + + +createStore :: Int -> Int -> IO Store +createStore numberOfEntries ballotSize = do + v <- Vec.new (numberOfEntries * ballotSize) + return (Store v ballotSize) + + + + +setPref :: Store -> Int -> Int -> Int -> IO () +setPref prefStore ballot position rank = do + let place = (ballot - 1) * (sizeOfBallot prefStore) + (position - 1) + Vec.write (pointer prefStore) place (fromIntegral rank) + + + + +checkPref :: Store -> Int -> Int -> Int -> IO Bool +checkPref prefStore ballot position rank = do + let place = (ballot - 1) * (sizeOfBallot prefStore) + (position - 1) + value <- Vec.read (pointer prefStore) place + return (value == (fromIntegral rank)) + + -- cgit