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))