module VectorExtras.Accumulator
( Accumulator,
init,
add,
addList,
addFoldable,
toVector,
toReverseVector,
)
where
import Data.Vector.Generic (Vector, fromListN)
import qualified VectorExtras.Basics.Generic as Basics
import VectorExtras.Prelude hiding (fromListN, init, length)
{-# INLINE toVector #-}
toVector :: Vector v a => Accumulator a -> v a
toVector :: Accumulator a -> v a
toVector (Accumulator Int
size [a]
list) =
Int -> [a] -> v a
forall (v :: * -> *) a. Vector v a => Int -> [a] -> v a
Basics.fromReverseListN Int
size [a]
list
{-# INLINE toReverseVector #-}
toReverseVector :: Vector v a => Accumulator a -> v a
toReverseVector :: Accumulator a -> v a
toReverseVector (Accumulator Int
size [a]
list) =
Int -> [a] -> v a
forall (v :: * -> *) a. Vector v a => Int -> [a] -> v a
fromListN Int
size [a]
list
data Accumulator a
= Accumulator !Int ![a]
init :: Accumulator a
init :: Accumulator a
init = Int -> [a] -> Accumulator a
forall a. Int -> [a] -> Accumulator a
Accumulator Int
0 []
{-# INLINE add #-}
add :: a -> Accumulator a -> Accumulator a
add :: a -> Accumulator a -> Accumulator a
add a
head (Accumulator Int
size [a]
tail) =
Int -> [a] -> Accumulator a
forall a. Int -> [a] -> Accumulator a
Accumulator (Int -> Int
forall a. Enum a => a -> a
succ Int
size) (a
head a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
tail)
{-# INLINE addList #-}
addList :: [a] -> Accumulator a -> Accumulator a
addList :: [a] -> Accumulator a -> Accumulator a
addList = [a] -> Accumulator a -> Accumulator a
forall (f :: * -> *) a.
Foldable f =>
f a -> Accumulator a -> Accumulator a
addFoldable
{-# INLINE addFoldable #-}
addFoldable :: Foldable f => f a -> Accumulator a -> Accumulator a
addFoldable :: f a -> Accumulator a -> Accumulator a
addFoldable f a
foldable Accumulator a
acc =
(Accumulator a -> a -> Accumulator a)
-> Accumulator a -> f a -> Accumulator a
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (\Accumulator a
acc a
a -> a -> Accumulator a -> Accumulator a
forall a. a -> Accumulator a -> Accumulator a
add a
a Accumulator a
acc) Accumulator a
acc f a
foldable