module Data.RingBuffer.MapBuffer (
Initializable (..)
,RingBuffer (..)
,MapBuffer (..)
)
where
import Prelude hiding (length)
import Data.RingBuffer.Class
import Data.IntMap (IntMap)
import qualified Data.IntMap as M
data MapBuffer a = MB !Int !(IntMap a)
deriving (Eq, Show, Ord)
type instance El (MapBuffer el) = el
instance Initializable (MapBuffer el) where
newInit el sz = MB 0 $ M.fromDistinctAscList $ map (,el) [0..sz1]
instance RingBuffer (MapBuffer el) where
length (MB _ vec) = M.size vec
(MB pos vec) ! ix = vec M.! ((posix1) `mod` M.size vec)
push = pushE
slice = sliceB
pushE :: MapBuffer a -> a -> MapBuffer a
pushE (MB pos vec) el =
let newPos = if pos == M.size vec 1 then 0 else pos + 1
vec' = M.insert pos el vec
in MB newPos vec'
sliceB :: MapBuffer a -> Int -> Int -> [a]
sliceB (MB pos vec) start num =
let ix1 = pos+start
top = snd $ M.split (ix11) vec
in map snd . M.toAscList . fst $ M.split (ix1+num) top