module Data.RingBuffer.SeqBuffer (
SeqBuffer
,RingBuffer (..)
,new
)
where
import Prelude hiding (length, (!!))
import Data.RingBuffer.Class
import qualified Data.Sequence as S
import Data.Foldable
newtype SeqBuffer a = RB (S.Seq a) deriving (Eq, Ord, Show)
type instance El (SeqBuffer a) = a
instance Initializable (SeqBuffer a) where
newInit = newInit'
instance RingBuffer (SeqBuffer a) where
length = length'
push = push'
(!) = (!!)
slice (RB sq) start num = toList . S.take num $ S.drop start sq
new :: (Num a) => Int -> SeqBuffer a
new = newInit' 0
newInit' :: a -> Int -> SeqBuffer a
newInit' _ sz | sz <= 0 = error "can't make empty ringbuffer"
newInit' i sz = RB (S.replicate sz i)
length' :: SeqBuffer a -> Int
length' (RB vec) = S.length vec
(!!) :: SeqBuffer a -> Int -> a
(!!) (RB vec) = S.index vec
push' :: SeqBuffer a -> a -> SeqBuffer a
push' (RB vec) el = case S.viewr vec of
v' S.:> _ -> RB $ el S.<| v'
_ -> error "internal error"