module VectorBuilder.Private.Action
where
import VectorBuilder.Private.Prelude
import qualified Data.Vector.Generic.Mutable as A
import qualified Data.Vector.Generic as B
newtype Action element result =
Action (forall s vector. A.MVector vector element => vector s element -> ST s result)
deriving (Functor)
instance Applicative (Action element) where
pure result =
Action (const (pure result))
(<*>) (Action actionFn1) (Action actionFn2) =
Action ((<*>) <$> actionFn1 <*> actionFn2)
unsafeWrite :: Int -> element -> Action element ()
unsafeWrite index element =
Action (\mVector -> A.unsafeWrite mVector index element)
unsafeWriteMany :: B.Vector vector element => Int -> vector element -> Action element ()
unsafeWriteMany startingIndex appendedVector =
Action (\mVector -> B.ifoldM' (\_ index element -> A.unsafeWrite mVector (startingIndex + index) element) () appendedVector)