-- |
-- Extensions to the standard immutable Vector API.
module VectorBuilder.Vector where

import Data.Vector.Generic
import qualified VectorBuilder.Core.Builder as A
import qualified VectorBuilder.MVector as B
import VectorBuilder.Prelude

-- |
-- Construct an immutable vector from a builder.
--
-- Supports all kinds of vectors: boxed, unboxed, primitive, storable.
{-# INLINE build #-}
build :: (Vector vector element) => A.Builder element -> vector element
build :: forall (vector :: * -> *) element.
Vector vector element =>
Builder element -> vector element
build Builder element
builder =
  forall a. (forall s. ST s a) -> a
runST (forall (vector :: * -> * -> *) element s.
MVector vector element =>
Builder element -> ST s (vector s element)
B.build Builder element
builder forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
Mutable v (PrimState m) a -> m (v a)
unsafeFreeze)