Sophie

Sophie

distrib > Fedora > 18 > i386 > by-pkgid > c95396d39d65e8386d499c597a7865c8 > files > 213

ghc-vector-devel-0.9.1-8.fc18.i686.rpm

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<!-- Generated by HsColour, http://code.haskell.org/~malcolm/hscolour/ -->
<title>Data/Vector/Generic/Mutable.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='hs-comment'>{-# LANGUAGE MultiParamTypeClasses, BangPatterns, ScopedTypeVariables #-}</span>
<a name="line-2"></a><span class='hs-comment'>-- |</span>
<a name="line-3"></a><span class='hs-comment'>-- Module      : Data.Vector.Generic.Mutable</span>
<a name="line-4"></a><span class='hs-comment'>-- Copyright   : (c) Roman Leshchinskiy 2008-2010</span>
<a name="line-5"></a><span class='hs-comment'>-- License     : BSD-style</span>
<a name="line-6"></a><span class='hs-comment'>--</span>
<a name="line-7"></a><span class='hs-comment'>-- Maintainer  : Roman Leshchinskiy &lt;rl@cse.unsw.edu.au&gt;</span>
<a name="line-8"></a><span class='hs-comment'>-- Stability   : experimental</span>
<a name="line-9"></a><span class='hs-comment'>-- Portability : non-portable</span>
<a name="line-10"></a><span class='hs-comment'>-- </span>
<a name="line-11"></a><span class='hs-comment'>-- Generic interface to mutable vectors</span>
<a name="line-12"></a><span class='hs-comment'>--</span>
<a name="line-13"></a>
<a name="line-14"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Vector</span><span class='hs-varop'>.</span><span class='hs-conid'>Generic</span><span class='hs-varop'>.</span><span class='hs-conid'>Mutable</span> <span class='hs-layout'>(</span>
<a name="line-15"></a>  <span class='hs-comment'>-- * Class of mutable vector types</span>
<a name="line-16"></a>  <span class='hs-conid'>MVector</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-17"></a>
<a name="line-18"></a>  <span class='hs-comment'>-- * Accessors</span>
<a name="line-19"></a>
<a name="line-20"></a>  <span class='hs-comment'>-- ** Length information</span>
<a name="line-21"></a>  <span class='hs-varid'>length</span><span class='hs-layout'>,</span> <span class='hs-varid'>null</span><span class='hs-layout'>,</span>
<a name="line-22"></a>
<a name="line-23"></a>  <span class='hs-comment'>-- ** Extracting subvectors</span>
<a name="line-24"></a>  <span class='hs-varid'>slice</span><span class='hs-layout'>,</span> <span class='hs-varid'>init</span><span class='hs-layout'>,</span> <span class='hs-varid'>tail</span><span class='hs-layout'>,</span> <span class='hs-varid'>take</span><span class='hs-layout'>,</span> <span class='hs-varid'>drop</span><span class='hs-layout'>,</span> <span class='hs-varid'>splitAt</span><span class='hs-layout'>,</span>
<a name="line-25"></a>  <span class='hs-varid'>unsafeSlice</span><span class='hs-layout'>,</span> <span class='hs-varid'>unsafeInit</span><span class='hs-layout'>,</span> <span class='hs-varid'>unsafeTail</span><span class='hs-layout'>,</span> <span class='hs-varid'>unsafeTake</span><span class='hs-layout'>,</span> <span class='hs-varid'>unsafeDrop</span><span class='hs-layout'>,</span>
<a name="line-26"></a>
<a name="line-27"></a>  <span class='hs-comment'>-- ** Overlapping</span>
<a name="line-28"></a>  <span class='hs-varid'>overlaps</span><span class='hs-layout'>,</span>
<a name="line-29"></a>
<a name="line-30"></a>  <span class='hs-comment'>-- * Construction</span>
<a name="line-31"></a>
<a name="line-32"></a>  <span class='hs-comment'>-- ** Initialisation</span>
<a name="line-33"></a>  <span class='hs-varid'>new</span><span class='hs-layout'>,</span> <span class='hs-varid'>unsafeNew</span><span class='hs-layout'>,</span> <span class='hs-varid'>replicate</span><span class='hs-layout'>,</span> <span class='hs-varid'>replicateM</span><span class='hs-layout'>,</span> <span class='hs-varid'>clone</span><span class='hs-layout'>,</span>
<a name="line-34"></a>
<a name="line-35"></a>  <span class='hs-comment'>-- ** Growing</span>
<a name="line-36"></a>  <span class='hs-varid'>grow</span><span class='hs-layout'>,</span> <span class='hs-varid'>unsafeGrow</span><span class='hs-layout'>,</span>
<a name="line-37"></a>
<a name="line-38"></a>  <span class='hs-comment'>-- ** Restricting memory usage</span>
<a name="line-39"></a>  <span class='hs-varid'>clear</span><span class='hs-layout'>,</span>
<a name="line-40"></a>
<a name="line-41"></a>  <span class='hs-comment'>-- * Accessing individual elements</span>
<a name="line-42"></a>  <span class='hs-varid'>read</span><span class='hs-layout'>,</span> <span class='hs-varid'>write</span><span class='hs-layout'>,</span> <span class='hs-varid'>swap</span><span class='hs-layout'>,</span>
<a name="line-43"></a>  <span class='hs-varid'>unsafeRead</span><span class='hs-layout'>,</span> <span class='hs-varid'>unsafeWrite</span><span class='hs-layout'>,</span> <span class='hs-varid'>unsafeSwap</span><span class='hs-layout'>,</span>
<a name="line-44"></a>
<a name="line-45"></a>  <span class='hs-comment'>-- * Modifying vectors</span>
<a name="line-46"></a>
<a name="line-47"></a>  <span class='hs-comment'>-- ** Filling and copying</span>
<a name="line-48"></a>  <span class='hs-varid'>set</span><span class='hs-layout'>,</span> <span class='hs-varid'>copy</span><span class='hs-layout'>,</span> <span class='hs-varid'>move</span><span class='hs-layout'>,</span> <span class='hs-varid'>unsafeCopy</span><span class='hs-layout'>,</span> <span class='hs-varid'>unsafeMove</span><span class='hs-layout'>,</span>
<a name="line-49"></a>
<a name="line-50"></a>  <span class='hs-comment'>-- * Internal operations</span>
<a name="line-51"></a>  <span class='hs-varid'>mstream</span><span class='hs-layout'>,</span> <span class='hs-varid'>mstreamR</span><span class='hs-layout'>,</span>
<a name="line-52"></a>  <span class='hs-varid'>unstream</span><span class='hs-layout'>,</span> <span class='hs-varid'>unstreamR</span><span class='hs-layout'>,</span>
<a name="line-53"></a>  <span class='hs-varid'>munstream</span><span class='hs-layout'>,</span> <span class='hs-varid'>munstreamR</span><span class='hs-layout'>,</span>
<a name="line-54"></a>  <span class='hs-varid'>transform</span><span class='hs-layout'>,</span> <span class='hs-varid'>transformR</span><span class='hs-layout'>,</span>
<a name="line-55"></a>  <span class='hs-varid'>fill</span><span class='hs-layout'>,</span> <span class='hs-varid'>fillR</span><span class='hs-layout'>,</span>
<a name="line-56"></a>  <span class='hs-varid'>unsafeAccum</span><span class='hs-layout'>,</span> <span class='hs-varid'>accum</span><span class='hs-layout'>,</span> <span class='hs-varid'>unsafeUpdate</span><span class='hs-layout'>,</span> <span class='hs-varid'>update</span><span class='hs-layout'>,</span> <span class='hs-varid'>reverse</span><span class='hs-layout'>,</span>
<a name="line-57"></a>  <span class='hs-varid'>unstablePartition</span><span class='hs-layout'>,</span> <span class='hs-varid'>unstablePartitionStream</span><span class='hs-layout'>,</span> <span class='hs-varid'>partitionStream</span>
<a name="line-58"></a><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-59"></a>
<a name="line-60"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Vector</span><span class='hs-varop'>.</span><span class='hs-conid'>Fusion</span><span class='hs-varop'>.</span><span class='hs-conid'>Stream</span>      <span class='hs-keyword'>as</span> <span class='hs-conid'>Stream</span>
<a name="line-61"></a><span class='hs-keyword'>import</span>           <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Vector</span><span class='hs-varop'>.</span><span class='hs-conid'>Fusion</span><span class='hs-varop'>.</span><span class='hs-conid'>Stream</span>      <span class='hs-layout'>(</span> <span class='hs-conid'>Stream</span><span class='hs-layout'>,</span> <span class='hs-conid'>MStream</span> <span class='hs-layout'>)</span>
<a name="line-62"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Vector</span><span class='hs-varop'>.</span><span class='hs-conid'>Fusion</span><span class='hs-varop'>.</span><span class='hs-conid'>Stream</span><span class='hs-varop'>.</span><span class='hs-conid'>Monadic</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>MStream</span>
<a name="line-63"></a><span class='hs-keyword'>import</span>           <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Vector</span><span class='hs-varop'>.</span><span class='hs-conid'>Fusion</span><span class='hs-varop'>.</span><span class='hs-conid'>Stream</span><span class='hs-varop'>.</span><span class='hs-conid'>Size</span>
<a name="line-64"></a><span class='hs-keyword'>import</span>           <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Vector</span><span class='hs-varop'>.</span><span class='hs-conid'>Fusion</span><span class='hs-varop'>.</span><span class='hs-conid'>Util</span>        <span class='hs-layout'>(</span> <span class='hs-varid'>delay_inline</span> <span class='hs-layout'>)</span>
<a name="line-65"></a>
<a name="line-66"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span><span class='hs-varop'>.</span><span class='hs-conid'>Primitive</span> <span class='hs-layout'>(</span> <span class='hs-conid'>PrimMonad</span><span class='hs-layout'>,</span> <span class='hs-conid'>PrimState</span> <span class='hs-layout'>)</span>
<a name="line-67"></a>
<a name="line-68"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Prelude</span> <span class='hs-varid'>hiding</span> <span class='hs-layout'>(</span> <span class='hs-varid'>length</span><span class='hs-layout'>,</span> <span class='hs-varid'>null</span><span class='hs-layout'>,</span> <span class='hs-varid'>replicate</span><span class='hs-layout'>,</span> <span class='hs-varid'>reverse</span><span class='hs-layout'>,</span> <span class='hs-varid'>map</span><span class='hs-layout'>,</span> <span class='hs-varid'>read</span><span class='hs-layout'>,</span>
<a name="line-69"></a>                        <span class='hs-varid'>take</span><span class='hs-layout'>,</span> <span class='hs-varid'>drop</span><span class='hs-layout'>,</span> <span class='hs-varid'>splitAt</span><span class='hs-layout'>,</span> <span class='hs-varid'>init</span><span class='hs-layout'>,</span> <span class='hs-varid'>tail</span> <span class='hs-layout'>)</span>
<a name="line-70"></a>
<a name="line-71"></a><span class='hs-cpp'>#include "vector.h"</span>
<a name="line-72"></a>
<a name="line-73"></a><a name="Int"></a><span class='hs-comment'>-- | Class of mutable vectors parametrised with a primitive state token.</span>
<a name="line-74"></a><a name="Int"></a><span class='hs-comment'>--</span>
<a name="line-75"></a><a name="Int"></a><span class='hs-keyword'>class</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span> <span class='hs-keyword'>where</span>
<a name="line-76"></a>  <span class='hs-comment'>-- | Length of the mutable vector. This method should not be</span>
<a name="line-77"></a>  <span class='hs-comment'>-- called directly, use 'length' instead.</span>
<a name="line-78"></a>  <span class='hs-varid'>basicLength</span>       <span class='hs-keyglyph'>::</span> <span class='hs-varid'>v</span> <span class='hs-varid'>s</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span>
<a name="line-79"></a>
<a name="line-80"></a>  <span class='hs-comment'>-- | Yield a part of the mutable vector without copying it. This method</span>
<a name="line-81"></a>  <span class='hs-comment'>-- should not be called directly, use 'unsafeSlice' instead.</span>
<a name="line-82"></a>  <span class='hs-varid'>basicUnsafeSlice</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span>  <span class='hs-comment'>-- ^ starting index</span>
<a name="line-83"></a>                   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span>  <span class='hs-comment'>-- ^ length of the slice</span>
<a name="line-84"></a>                   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>v</span> <span class='hs-varid'>s</span> <span class='hs-varid'>a</span>
<a name="line-85"></a>                   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>v</span> <span class='hs-varid'>s</span> <span class='hs-varid'>a</span>
<a name="line-86"></a>
<a name="line-87"></a>  <span class='hs-comment'>-- Check whether two vectors overlap. This method should not be</span>
<a name="line-88"></a>  <span class='hs-comment'>-- called directly, use 'overlaps' instead.</span>
<a name="line-89"></a>  <span class='hs-varid'>basicOverlaps</span>    <span class='hs-keyglyph'>::</span> <span class='hs-varid'>v</span> <span class='hs-varid'>s</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>v</span> <span class='hs-varid'>s</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-90"></a>
<a name="line-91"></a>  <span class='hs-comment'>-- | Create a mutable vector of the given length. This method should not be</span>
<a name="line-92"></a>  <span class='hs-comment'>-- called directly, use 'unsafeNew' instead.</span>
<a name="line-93"></a>  <span class='hs-varid'>basicUnsafeNew</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-94"></a>
<a name="line-95"></a>  <span class='hs-comment'>-- | Create a mutable vector of the given length and fill it with an</span>
<a name="line-96"></a>  <span class='hs-comment'>-- initial value. This method should not be called directly, use</span>
<a name="line-97"></a>  <span class='hs-comment'>-- 'replicate' instead.</span>
<a name="line-98"></a>  <span class='hs-varid'>basicUnsafeReplicate</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-99"></a>
<a name="line-100"></a>  <span class='hs-comment'>-- | Yield the element at the given position. This method should not be</span>
<a name="line-101"></a>  <span class='hs-comment'>-- called directly, use 'unsafeRead' instead.</span>
<a name="line-102"></a>  <span class='hs-varid'>basicUnsafeRead</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span>
<a name="line-103"></a>
<a name="line-104"></a>  <span class='hs-comment'>-- | Replace the element at the given position. This method should not be</span>
<a name="line-105"></a>  <span class='hs-comment'>-- called directly, use 'unsafeWrite' instead.</span>
<a name="line-106"></a>  <span class='hs-varid'>basicUnsafeWrite</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span>
<a name="line-107"></a>
<a name="line-108"></a>  <span class='hs-comment'>-- | Reset all elements of the vector to some undefined value, clearing all</span>
<a name="line-109"></a>  <span class='hs-comment'>-- references to external objects. This is usually a noop for unboxed</span>
<a name="line-110"></a>  <span class='hs-comment'>-- vectors. This method should not be called directly, use 'clear' instead.</span>
<a name="line-111"></a>  <span class='hs-varid'>basicClear</span>       <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span>
<a name="line-112"></a>
<a name="line-113"></a>  <span class='hs-comment'>-- | Set all elements of the vector to the given value. This method should</span>
<a name="line-114"></a>  <span class='hs-comment'>-- not be called directly, use 'set' instead.</span>
<a name="line-115"></a>  <span class='hs-varid'>basicSet</span>         <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span>
<a name="line-116"></a>
<a name="line-117"></a>  <span class='hs-comment'>-- | Copy a vector. The two vectors may not overlap. This method should not</span>
<a name="line-118"></a>  <span class='hs-comment'>-- be called directly, use 'unsafeCopy' instead.</span>
<a name="line-119"></a>  <span class='hs-varid'>basicUnsafeCopy</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span>   <span class='hs-comment'>-- ^ target</span>
<a name="line-120"></a>                                  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span>   <span class='hs-comment'>-- ^ source</span>
<a name="line-121"></a>                                  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span>
<a name="line-122"></a>
<a name="line-123"></a>  <span class='hs-comment'>-- | Move the contents of a vector. The two vectors may overlap. This method</span>
<a name="line-124"></a>  <span class='hs-comment'>-- should not be called directly, use 'unsafeMove' instead.</span>
<a name="line-125"></a>  <span class='hs-varid'>basicUnsafeMove</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span>   <span class='hs-comment'>-- ^ target</span>
<a name="line-126"></a>                                  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span>   <span class='hs-comment'>-- ^ source</span>
<a name="line-127"></a>                                  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span>
<a name="line-128"></a>
<a name="line-129"></a>  <span class='hs-comment'>-- | Grow a vector by the given number of elements. This method should not be</span>
<a name="line-130"></a>  <span class='hs-comment'>-- called directly, use 'unsafeGrow' instead.</span>
<a name="line-131"></a>  <span class='hs-varid'>basicUnsafeGrow</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span>
<a name="line-132"></a>                                                       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-133"></a>
<a name="line-134"></a>  <span class='hs-comment'>{-# INLINE basicUnsafeReplicate #-}</span>
<a name="line-135"></a>  <span class='hs-varid'>basicUnsafeReplicate</span> <span class='hs-varid'>n</span> <span class='hs-varid'>x</span>
<a name="line-136"></a>    <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-137"></a>        <span class='hs-varid'>v</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>basicUnsafeNew</span> <span class='hs-varid'>n</span>
<a name="line-138"></a>        <span class='hs-varid'>basicSet</span> <span class='hs-varid'>v</span> <span class='hs-varid'>x</span>
<a name="line-139"></a>        <span class='hs-varid'>return</span> <span class='hs-varid'>v</span>
<a name="line-140"></a>
<a name="line-141"></a>  <span class='hs-comment'>{-# INLINE basicClear #-}</span>
<a name="line-142"></a>  <span class='hs-varid'>basicClear</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-143"></a>
<a name="line-144"></a>  <span class='hs-comment'>{-# INLINE basicSet #-}</span>
<a name="line-145"></a>  <span class='hs-varid'>basicSet</span> <span class='hs-varop'>!</span><span class='hs-varid'>v</span> <span class='hs-varid'>x</span>
<a name="line-146"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>n</span> <span class='hs-varop'>==</span> <span class='hs-num'>0</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-147"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-148"></a>                    <span class='hs-varid'>basicUnsafeWrite</span> <span class='hs-varid'>v</span> <span class='hs-num'>0</span> <span class='hs-varid'>x</span>
<a name="line-149"></a>                    <span class='hs-varid'>do_set</span> <span class='hs-num'>1</span>
<a name="line-150"></a>    <span class='hs-keyword'>where</span>
<a name="line-151"></a>      <span class='hs-varop'>!</span><span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>basicLength</span> <span class='hs-varid'>v</span>
<a name="line-152"></a>
<a name="line-153"></a>      <span class='hs-varid'>do_set</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>|</span> <span class='hs-num'>2</span><span class='hs-varop'>*</span><span class='hs-varid'>i</span> <span class='hs-varop'>&lt;</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>basicUnsafeCopy</span> <span class='hs-layout'>(</span><span class='hs-varid'>basicUnsafeSlice</span> <span class='hs-varid'>i</span> <span class='hs-varid'>i</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span>
<a name="line-154"></a>                                              <span class='hs-layout'>(</span><span class='hs-varid'>basicUnsafeSlice</span> <span class='hs-num'>0</span> <span class='hs-varid'>i</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span>
<a name="line-155"></a>                              <span class='hs-varid'>do_set</span> <span class='hs-layout'>(</span><span class='hs-num'>2</span><span class='hs-varop'>*</span><span class='hs-varid'>i</span><span class='hs-layout'>)</span>
<a name="line-156"></a>               <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>basicUnsafeCopy</span> <span class='hs-layout'>(</span><span class='hs-varid'>basicUnsafeSlice</span> <span class='hs-varid'>i</span> <span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-comment'>-</span><span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span>
<a name="line-157"></a>                                             <span class='hs-layout'>(</span><span class='hs-varid'>basicUnsafeSlice</span> <span class='hs-num'>0</span> <span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-comment'>-</span><span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span>
<a name="line-158"></a>
<a name="line-159"></a>  <span class='hs-comment'>{-# INLINE basicUnsafeCopy #-}</span>
<a name="line-160"></a>  <span class='hs-varid'>basicUnsafeCopy</span> <span class='hs-varop'>!</span><span class='hs-varid'>dst</span> <span class='hs-varop'>!</span><span class='hs-varid'>src</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>do_copy</span> <span class='hs-num'>0</span>
<a name="line-161"></a>    <span class='hs-keyword'>where</span>
<a name="line-162"></a>      <span class='hs-varop'>!</span><span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>basicLength</span> <span class='hs-varid'>src</span>
<a name="line-163"></a>
<a name="line-164"></a>      <span class='hs-varid'>do_copy</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>i</span> <span class='hs-varop'>&lt;</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-165"></a>                            <span class='hs-varid'>x</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>basicUnsafeRead</span> <span class='hs-varid'>src</span> <span class='hs-varid'>i</span>
<a name="line-166"></a>                            <span class='hs-varid'>basicUnsafeWrite</span> <span class='hs-varid'>dst</span> <span class='hs-varid'>i</span> <span class='hs-varid'>x</span>
<a name="line-167"></a>                            <span class='hs-varid'>do_copy</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>)</span>
<a name="line-168"></a>                <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-169"></a>  
<a name="line-170"></a>  <span class='hs-comment'>{-# INLINE basicUnsafeMove #-}</span>
<a name="line-171"></a>  <span class='hs-varid'>basicUnsafeMove</span> <span class='hs-varop'>!</span><span class='hs-varid'>dst</span> <span class='hs-varop'>!</span><span class='hs-varid'>src</span>
<a name="line-172"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>basicOverlaps</span> <span class='hs-varid'>dst</span> <span class='hs-varid'>src</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-173"></a>        <span class='hs-varid'>srcCopy</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>clone</span> <span class='hs-varid'>src</span>
<a name="line-174"></a>        <span class='hs-varid'>basicUnsafeCopy</span> <span class='hs-varid'>dst</span> <span class='hs-varid'>srcCopy</span>
<a name="line-175"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>basicUnsafeCopy</span> <span class='hs-varid'>dst</span> <span class='hs-varid'>src</span>
<a name="line-176"></a>
<a name="line-177"></a>  <span class='hs-comment'>{-# INLINE basicUnsafeGrow #-}</span>
<a name="line-178"></a>  <span class='hs-varid'>basicUnsafeGrow</span> <span class='hs-varid'>v</span> <span class='hs-varid'>by</span>
<a name="line-179"></a>    <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-180"></a>        <span class='hs-varid'>v'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>basicUnsafeNew</span> <span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-varop'>+</span><span class='hs-varid'>by</span><span class='hs-layout'>)</span>
<a name="line-181"></a>        <span class='hs-varid'>basicUnsafeCopy</span> <span class='hs-layout'>(</span><span class='hs-varid'>basicUnsafeSlice</span> <span class='hs-num'>0</span> <span class='hs-varid'>n</span> <span class='hs-varid'>v'</span><span class='hs-layout'>)</span> <span class='hs-varid'>v</span>
<a name="line-182"></a>        <span class='hs-varid'>return</span> <span class='hs-varid'>v'</span>
<a name="line-183"></a>    <span class='hs-keyword'>where</span>
<a name="line-184"></a>      <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>basicLength</span> <span class='hs-varid'>v</span>
<a name="line-185"></a>
<a name="line-186"></a><span class='hs-comment'>-- ------------------</span>
<a name="line-187"></a><span class='hs-comment'>-- Internal functions</span>
<a name="line-188"></a><span class='hs-comment'>-- ------------------</span>
<a name="line-189"></a>
<a name="line-190"></a><a name="unsafeAppend1"></a><span class='hs-definition'>unsafeAppend1</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-191"></a>        <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-192"></a><span class='hs-comment'>{-# INLINE_INNER unsafeAppend1 #-}</span>
<a name="line-193"></a>    <span class='hs-comment'>-- NOTE: The case distinction has to be on the outside because</span>
<a name="line-194"></a>    <span class='hs-comment'>-- GHC creates a join point for the unsafeWrite even when everything</span>
<a name="line-195"></a>    <span class='hs-comment'>-- is inlined. This is bad because with the join point, v isn't getting</span>
<a name="line-196"></a>    <span class='hs-comment'>-- unboxed.</span>
<a name="line-197"></a><span class='hs-definition'>unsafeAppend1</span> <span class='hs-varid'>v</span> <span class='hs-varid'>i</span> <span class='hs-varid'>x</span>
<a name="line-198"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>i</span> <span class='hs-varop'>&lt;</span> <span class='hs-varid'>length</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-199"></a>                     <span class='hs-varid'>unsafeWrite</span> <span class='hs-varid'>v</span> <span class='hs-varid'>i</span> <span class='hs-varid'>x</span>
<a name="line-200"></a>                     <span class='hs-varid'>return</span> <span class='hs-varid'>v</span>
<a name="line-201"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>    <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-202"></a>                     <span class='hs-varid'>v'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>enlarge</span> <span class='hs-varid'>v</span>
<a name="line-203"></a>                     <span class='hs-conid'>INTERNAL_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>checkIndex</span><span class='hs-layout'>)</span> <span class='hs-str'>"unsafeAppend1"</span> <span class='hs-varid'>i</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>v'</span><span class='hs-layout'>)</span>
<a name="line-204"></a>                       <span class='hs-varop'>$</span> <span class='hs-varid'>unsafeWrite</span> <span class='hs-varid'>v'</span> <span class='hs-varid'>i</span> <span class='hs-varid'>x</span>
<a name="line-205"></a>                     <span class='hs-varid'>return</span> <span class='hs-varid'>v'</span>
<a name="line-206"></a>
<a name="line-207"></a><a name="unsafePrepend1"></a><span class='hs-definition'>unsafePrepend1</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-208"></a>        <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>Int</span><span class='hs-layout'>)</span>
<a name="line-209"></a><span class='hs-comment'>{-# INLINE_INNER unsafePrepend1 #-}</span>
<a name="line-210"></a><span class='hs-definition'>unsafePrepend1</span> <span class='hs-varid'>v</span> <span class='hs-varid'>i</span> <span class='hs-varid'>x</span>
<a name="line-211"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>i</span> <span class='hs-varop'>/=</span> <span class='hs-num'>0</span>    <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-212"></a>                  <span class='hs-keyword'>let</span> <span class='hs-varid'>i'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>i</span><span class='hs-comment'>-</span><span class='hs-num'>1</span>
<a name="line-213"></a>                  <span class='hs-varid'>unsafeWrite</span> <span class='hs-varid'>v</span> <span class='hs-varid'>i'</span> <span class='hs-varid'>x</span>
<a name="line-214"></a>                  <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span><span class='hs-layout'>,</span> <span class='hs-varid'>i'</span><span class='hs-layout'>)</span>
<a name="line-215"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-216"></a>                  <span class='hs-layout'>(</span><span class='hs-varid'>v'</span><span class='hs-layout'>,</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>enlargeFront</span> <span class='hs-varid'>v</span>
<a name="line-217"></a>                  <span class='hs-keyword'>let</span> <span class='hs-varid'>i'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>i</span><span class='hs-comment'>-</span><span class='hs-num'>1</span>
<a name="line-218"></a>                  <span class='hs-conid'>INTERNAL_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>checkIndex</span><span class='hs-layout'>)</span> <span class='hs-str'>"unsafePrepend1"</span> <span class='hs-varid'>i'</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>v'</span><span class='hs-layout'>)</span>
<a name="line-219"></a>                    <span class='hs-varop'>$</span> <span class='hs-varid'>unsafeWrite</span> <span class='hs-varid'>v'</span> <span class='hs-varid'>i'</span> <span class='hs-varid'>x</span>
<a name="line-220"></a>                  <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>v'</span><span class='hs-layout'>,</span> <span class='hs-varid'>i'</span><span class='hs-layout'>)</span>
<a name="line-221"></a>
<a name="line-222"></a><a name="mstream"></a><span class='hs-definition'>mstream</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>MStream</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span>
<a name="line-223"></a><span class='hs-comment'>{-# INLINE mstream #-}</span>
<a name="line-224"></a><span class='hs-definition'>mstream</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>v</span> <span class='hs-varop'>`seq`</span> <span class='hs-varid'>n</span> <span class='hs-varop'>`seq`</span> <span class='hs-layout'>(</span><span class='hs-conid'>MStream</span><span class='hs-varop'>.</span><span class='hs-varid'>unfoldrM</span> <span class='hs-varid'>get</span> <span class='hs-num'>0</span> <span class='hs-varop'>`</span><span class='hs-conid'>MStream</span><span class='hs-varop'>.</span><span class='hs-varid'>sized</span><span class='hs-varop'>`</span> <span class='hs-conid'>Exact</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span>
<a name="line-225"></a>  <span class='hs-keyword'>where</span>
<a name="line-226"></a>    <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>length</span> <span class='hs-varid'>v</span>
<a name="line-227"></a>
<a name="line-228"></a>    <span class='hs-comment'>{-# INLINE_INNER get #-}</span>
<a name="line-229"></a>    <span class='hs-varid'>get</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>i</span> <span class='hs-varop'>&lt;</span> <span class='hs-varid'>n</span>     <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>unsafeRead</span> <span class='hs-varid'>v</span> <span class='hs-varid'>i</span>
<a name="line-230"></a>                           <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-layout'>,</span> <span class='hs-varid'>i</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>)</span>
<a name="line-231"></a>          <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-conid'>Nothing</span>
<a name="line-232"></a>
<a name="line-233"></a><a name="fill"></a><span class='hs-definition'>fill</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-234"></a>           <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>MStream</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-235"></a><span class='hs-comment'>{-# INLINE fill #-}</span>
<a name="line-236"></a><span class='hs-definition'>fill</span> <span class='hs-varid'>v</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>v</span> <span class='hs-varop'>`seq`</span> <span class='hs-keyword'>do</span>
<a name="line-237"></a>                     <span class='hs-varid'>n'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-conid'>MStream</span><span class='hs-varop'>.</span><span class='hs-varid'>foldM</span> <span class='hs-varid'>put</span> <span class='hs-num'>0</span> <span class='hs-varid'>s</span>
<a name="line-238"></a>                     <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-varid'>unsafeSlice</span> <span class='hs-num'>0</span> <span class='hs-varid'>n'</span> <span class='hs-varid'>v</span>
<a name="line-239"></a>  <span class='hs-keyword'>where</span>
<a name="line-240"></a>    <span class='hs-comment'>{-# INLINE_INNER put #-}</span>
<a name="line-241"></a>    <span class='hs-varid'>put</span> <span class='hs-varid'>i</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-242"></a>                <span class='hs-conid'>INTERNAL_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>checkIndex</span><span class='hs-layout'>)</span> <span class='hs-str'>"fill"</span> <span class='hs-varid'>i</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span>
<a name="line-243"></a>                  <span class='hs-varop'>$</span> <span class='hs-varid'>unsafeWrite</span> <span class='hs-varid'>v</span> <span class='hs-varid'>i</span> <span class='hs-varid'>x</span>
<a name="line-244"></a>                <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>)</span>
<a name="line-245"></a>
<a name="line-246"></a><a name="transform"></a><span class='hs-definition'>transform</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-247"></a>  <span class='hs-keyglyph'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>MStream</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>MStream</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-248"></a><span class='hs-comment'>{-# INLINE_STREAM transform #-}</span>
<a name="line-249"></a><span class='hs-definition'>transform</span> <span class='hs-varid'>f</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fill</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-varid'>mstream</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-250"></a>
<a name="line-251"></a><a name="mstreamR"></a><span class='hs-definition'>mstreamR</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>MStream</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span>
<a name="line-252"></a><span class='hs-comment'>{-# INLINE mstreamR #-}</span>
<a name="line-253"></a><span class='hs-definition'>mstreamR</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>v</span> <span class='hs-varop'>`seq`</span> <span class='hs-varid'>n</span> <span class='hs-varop'>`seq`</span> <span class='hs-layout'>(</span><span class='hs-conid'>MStream</span><span class='hs-varop'>.</span><span class='hs-varid'>unfoldrM</span> <span class='hs-varid'>get</span> <span class='hs-varid'>n</span> <span class='hs-varop'>`</span><span class='hs-conid'>MStream</span><span class='hs-varop'>.</span><span class='hs-varid'>sized</span><span class='hs-varop'>`</span> <span class='hs-conid'>Exact</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span>
<a name="line-254"></a>  <span class='hs-keyword'>where</span>
<a name="line-255"></a>    <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>length</span> <span class='hs-varid'>v</span>
<a name="line-256"></a>
<a name="line-257"></a>    <span class='hs-comment'>{-# INLINE_INNER get #-}</span>
<a name="line-258"></a>    <span class='hs-varid'>get</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>j</span> <span class='hs-varop'>&gt;=</span> <span class='hs-num'>0</span>    <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>unsafeRead</span> <span class='hs-varid'>v</span> <span class='hs-varid'>j</span>
<a name="line-259"></a>                           <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-layout'>,</span><span class='hs-varid'>j</span><span class='hs-layout'>)</span>
<a name="line-260"></a>          <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-conid'>Nothing</span>
<a name="line-261"></a>      <span class='hs-keyword'>where</span>
<a name="line-262"></a>        <span class='hs-varid'>j</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>i</span><span class='hs-comment'>-</span><span class='hs-num'>1</span>
<a name="line-263"></a>
<a name="line-264"></a><a name="fillR"></a><span class='hs-definition'>fillR</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-265"></a>           <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>MStream</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-266"></a><span class='hs-comment'>{-# INLINE fillR #-}</span>
<a name="line-267"></a><span class='hs-definition'>fillR</span> <span class='hs-varid'>v</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>v</span> <span class='hs-varop'>`seq`</span> <span class='hs-keyword'>do</span>
<a name="line-268"></a>                      <span class='hs-varid'>i</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-conid'>MStream</span><span class='hs-varop'>.</span><span class='hs-varid'>foldM</span> <span class='hs-varid'>put</span> <span class='hs-varid'>n</span> <span class='hs-varid'>s</span>
<a name="line-269"></a>                      <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-varid'>unsafeSlice</span> <span class='hs-varid'>i</span> <span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-comment'>-</span><span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-varid'>v</span>
<a name="line-270"></a>  <span class='hs-keyword'>where</span>
<a name="line-271"></a>    <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>length</span> <span class='hs-varid'>v</span>
<a name="line-272"></a>
<a name="line-273"></a>    <span class='hs-comment'>{-# INLINE_INNER put #-}</span>
<a name="line-274"></a>    <span class='hs-varid'>put</span> <span class='hs-varid'>i</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-275"></a>                <span class='hs-varid'>unsafeWrite</span> <span class='hs-varid'>v</span> <span class='hs-varid'>j</span> <span class='hs-varid'>x</span>
<a name="line-276"></a>                <span class='hs-varid'>return</span> <span class='hs-varid'>j</span>
<a name="line-277"></a>      <span class='hs-keyword'>where</span>
<a name="line-278"></a>        <span class='hs-varid'>j</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>i</span><span class='hs-comment'>-</span><span class='hs-num'>1</span>
<a name="line-279"></a>
<a name="line-280"></a><a name="transformR"></a><span class='hs-definition'>transformR</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-281"></a>  <span class='hs-keyglyph'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>MStream</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>MStream</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-282"></a><span class='hs-comment'>{-# INLINE_STREAM transformR #-}</span>
<a name="line-283"></a><span class='hs-definition'>transformR</span> <span class='hs-varid'>f</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fillR</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-varid'>mstreamR</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-284"></a>
<a name="line-285"></a><a name="unstream"></a><span class='hs-comment'>-- | Create a new mutable vector and fill it with elements from the 'Stream'.</span>
<a name="line-286"></a><span class='hs-comment'>-- The vector will grow exponentially if the maximum size of the 'Stream' is</span>
<a name="line-287"></a><span class='hs-comment'>-- unknown.</span>
<a name="line-288"></a><span class='hs-definition'>unstream</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Stream</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-289"></a><span class='hs-comment'>-- NOTE: replace INLINE_STREAM by INLINE? (also in unstreamR)</span>
<a name="line-290"></a><span class='hs-comment'>{-# INLINE_STREAM unstream #-}</span>
<a name="line-291"></a><span class='hs-definition'>unstream</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>munstream</span> <span class='hs-layout'>(</span><span class='hs-conid'>Stream</span><span class='hs-varop'>.</span><span class='hs-varid'>liftStream</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>
<a name="line-292"></a>
<a name="line-293"></a><a name="munstream"></a><span class='hs-comment'>-- | Create a new mutable vector and fill it with elements from the monadic</span>
<a name="line-294"></a><span class='hs-comment'>-- stream. The vector will grow exponentially if the maximum size of the stream</span>
<a name="line-295"></a><span class='hs-comment'>-- is unknown.</span>
<a name="line-296"></a><span class='hs-definition'>munstream</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>MStream</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-297"></a><span class='hs-comment'>{-# INLINE_STREAM munstream #-}</span>
<a name="line-298"></a><span class='hs-definition'>munstream</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>upperBound</span> <span class='hs-layout'>(</span><span class='hs-conid'>MStream</span><span class='hs-varop'>.</span><span class='hs-varid'>size</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyword'>of</span>
<a name="line-299"></a>               <span class='hs-conid'>Just</span> <span class='hs-varid'>n</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>munstreamMax</span>     <span class='hs-varid'>s</span> <span class='hs-varid'>n</span>
<a name="line-300"></a>               <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>munstreamUnknown</span> <span class='hs-varid'>s</span>
<a name="line-301"></a>
<a name="line-302"></a><span class='hs-comment'>-- FIXME: I can't think of how to prevent GHC from floating out</span>
<a name="line-303"></a><span class='hs-comment'>-- unstreamUnknown. That is bad because SpecConstr then generates two</span>
<a name="line-304"></a><span class='hs-comment'>-- specialisations: one for when it is called from unstream (it doesn't know</span>
<a name="line-305"></a><span class='hs-comment'>-- the shape of the vector) and one for when the vector has grown. To see the</span>
<a name="line-306"></a><span class='hs-comment'>-- problem simply compile this:</span>
<a name="line-307"></a><span class='hs-comment'>--</span>
<a name="line-308"></a><span class='hs-comment'>-- fromList = Data.Vector.Unboxed.unstream . Stream.fromList</span>
<a name="line-309"></a><span class='hs-comment'>--</span>
<a name="line-310"></a><span class='hs-comment'>-- I'm not sure this still applies (19/04/2010)</span>
<a name="line-311"></a>
<a name="line-312"></a><a name="munstreamMax"></a><span class='hs-definition'>munstreamMax</span>
<a name="line-313"></a>  <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>MStream</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-314"></a><span class='hs-comment'>{-# INLINE munstreamMax #-}</span>
<a name="line-315"></a><span class='hs-definition'>munstreamMax</span> <span class='hs-varid'>s</span> <span class='hs-varid'>n</span>
<a name="line-316"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-317"></a>      <span class='hs-varid'>v</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-conid'>INTERNAL_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>checkLength</span><span class='hs-layout'>)</span> <span class='hs-str'>"munstreamMax"</span> <span class='hs-varid'>n</span>
<a name="line-318"></a>           <span class='hs-varop'>$</span> <span class='hs-varid'>unsafeNew</span> <span class='hs-varid'>n</span>
<a name="line-319"></a>      <span class='hs-keyword'>let</span> <span class='hs-varid'>put</span> <span class='hs-varid'>i</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-320"></a>                       <span class='hs-conid'>INTERNAL_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>checkIndex</span><span class='hs-layout'>)</span> <span class='hs-str'>"munstreamMax"</span> <span class='hs-varid'>i</span> <span class='hs-varid'>n</span>
<a name="line-321"></a>                         <span class='hs-varop'>$</span> <span class='hs-varid'>unsafeWrite</span> <span class='hs-varid'>v</span> <span class='hs-varid'>i</span> <span class='hs-varid'>x</span>
<a name="line-322"></a>                       <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>)</span>
<a name="line-323"></a>      <span class='hs-varid'>n'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-conid'>MStream</span><span class='hs-varop'>.</span><span class='hs-varid'>foldM'</span> <span class='hs-varid'>put</span> <span class='hs-num'>0</span> <span class='hs-varid'>s</span>
<a name="line-324"></a>      <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-conid'>INTERNAL_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>checkSlice</span><span class='hs-layout'>)</span> <span class='hs-str'>"munstreamMax"</span> <span class='hs-num'>0</span> <span class='hs-varid'>n'</span> <span class='hs-varid'>n</span>
<a name="line-325"></a>             <span class='hs-varop'>$</span> <span class='hs-varid'>unsafeSlice</span> <span class='hs-num'>0</span> <span class='hs-varid'>n'</span> <span class='hs-varid'>v</span>
<a name="line-326"></a>
<a name="line-327"></a><a name="munstreamUnknown"></a><span class='hs-definition'>munstreamUnknown</span>
<a name="line-328"></a>  <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>MStream</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-329"></a><span class='hs-comment'>{-# INLINE munstreamUnknown #-}</span>
<a name="line-330"></a><span class='hs-definition'>munstreamUnknown</span> <span class='hs-varid'>s</span>
<a name="line-331"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-332"></a>      <span class='hs-varid'>v</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>unsafeNew</span> <span class='hs-num'>0</span>
<a name="line-333"></a>      <span class='hs-layout'>(</span><span class='hs-varid'>v'</span><span class='hs-layout'>,</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-conid'>MStream</span><span class='hs-varop'>.</span><span class='hs-varid'>foldM</span> <span class='hs-varid'>put</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span><span class='hs-layout'>,</span> <span class='hs-num'>0</span><span class='hs-layout'>)</span> <span class='hs-varid'>s</span>
<a name="line-334"></a>      <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-conid'>INTERNAL_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>checkSlice</span><span class='hs-layout'>)</span> <span class='hs-str'>"munstreamUnknown"</span> <span class='hs-num'>0</span> <span class='hs-varid'>n</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>v'</span><span class='hs-layout'>)</span>
<a name="line-335"></a>             <span class='hs-varop'>$</span> <span class='hs-varid'>unsafeSlice</span> <span class='hs-num'>0</span> <span class='hs-varid'>n</span> <span class='hs-varid'>v'</span>
<a name="line-336"></a>  <span class='hs-keyword'>where</span>
<a name="line-337"></a>    <span class='hs-comment'>{-# INLINE_INNER put #-}</span>
<a name="line-338"></a>    <span class='hs-varid'>put</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span><span class='hs-layout'>,</span><span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-339"></a>                    <span class='hs-varid'>v'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>unsafeAppend1</span> <span class='hs-varid'>v</span> <span class='hs-varid'>i</span> <span class='hs-varid'>x</span>
<a name="line-340"></a>                    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>v'</span><span class='hs-layout'>,</span><span class='hs-varid'>i</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>)</span>
<a name="line-341"></a>
<a name="line-342"></a><a name="unstreamR"></a><span class='hs-comment'>-- | Create a new mutable vector and fill it with elements from the 'Stream'</span>
<a name="line-343"></a><span class='hs-comment'>-- from right to left. The vector will grow exponentially if the maximum size</span>
<a name="line-344"></a><span class='hs-comment'>-- of the 'Stream' is unknown.</span>
<a name="line-345"></a><span class='hs-definition'>unstreamR</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Stream</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-346"></a><span class='hs-comment'>-- NOTE: replace INLINE_STREAM by INLINE? (also in unstream)</span>
<a name="line-347"></a><span class='hs-comment'>{-# INLINE_STREAM unstreamR #-}</span>
<a name="line-348"></a><span class='hs-definition'>unstreamR</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>munstreamR</span> <span class='hs-layout'>(</span><span class='hs-conid'>Stream</span><span class='hs-varop'>.</span><span class='hs-varid'>liftStream</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>
<a name="line-349"></a>
<a name="line-350"></a><a name="munstreamR"></a><span class='hs-comment'>-- | Create a new mutable vector and fill it with elements from the monadic</span>
<a name="line-351"></a><span class='hs-comment'>-- stream from right to left. The vector will grow exponentially if the maximum</span>
<a name="line-352"></a><span class='hs-comment'>-- size of the stream is unknown.</span>
<a name="line-353"></a><span class='hs-definition'>munstreamR</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>MStream</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-354"></a><span class='hs-comment'>{-# INLINE_STREAM munstreamR #-}</span>
<a name="line-355"></a><span class='hs-definition'>munstreamR</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>upperBound</span> <span class='hs-layout'>(</span><span class='hs-conid'>MStream</span><span class='hs-varop'>.</span><span class='hs-varid'>size</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyword'>of</span>
<a name="line-356"></a>               <span class='hs-conid'>Just</span> <span class='hs-varid'>n</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>munstreamRMax</span>     <span class='hs-varid'>s</span> <span class='hs-varid'>n</span>
<a name="line-357"></a>               <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>munstreamRUnknown</span> <span class='hs-varid'>s</span>
<a name="line-358"></a>
<a name="line-359"></a><a name="munstreamRMax"></a><span class='hs-definition'>munstreamRMax</span>
<a name="line-360"></a>  <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>MStream</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-361"></a><span class='hs-comment'>{-# INLINE munstreamRMax #-}</span>
<a name="line-362"></a><span class='hs-definition'>munstreamRMax</span> <span class='hs-varid'>s</span> <span class='hs-varid'>n</span>
<a name="line-363"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-364"></a>      <span class='hs-varid'>v</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-conid'>INTERNAL_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>checkLength</span><span class='hs-layout'>)</span> <span class='hs-str'>"munstreamRMax"</span> <span class='hs-varid'>n</span>
<a name="line-365"></a>           <span class='hs-varop'>$</span> <span class='hs-varid'>unsafeNew</span> <span class='hs-varid'>n</span>
<a name="line-366"></a>      <span class='hs-keyword'>let</span> <span class='hs-varid'>put</span> <span class='hs-varid'>i</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-367"></a>                      <span class='hs-keyword'>let</span> <span class='hs-varid'>i'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>i</span><span class='hs-comment'>-</span><span class='hs-num'>1</span>
<a name="line-368"></a>                      <span class='hs-conid'>INTERNAL_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>checkIndex</span><span class='hs-layout'>)</span> <span class='hs-str'>"munstreamRMax"</span> <span class='hs-varid'>i'</span> <span class='hs-varid'>n</span>
<a name="line-369"></a>                        <span class='hs-varop'>$</span> <span class='hs-varid'>unsafeWrite</span> <span class='hs-varid'>v</span> <span class='hs-varid'>i'</span> <span class='hs-varid'>x</span>
<a name="line-370"></a>                      <span class='hs-varid'>return</span> <span class='hs-varid'>i'</span>
<a name="line-371"></a>      <span class='hs-varid'>i</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-conid'>MStream</span><span class='hs-varop'>.</span><span class='hs-varid'>foldM'</span> <span class='hs-varid'>put</span> <span class='hs-varid'>n</span> <span class='hs-varid'>s</span>
<a name="line-372"></a>      <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-conid'>INTERNAL_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>checkSlice</span><span class='hs-layout'>)</span> <span class='hs-str'>"munstreamRMax"</span> <span class='hs-varid'>i</span> <span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-comment'>-</span><span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-varid'>n</span>
<a name="line-373"></a>             <span class='hs-varop'>$</span> <span class='hs-varid'>unsafeSlice</span> <span class='hs-varid'>i</span> <span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-comment'>-</span><span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-varid'>v</span>
<a name="line-374"></a>
<a name="line-375"></a><a name="munstreamRUnknown"></a><span class='hs-definition'>munstreamRUnknown</span>
<a name="line-376"></a>  <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>MStream</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-377"></a><span class='hs-comment'>{-# INLINE munstreamRUnknown #-}</span>
<a name="line-378"></a><span class='hs-definition'>munstreamRUnknown</span> <span class='hs-varid'>s</span>
<a name="line-379"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-380"></a>      <span class='hs-varid'>v</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>unsafeNew</span> <span class='hs-num'>0</span>
<a name="line-381"></a>      <span class='hs-layout'>(</span><span class='hs-varid'>v'</span><span class='hs-layout'>,</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-conid'>MStream</span><span class='hs-varop'>.</span><span class='hs-varid'>foldM</span> <span class='hs-varid'>put</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span><span class='hs-layout'>,</span> <span class='hs-num'>0</span><span class='hs-layout'>)</span> <span class='hs-varid'>s</span>
<a name="line-382"></a>      <span class='hs-keyword'>let</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>length</span> <span class='hs-varid'>v'</span>
<a name="line-383"></a>      <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-conid'>INTERNAL_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>checkSlice</span><span class='hs-layout'>)</span> <span class='hs-str'>"unstreamRUnknown"</span> <span class='hs-varid'>i</span> <span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-comment'>-</span><span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-varid'>n</span>
<a name="line-384"></a>             <span class='hs-varop'>$</span> <span class='hs-varid'>unsafeSlice</span> <span class='hs-varid'>i</span> <span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-comment'>-</span><span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-varid'>v'</span>
<a name="line-385"></a>  <span class='hs-keyword'>where</span>
<a name="line-386"></a>    <span class='hs-comment'>{-# INLINE_INNER put #-}</span>
<a name="line-387"></a>    <span class='hs-varid'>put</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span><span class='hs-layout'>,</span><span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unsafePrepend1</span> <span class='hs-varid'>v</span> <span class='hs-varid'>i</span> <span class='hs-varid'>x</span>
<a name="line-388"></a>
<a name="line-389"></a><span class='hs-comment'>-- Length</span>
<a name="line-390"></a><span class='hs-comment'>-- ------</span>
<a name="line-391"></a>
<a name="line-392"></a><a name="length"></a><span class='hs-comment'>-- | Length of the mutable vector.</span>
<a name="line-393"></a><span class='hs-definition'>length</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-varid'>s</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span>
<a name="line-394"></a><span class='hs-comment'>{-# INLINE length #-}</span>
<a name="line-395"></a><span class='hs-definition'>length</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>basicLength</span>
<a name="line-396"></a>
<a name="line-397"></a><a name="null"></a><span class='hs-comment'>-- | Check whether the vector is empty</span>
<a name="line-398"></a><span class='hs-definition'>null</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-varid'>s</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-399"></a><span class='hs-comment'>{-# INLINE null #-}</span>
<a name="line-400"></a><span class='hs-definition'>null</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>length</span> <span class='hs-varid'>v</span> <span class='hs-varop'>==</span> <span class='hs-num'>0</span>
<a name="line-401"></a>
<a name="line-402"></a><span class='hs-comment'>-- Extracting subvectors</span>
<a name="line-403"></a><span class='hs-comment'>-- ---------------------</span>
<a name="line-404"></a>
<a name="line-405"></a><a name="slice"></a><span class='hs-comment'>-- | Yield a part of the mutable vector without copying it.</span>
<a name="line-406"></a><span class='hs-definition'>slice</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>v</span> <span class='hs-varid'>s</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>v</span> <span class='hs-varid'>s</span> <span class='hs-varid'>a</span>
<a name="line-407"></a><span class='hs-comment'>{-# INLINE slice #-}</span>
<a name="line-408"></a><span class='hs-definition'>slice</span> <span class='hs-varid'>i</span> <span class='hs-varid'>n</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>BOUNDS_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>checkSlice</span><span class='hs-layout'>)</span> <span class='hs-str'>"slice"</span> <span class='hs-varid'>i</span> <span class='hs-varid'>n</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span>
<a name="line-409"></a>            <span class='hs-varop'>$</span> <span class='hs-varid'>unsafeSlice</span> <span class='hs-varid'>i</span> <span class='hs-varid'>n</span> <span class='hs-varid'>v</span>
<a name="line-410"></a>
<a name="line-411"></a><a name="take"></a><span class='hs-definition'>take</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>v</span> <span class='hs-varid'>s</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>v</span> <span class='hs-varid'>s</span> <span class='hs-varid'>a</span>
<a name="line-412"></a><span class='hs-comment'>{-# INLINE take #-}</span>
<a name="line-413"></a><span class='hs-definition'>take</span> <span class='hs-varid'>n</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unsafeSlice</span> <span class='hs-num'>0</span> <span class='hs-layout'>(</span><span class='hs-varid'>min</span> <span class='hs-layout'>(</span><span class='hs-varid'>max</span> <span class='hs-varid'>n</span> <span class='hs-num'>0</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>v</span>
<a name="line-414"></a>
<a name="line-415"></a><a name="drop"></a><span class='hs-definition'>drop</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>v</span> <span class='hs-varid'>s</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>v</span> <span class='hs-varid'>s</span> <span class='hs-varid'>a</span>
<a name="line-416"></a><span class='hs-comment'>{-# INLINE drop #-}</span>
<a name="line-417"></a><span class='hs-definition'>drop</span> <span class='hs-varid'>n</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unsafeSlice</span> <span class='hs-layout'>(</span><span class='hs-varid'>min</span> <span class='hs-varid'>m</span> <span class='hs-varid'>n'</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>max</span> <span class='hs-num'>0</span> <span class='hs-layout'>(</span><span class='hs-varid'>m</span> <span class='hs-comment'>-</span> <span class='hs-varid'>n'</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>v</span>
<a name="line-418"></a>  <span class='hs-keyword'>where</span>
<a name="line-419"></a>    <span class='hs-varid'>n'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>max</span> <span class='hs-varid'>n</span> <span class='hs-num'>0</span>
<a name="line-420"></a>    <span class='hs-varid'>m</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>length</span> <span class='hs-varid'>v</span>
<a name="line-421"></a>
<a name="line-422"></a><a name="splitAt"></a><span class='hs-comment'>{-# INLINE splitAt #-}</span>
<a name="line-423"></a><span class='hs-definition'>splitAt</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>v</span> <span class='hs-varid'>s</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span> <span class='hs-varid'>s</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-varid'>v</span> <span class='hs-varid'>s</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-424"></a><span class='hs-definition'>splitAt</span> <span class='hs-varid'>n</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span> <span class='hs-varid'>unsafeSlice</span> <span class='hs-num'>0</span> <span class='hs-varid'>m</span> <span class='hs-varid'>v</span>
<a name="line-425"></a>              <span class='hs-layout'>,</span> <span class='hs-varid'>unsafeSlice</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>max</span> <span class='hs-num'>0</span> <span class='hs-layout'>(</span><span class='hs-varid'>len</span> <span class='hs-comment'>-</span> <span class='hs-varid'>n'</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>v</span>
<a name="line-426"></a>              <span class='hs-layout'>)</span>
<a name="line-427"></a>    <span class='hs-keyword'>where</span>
<a name="line-428"></a>      <span class='hs-varid'>m</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>min</span> <span class='hs-varid'>n'</span> <span class='hs-varid'>len</span>
<a name="line-429"></a>      <span class='hs-varid'>n'</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>max</span> <span class='hs-varid'>n</span> <span class='hs-num'>0</span>
<a name="line-430"></a>      <span class='hs-varid'>len</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>length</span> <span class='hs-varid'>v</span>
<a name="line-431"></a>
<a name="line-432"></a><a name="init"></a><span class='hs-definition'>init</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-varid'>s</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>v</span> <span class='hs-varid'>s</span> <span class='hs-varid'>a</span>
<a name="line-433"></a><span class='hs-comment'>{-# INLINE init #-}</span>
<a name="line-434"></a><span class='hs-definition'>init</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>slice</span> <span class='hs-num'>0</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>v</span> <span class='hs-comment'>-</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varid'>v</span>
<a name="line-435"></a>
<a name="line-436"></a><a name="tail"></a><span class='hs-definition'>tail</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-varid'>s</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>v</span> <span class='hs-varid'>s</span> <span class='hs-varid'>a</span>
<a name="line-437"></a><span class='hs-comment'>{-# INLINE tail #-}</span>
<a name="line-438"></a><span class='hs-definition'>tail</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>slice</span> <span class='hs-num'>1</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>v</span> <span class='hs-comment'>-</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varid'>v</span>
<a name="line-439"></a>
<a name="line-440"></a><a name="unsafeSlice"></a><span class='hs-comment'>-- | Yield a part of the mutable vector without copying it. No bounds checks</span>
<a name="line-441"></a><span class='hs-comment'>-- are performed.</span>
<a name="line-442"></a><span class='hs-definition'>unsafeSlice</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Int</span>  <span class='hs-comment'>-- ^ starting index</span>
<a name="line-443"></a>                           <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span>  <span class='hs-comment'>-- ^ length of the slice</span>
<a name="line-444"></a>                           <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>v</span> <span class='hs-varid'>s</span> <span class='hs-varid'>a</span>
<a name="line-445"></a>                           <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>v</span> <span class='hs-varid'>s</span> <span class='hs-varid'>a</span>
<a name="line-446"></a><span class='hs-comment'>{-# INLINE unsafeSlice #-}</span>
<a name="line-447"></a><span class='hs-definition'>unsafeSlice</span> <span class='hs-varid'>i</span> <span class='hs-varid'>n</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>UNSAFE_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>checkSlice</span><span class='hs-layout'>)</span> <span class='hs-str'>"unsafeSlice"</span> <span class='hs-varid'>i</span> <span class='hs-varid'>n</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span>
<a name="line-448"></a>                  <span class='hs-varop'>$</span> <span class='hs-varid'>basicUnsafeSlice</span> <span class='hs-varid'>i</span> <span class='hs-varid'>n</span> <span class='hs-varid'>v</span>
<a name="line-449"></a>
<a name="line-450"></a><a name="unsafeInit"></a><span class='hs-definition'>unsafeInit</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-varid'>s</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>v</span> <span class='hs-varid'>s</span> <span class='hs-varid'>a</span>
<a name="line-451"></a><span class='hs-comment'>{-# INLINE unsafeInit #-}</span>
<a name="line-452"></a><span class='hs-definition'>unsafeInit</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unsafeSlice</span> <span class='hs-num'>0</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>v</span> <span class='hs-comment'>-</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varid'>v</span>
<a name="line-453"></a>
<a name="line-454"></a><a name="unsafeTail"></a><span class='hs-definition'>unsafeTail</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-varid'>s</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>v</span> <span class='hs-varid'>s</span> <span class='hs-varid'>a</span>
<a name="line-455"></a><span class='hs-comment'>{-# INLINE unsafeTail #-}</span>
<a name="line-456"></a><span class='hs-definition'>unsafeTail</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unsafeSlice</span> <span class='hs-num'>1</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>v</span> <span class='hs-comment'>-</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varid'>v</span>
<a name="line-457"></a>
<a name="line-458"></a><a name="unsafeTake"></a><span class='hs-definition'>unsafeTake</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>v</span> <span class='hs-varid'>s</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>v</span> <span class='hs-varid'>s</span> <span class='hs-varid'>a</span>
<a name="line-459"></a><span class='hs-comment'>{-# INLINE unsafeTake #-}</span>
<a name="line-460"></a><span class='hs-definition'>unsafeTake</span> <span class='hs-varid'>n</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unsafeSlice</span> <span class='hs-num'>0</span> <span class='hs-varid'>n</span> <span class='hs-varid'>v</span>
<a name="line-461"></a>
<a name="line-462"></a><a name="unsafeDrop"></a><span class='hs-definition'>unsafeDrop</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>v</span> <span class='hs-varid'>s</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>v</span> <span class='hs-varid'>s</span> <span class='hs-varid'>a</span>
<a name="line-463"></a><span class='hs-comment'>{-# INLINE unsafeDrop #-}</span>
<a name="line-464"></a><span class='hs-definition'>unsafeDrop</span> <span class='hs-varid'>n</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unsafeSlice</span> <span class='hs-varid'>n</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>v</span> <span class='hs-comment'>-</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span> <span class='hs-varid'>v</span>
<a name="line-465"></a>
<a name="line-466"></a><span class='hs-comment'>-- Overlapping</span>
<a name="line-467"></a><span class='hs-comment'>-- -----------</span>
<a name="line-468"></a>
<a name="line-469"></a><a name="overlaps"></a><span class='hs-comment'>-- Check whether two vectors overlap.</span>
<a name="line-470"></a><span class='hs-definition'>overlaps</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-varid'>s</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>v</span> <span class='hs-varid'>s</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-471"></a><span class='hs-comment'>{-# INLINE overlaps #-}</span>
<a name="line-472"></a><span class='hs-definition'>overlaps</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>basicOverlaps</span>
<a name="line-473"></a>
<a name="line-474"></a><span class='hs-comment'>-- Initialisation</span>
<a name="line-475"></a><span class='hs-comment'>-- --------------</span>
<a name="line-476"></a>
<a name="line-477"></a><a name="new"></a><span class='hs-comment'>-- | Create a mutable vector of the given length.</span>
<a name="line-478"></a><span class='hs-definition'>new</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-479"></a><span class='hs-comment'>{-# INLINE new #-}</span>
<a name="line-480"></a><span class='hs-definition'>new</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>BOUNDS_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>checkLength</span><span class='hs-layout'>)</span> <span class='hs-str'>"new"</span> <span class='hs-varid'>n</span>
<a name="line-481"></a>      <span class='hs-varop'>$</span> <span class='hs-varid'>unsafeNew</span> <span class='hs-varid'>n</span>
<a name="line-482"></a>
<a name="line-483"></a><a name="unsafeNew"></a><span class='hs-comment'>-- | Create a mutable vector of the given length. The length is not checked.</span>
<a name="line-484"></a><span class='hs-definition'>unsafeNew</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-485"></a><span class='hs-comment'>{-# INLINE unsafeNew #-}</span>
<a name="line-486"></a><span class='hs-definition'>unsafeNew</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>UNSAFE_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>checkLength</span><span class='hs-layout'>)</span> <span class='hs-str'>"unsafeNew"</span> <span class='hs-varid'>n</span>
<a name="line-487"></a>            <span class='hs-varop'>$</span> <span class='hs-varid'>basicUnsafeNew</span> <span class='hs-varid'>n</span>
<a name="line-488"></a>
<a name="line-489"></a><a name="replicate"></a><span class='hs-comment'>-- | Create a mutable vector of the given length (0 if the length is negative)</span>
<a name="line-490"></a><span class='hs-comment'>-- and fill it with an initial value.</span>
<a name="line-491"></a><span class='hs-definition'>replicate</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-492"></a><span class='hs-comment'>{-# INLINE replicate #-}</span>
<a name="line-493"></a><span class='hs-definition'>replicate</span> <span class='hs-varid'>n</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>basicUnsafeReplicate</span> <span class='hs-layout'>(</span><span class='hs-varid'>delay_inline</span> <span class='hs-varid'>max</span> <span class='hs-num'>0</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span> <span class='hs-varid'>x</span>
<a name="line-494"></a>
<a name="line-495"></a><a name="replicateM"></a><span class='hs-comment'>-- | Create a mutable vector of the given length (0 if the length is negative)</span>
<a name="line-496"></a><span class='hs-comment'>-- and fill it with values produced by repeatedly executing the monadic action.</span>
<a name="line-497"></a><span class='hs-definition'>replicateM</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-498"></a><span class='hs-comment'>{-# INLINE replicateM #-}</span>
<a name="line-499"></a><span class='hs-definition'>replicateM</span> <span class='hs-varid'>n</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>munstream</span> <span class='hs-layout'>(</span><span class='hs-conid'>MStream</span><span class='hs-varop'>.</span><span class='hs-varid'>replicateM</span> <span class='hs-varid'>n</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span>
<a name="line-500"></a>
<a name="line-501"></a><a name="clone"></a><span class='hs-comment'>-- | Create a copy of a mutable vector.</span>
<a name="line-502"></a><span class='hs-definition'>clone</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-503"></a><span class='hs-comment'>{-# INLINE clone #-}</span>
<a name="line-504"></a><span class='hs-definition'>clone</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-505"></a>            <span class='hs-varid'>v'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>unsafeNew</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span>
<a name="line-506"></a>            <span class='hs-varid'>unsafeCopy</span> <span class='hs-varid'>v'</span> <span class='hs-varid'>v</span>
<a name="line-507"></a>            <span class='hs-varid'>return</span> <span class='hs-varid'>v'</span>
<a name="line-508"></a>
<a name="line-509"></a><span class='hs-comment'>-- Growing</span>
<a name="line-510"></a><span class='hs-comment'>-- -------</span>
<a name="line-511"></a>
<a name="line-512"></a><a name="grow"></a><span class='hs-comment'>-- | Grow a vector by the given number of elements. The number must be</span>
<a name="line-513"></a><span class='hs-comment'>-- positive.</span>
<a name="line-514"></a><span class='hs-definition'>grow</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-515"></a>                <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-516"></a><span class='hs-comment'>{-# INLINE grow #-}</span>
<a name="line-517"></a><span class='hs-definition'>grow</span> <span class='hs-varid'>v</span> <span class='hs-varid'>by</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>BOUNDS_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>checkLength</span><span class='hs-layout'>)</span> <span class='hs-str'>"grow"</span> <span class='hs-varid'>by</span>
<a name="line-518"></a>          <span class='hs-varop'>$</span> <span class='hs-varid'>unsafeGrow</span> <span class='hs-varid'>v</span> <span class='hs-varid'>by</span>
<a name="line-519"></a>
<a name="line-520"></a><a name="growFront"></a><span class='hs-definition'>growFront</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-521"></a>                <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-522"></a><span class='hs-comment'>{-# INLINE growFront #-}</span>
<a name="line-523"></a><span class='hs-definition'>growFront</span> <span class='hs-varid'>v</span> <span class='hs-varid'>by</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>BOUNDS_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>checkLength</span><span class='hs-layout'>)</span> <span class='hs-str'>"growFront"</span> <span class='hs-varid'>by</span>
<a name="line-524"></a>               <span class='hs-varop'>$</span> <span class='hs-varid'>unsafeGrowFront</span> <span class='hs-varid'>v</span> <span class='hs-varid'>by</span>
<a name="line-525"></a>
<a name="line-526"></a><a name="enlarge_delta"></a><span class='hs-definition'>enlarge_delta</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>max</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span> <span class='hs-num'>1</span>
<a name="line-527"></a>
<a name="line-528"></a><a name="enlarge"></a><span class='hs-comment'>-- | Grow a vector logarithmically</span>
<a name="line-529"></a><span class='hs-definition'>enlarge</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-530"></a>                <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-531"></a><span class='hs-comment'>{-# INLINE enlarge #-}</span>
<a name="line-532"></a><span class='hs-definition'>enlarge</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unsafeGrow</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-varid'>enlarge_delta</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span>
<a name="line-533"></a>
<a name="line-534"></a><a name="enlargeFront"></a><span class='hs-definition'>enlargeFront</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-535"></a>                <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>Int</span><span class='hs-layout'>)</span>
<a name="line-536"></a><span class='hs-comment'>{-# INLINE enlargeFront #-}</span>
<a name="line-537"></a><span class='hs-definition'>enlargeFront</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-538"></a>                   <span class='hs-varid'>v'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>unsafeGrowFront</span> <span class='hs-varid'>v</span> <span class='hs-varid'>by</span>
<a name="line-539"></a>                   <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>v'</span><span class='hs-layout'>,</span> <span class='hs-varid'>by</span><span class='hs-layout'>)</span>
<a name="line-540"></a>  <span class='hs-keyword'>where</span>
<a name="line-541"></a>    <span class='hs-varid'>by</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>enlarge_delta</span> <span class='hs-varid'>v</span>
<a name="line-542"></a>
<a name="line-543"></a><a name="unsafeGrow"></a><span class='hs-comment'>-- | Grow a vector by the given number of elements. The number must be</span>
<a name="line-544"></a><span class='hs-comment'>-- positive but this is not checked.</span>
<a name="line-545"></a><span class='hs-definition'>unsafeGrow</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-546"></a>                        <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-547"></a><span class='hs-comment'>{-# INLINE unsafeGrow #-}</span>
<a name="line-548"></a><span class='hs-definition'>unsafeGrow</span> <span class='hs-varid'>v</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>UNSAFE_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>checkLength</span><span class='hs-layout'>)</span> <span class='hs-str'>"unsafeGrow"</span> <span class='hs-varid'>n</span>
<a name="line-549"></a>               <span class='hs-varop'>$</span> <span class='hs-varid'>basicUnsafeGrow</span> <span class='hs-varid'>v</span> <span class='hs-varid'>n</span>
<a name="line-550"></a>
<a name="line-551"></a><a name="unsafeGrowFront"></a><span class='hs-definition'>unsafeGrowFront</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-552"></a>                        <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-553"></a><span class='hs-comment'>{-# INLINE unsafeGrowFront #-}</span>
<a name="line-554"></a><span class='hs-definition'>unsafeGrowFront</span> <span class='hs-varid'>v</span> <span class='hs-varid'>by</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>UNSAFE_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>checkLength</span><span class='hs-layout'>)</span> <span class='hs-str'>"unsafeGrowFront"</span> <span class='hs-varid'>by</span>
<a name="line-555"></a>                     <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-556"></a>                         <span class='hs-keyword'>let</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>length</span> <span class='hs-varid'>v</span>
<a name="line-557"></a>                         <span class='hs-varid'>v'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>basicUnsafeNew</span> <span class='hs-layout'>(</span><span class='hs-varid'>by</span><span class='hs-varop'>+</span><span class='hs-varid'>n</span><span class='hs-layout'>)</span>
<a name="line-558"></a>                         <span class='hs-varid'>basicUnsafeCopy</span> <span class='hs-layout'>(</span><span class='hs-varid'>basicUnsafeSlice</span> <span class='hs-varid'>by</span> <span class='hs-varid'>n</span> <span class='hs-varid'>v'</span><span class='hs-layout'>)</span> <span class='hs-varid'>v</span>
<a name="line-559"></a>                         <span class='hs-varid'>return</span> <span class='hs-varid'>v'</span>
<a name="line-560"></a>
<a name="line-561"></a><span class='hs-comment'>-- Restricting memory usage</span>
<a name="line-562"></a><span class='hs-comment'>-- ------------------------</span>
<a name="line-563"></a>
<a name="line-564"></a><a name="clear"></a><span class='hs-comment'>-- | Reset all elements of the vector to some undefined value, clearing all</span>
<a name="line-565"></a><span class='hs-comment'>-- references to external objects. This is usually a noop for unboxed vectors. </span>
<a name="line-566"></a><span class='hs-definition'>clear</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span>
<a name="line-567"></a><span class='hs-comment'>{-# INLINE clear #-}</span>
<a name="line-568"></a><span class='hs-definition'>clear</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>basicClear</span>
<a name="line-569"></a>
<a name="line-570"></a><span class='hs-comment'>-- Accessing individual elements</span>
<a name="line-571"></a><span class='hs-comment'>-- -----------------------------</span>
<a name="line-572"></a>
<a name="line-573"></a><a name="read"></a><span class='hs-comment'>-- | Yield the element at the given position.</span>
<a name="line-574"></a><span class='hs-definition'>read</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span>
<a name="line-575"></a><span class='hs-comment'>{-# INLINE read #-}</span>
<a name="line-576"></a><span class='hs-definition'>read</span> <span class='hs-varid'>v</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>BOUNDS_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>checkIndex</span><span class='hs-layout'>)</span> <span class='hs-str'>"read"</span> <span class='hs-varid'>i</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span>
<a name="line-577"></a>         <span class='hs-varop'>$</span> <span class='hs-varid'>unsafeRead</span> <span class='hs-varid'>v</span> <span class='hs-varid'>i</span>
<a name="line-578"></a>
<a name="line-579"></a><a name="write"></a><span class='hs-comment'>-- | Replace the element at the given position.</span>
<a name="line-580"></a><span class='hs-definition'>write</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span>
<a name="line-581"></a><span class='hs-comment'>{-# INLINE write #-}</span>
<a name="line-582"></a><span class='hs-definition'>write</span> <span class='hs-varid'>v</span> <span class='hs-varid'>i</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>BOUNDS_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>checkIndex</span><span class='hs-layout'>)</span> <span class='hs-str'>"write"</span> <span class='hs-varid'>i</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span>
<a name="line-583"></a>            <span class='hs-varop'>$</span> <span class='hs-varid'>unsafeWrite</span> <span class='hs-varid'>v</span> <span class='hs-varid'>i</span> <span class='hs-varid'>x</span>
<a name="line-584"></a>
<a name="line-585"></a><a name="swap"></a><span class='hs-comment'>-- | Swap the elements at the given positions.</span>
<a name="line-586"></a><span class='hs-definition'>swap</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span>
<a name="line-587"></a><span class='hs-comment'>{-# INLINE swap #-}</span>
<a name="line-588"></a><span class='hs-definition'>swap</span> <span class='hs-varid'>v</span> <span class='hs-varid'>i</span> <span class='hs-varid'>j</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>BOUNDS_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>checkIndex</span><span class='hs-layout'>)</span> <span class='hs-str'>"swap"</span> <span class='hs-varid'>i</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span>
<a name="line-589"></a>           <span class='hs-varop'>$</span> <span class='hs-conid'>BOUNDS_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>checkIndex</span><span class='hs-layout'>)</span> <span class='hs-str'>"swap"</span> <span class='hs-varid'>j</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span>
<a name="line-590"></a>           <span class='hs-varop'>$</span> <span class='hs-varid'>unsafeSwap</span> <span class='hs-varid'>v</span> <span class='hs-varid'>i</span> <span class='hs-varid'>j</span>
<a name="line-591"></a>
<a name="line-592"></a><a name="exchange"></a><span class='hs-comment'>-- | Replace the element at the give position and return the old element.</span>
<a name="line-593"></a><span class='hs-definition'>exchange</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span>
<a name="line-594"></a><span class='hs-comment'>{-# INLINE exchange #-}</span>
<a name="line-595"></a><span class='hs-definition'>exchange</span> <span class='hs-varid'>v</span> <span class='hs-varid'>i</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>BOUNDS_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>checkIndex</span><span class='hs-layout'>)</span> <span class='hs-str'>"exchange"</span> <span class='hs-varid'>i</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span>
<a name="line-596"></a>               <span class='hs-varop'>$</span> <span class='hs-varid'>unsafeExchange</span> <span class='hs-varid'>v</span> <span class='hs-varid'>i</span> <span class='hs-varid'>x</span>
<a name="line-597"></a>
<a name="line-598"></a><a name="unsafeRead"></a><span class='hs-comment'>-- | Yield the element at the given position. No bounds checks are performed.</span>
<a name="line-599"></a><span class='hs-definition'>unsafeRead</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span>
<a name="line-600"></a><span class='hs-comment'>{-# INLINE unsafeRead #-}</span>
<a name="line-601"></a><span class='hs-definition'>unsafeRead</span> <span class='hs-varid'>v</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>UNSAFE_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>checkIndex</span><span class='hs-layout'>)</span> <span class='hs-str'>"unsafeRead"</span> <span class='hs-varid'>i</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span>
<a name="line-602"></a>               <span class='hs-varop'>$</span> <span class='hs-varid'>basicUnsafeRead</span> <span class='hs-varid'>v</span> <span class='hs-varid'>i</span>
<a name="line-603"></a>
<a name="line-604"></a><a name="unsafeWrite"></a><span class='hs-comment'>-- | Replace the element at the given position. No bounds checks are performed.</span>
<a name="line-605"></a><span class='hs-definition'>unsafeWrite</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-606"></a>                                <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span>
<a name="line-607"></a><span class='hs-comment'>{-# INLINE unsafeWrite #-}</span>
<a name="line-608"></a><span class='hs-definition'>unsafeWrite</span> <span class='hs-varid'>v</span> <span class='hs-varid'>i</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>UNSAFE_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>checkIndex</span><span class='hs-layout'>)</span> <span class='hs-str'>"unsafeWrite"</span> <span class='hs-varid'>i</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span>
<a name="line-609"></a>                  <span class='hs-varop'>$</span> <span class='hs-varid'>basicUnsafeWrite</span> <span class='hs-varid'>v</span> <span class='hs-varid'>i</span> <span class='hs-varid'>x</span>
<a name="line-610"></a>
<a name="line-611"></a><a name="unsafeSwap"></a><span class='hs-comment'>-- | Swap the elements at the given positions. No bounds checks are performed.</span>
<a name="line-612"></a><span class='hs-definition'>unsafeSwap</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-613"></a>                <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span>
<a name="line-614"></a><span class='hs-comment'>{-# INLINE unsafeSwap #-}</span>
<a name="line-615"></a><span class='hs-definition'>unsafeSwap</span> <span class='hs-varid'>v</span> <span class='hs-varid'>i</span> <span class='hs-varid'>j</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>UNSAFE_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>checkIndex</span><span class='hs-layout'>)</span> <span class='hs-str'>"unsafeSwap"</span> <span class='hs-varid'>i</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span>
<a name="line-616"></a>                 <span class='hs-varop'>$</span> <span class='hs-conid'>UNSAFE_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>checkIndex</span><span class='hs-layout'>)</span> <span class='hs-str'>"unsafeSwap"</span> <span class='hs-varid'>j</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span>
<a name="line-617"></a>                 <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-618"></a>                     <span class='hs-varid'>x</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>unsafeRead</span> <span class='hs-varid'>v</span> <span class='hs-varid'>i</span>
<a name="line-619"></a>                     <span class='hs-varid'>y</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>unsafeRead</span> <span class='hs-varid'>v</span> <span class='hs-varid'>j</span>
<a name="line-620"></a>                     <span class='hs-varid'>unsafeWrite</span> <span class='hs-varid'>v</span> <span class='hs-varid'>i</span> <span class='hs-varid'>y</span>
<a name="line-621"></a>                     <span class='hs-varid'>unsafeWrite</span> <span class='hs-varid'>v</span> <span class='hs-varid'>j</span> <span class='hs-varid'>x</span>
<a name="line-622"></a>
<a name="line-623"></a><a name="unsafeExchange"></a><span class='hs-comment'>-- | Replace the element at the give position and return the old element. No</span>
<a name="line-624"></a><span class='hs-comment'>-- bounds checks are performed.</span>
<a name="line-625"></a><span class='hs-definition'>unsafeExchange</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-626"></a>                                <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span>
<a name="line-627"></a><span class='hs-comment'>{-# INLINE unsafeExchange #-}</span>
<a name="line-628"></a><span class='hs-definition'>unsafeExchange</span> <span class='hs-varid'>v</span> <span class='hs-varid'>i</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>UNSAFE_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>checkIndex</span><span class='hs-layout'>)</span> <span class='hs-str'>"unsafeExchange"</span> <span class='hs-varid'>i</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span>
<a name="line-629"></a>                     <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-630"></a>                         <span class='hs-varid'>y</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>unsafeRead</span> <span class='hs-varid'>v</span> <span class='hs-varid'>i</span>
<a name="line-631"></a>                         <span class='hs-varid'>unsafeWrite</span> <span class='hs-varid'>v</span> <span class='hs-varid'>i</span> <span class='hs-varid'>x</span>
<a name="line-632"></a>                         <span class='hs-varid'>return</span> <span class='hs-varid'>y</span>
<a name="line-633"></a>
<a name="line-634"></a><span class='hs-comment'>-- Filling and copying</span>
<a name="line-635"></a><span class='hs-comment'>-- -------------------</span>
<a name="line-636"></a>
<a name="line-637"></a><a name="set"></a><span class='hs-comment'>-- | Set all elements of the vector to the given value.</span>
<a name="line-638"></a><span class='hs-definition'>set</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span>
<a name="line-639"></a><span class='hs-comment'>{-# INLINE set #-}</span>
<a name="line-640"></a><span class='hs-definition'>set</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>basicSet</span>
<a name="line-641"></a>
<a name="line-642"></a><a name="copy"></a><span class='hs-comment'>-- | Copy a vector. The two vectors must have the same length and may not</span>
<a name="line-643"></a><span class='hs-comment'>-- overlap.</span>
<a name="line-644"></a><span class='hs-definition'>copy</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-645"></a>                <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span>
<a name="line-646"></a><span class='hs-comment'>{-# INLINE copy #-}</span>
<a name="line-647"></a><span class='hs-definition'>copy</span> <span class='hs-varid'>dst</span> <span class='hs-varid'>src</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>BOUNDS_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>check</span><span class='hs-layout'>)</span> <span class='hs-str'>"copy"</span> <span class='hs-str'>"overlapping vectors"</span>
<a name="line-648"></a>                                          <span class='hs-layout'>(</span><span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>dst</span> <span class='hs-varop'>`overlaps`</span> <span class='hs-varid'>src</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-649"></a>             <span class='hs-varop'>$</span> <span class='hs-conid'>BOUNDS_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>check</span><span class='hs-layout'>)</span> <span class='hs-str'>"copy"</span> <span class='hs-str'>"length mismatch"</span>
<a name="line-650"></a>                                          <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>dst</span> <span class='hs-varop'>==</span> <span class='hs-varid'>length</span> <span class='hs-varid'>src</span><span class='hs-layout'>)</span>
<a name="line-651"></a>             <span class='hs-varop'>$</span> <span class='hs-varid'>unsafeCopy</span> <span class='hs-varid'>dst</span> <span class='hs-varid'>src</span>
<a name="line-652"></a>
<a name="line-653"></a><a name="move"></a><span class='hs-comment'>-- | Move the contents of a vector. The two vectors must have the same</span>
<a name="line-654"></a><span class='hs-comment'>-- length.</span>
<a name="line-655"></a><span class='hs-comment'>-- </span>
<a name="line-656"></a><span class='hs-comment'>-- If the vectors do not overlap, then this is equivalent to 'copy'.</span>
<a name="line-657"></a><span class='hs-comment'>-- Otherwise, the copying is performed as if the source vector were</span>
<a name="line-658"></a><span class='hs-comment'>-- copied to a temporary vector and then the temporary vector was copied</span>
<a name="line-659"></a><span class='hs-comment'>-- to the target vector.</span>
<a name="line-660"></a><span class='hs-definition'>move</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-661"></a>                <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span>
<a name="line-662"></a><span class='hs-comment'>{-# INLINE move #-}</span>
<a name="line-663"></a><span class='hs-definition'>move</span> <span class='hs-varid'>dst</span> <span class='hs-varid'>src</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>BOUNDS_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>check</span><span class='hs-layout'>)</span> <span class='hs-str'>"move"</span> <span class='hs-str'>"length mismatch"</span>
<a name="line-664"></a>                                          <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>dst</span> <span class='hs-varop'>==</span> <span class='hs-varid'>length</span> <span class='hs-varid'>src</span><span class='hs-layout'>)</span>
<a name="line-665"></a>             <span class='hs-varop'>$</span> <span class='hs-varid'>unsafeMove</span> <span class='hs-varid'>dst</span> <span class='hs-varid'>src</span>
<a name="line-666"></a>
<a name="line-667"></a><a name="unsafeCopy"></a><span class='hs-comment'>-- | Copy a vector. The two vectors must have the same length and may not</span>
<a name="line-668"></a><span class='hs-comment'>-- overlap. This is not checked.</span>
<a name="line-669"></a><span class='hs-definition'>unsafeCopy</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span>   <span class='hs-comment'>-- ^ target</span>
<a name="line-670"></a>                                         <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span>   <span class='hs-comment'>-- ^ source</span>
<a name="line-671"></a>                                         <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span>
<a name="line-672"></a><span class='hs-comment'>{-# INLINE unsafeCopy #-}</span>
<a name="line-673"></a><span class='hs-definition'>unsafeCopy</span> <span class='hs-varid'>dst</span> <span class='hs-varid'>src</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>UNSAFE_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>check</span><span class='hs-layout'>)</span> <span class='hs-str'>"unsafeCopy"</span> <span class='hs-str'>"length mismatch"</span>
<a name="line-674"></a>                                         <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>dst</span> <span class='hs-varop'>==</span> <span class='hs-varid'>length</span> <span class='hs-varid'>src</span><span class='hs-layout'>)</span>
<a name="line-675"></a>                   <span class='hs-varop'>$</span> <span class='hs-conid'>UNSAFE_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>check</span><span class='hs-layout'>)</span> <span class='hs-str'>"unsafeCopy"</span> <span class='hs-str'>"overlapping vectors"</span>
<a name="line-676"></a>                                         <span class='hs-layout'>(</span><span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>dst</span> <span class='hs-varop'>`overlaps`</span> <span class='hs-varid'>src</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-677"></a>                   <span class='hs-varop'>$</span> <span class='hs-layout'>(</span><span class='hs-varid'>dst</span> <span class='hs-varop'>`seq`</span> <span class='hs-varid'>src</span> <span class='hs-varop'>`seq`</span> <span class='hs-varid'>basicUnsafeCopy</span> <span class='hs-varid'>dst</span> <span class='hs-varid'>src</span><span class='hs-layout'>)</span>
<a name="line-678"></a>
<a name="line-679"></a><a name="unsafeMove"></a><span class='hs-comment'>-- | Move the contents of a vector. The two vectors must have the same</span>
<a name="line-680"></a><span class='hs-comment'>-- length, but this is not checked.</span>
<a name="line-681"></a><span class='hs-comment'>-- </span>
<a name="line-682"></a><span class='hs-comment'>-- If the vectors do not overlap, then this is equivalent to 'unsafeCopy'.</span>
<a name="line-683"></a><span class='hs-comment'>-- Otherwise, the copying is performed as if the source vector were</span>
<a name="line-684"></a><span class='hs-comment'>-- copied to a temporary vector and then the temporary vector was copied</span>
<a name="line-685"></a><span class='hs-comment'>-- to the target vector.</span>
<a name="line-686"></a><span class='hs-definition'>unsafeMove</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span>   <span class='hs-comment'>-- ^ target</span>
<a name="line-687"></a>                                         <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span>   <span class='hs-comment'>-- ^ source</span>
<a name="line-688"></a>                                         <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span>
<a name="line-689"></a><span class='hs-comment'>{-# INLINE unsafeMove #-}</span>
<a name="line-690"></a><span class='hs-definition'>unsafeMove</span> <span class='hs-varid'>dst</span> <span class='hs-varid'>src</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>UNSAFE_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>check</span><span class='hs-layout'>)</span> <span class='hs-str'>"unsafeMove"</span> <span class='hs-str'>"length mismatch"</span>
<a name="line-691"></a>                                         <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>dst</span> <span class='hs-varop'>==</span> <span class='hs-varid'>length</span> <span class='hs-varid'>src</span><span class='hs-layout'>)</span>
<a name="line-692"></a>                   <span class='hs-varop'>$</span> <span class='hs-layout'>(</span><span class='hs-varid'>dst</span> <span class='hs-varop'>`seq`</span> <span class='hs-varid'>src</span> <span class='hs-varop'>`seq`</span> <span class='hs-varid'>basicUnsafeMove</span> <span class='hs-varid'>dst</span> <span class='hs-varid'>src</span><span class='hs-layout'>)</span>
<a name="line-693"></a>
<a name="line-694"></a><span class='hs-comment'>-- Permutations</span>
<a name="line-695"></a><span class='hs-comment'>-- ------------</span>
<a name="line-696"></a>
<a name="line-697"></a><a name="accum"></a><span class='hs-definition'>accum</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-698"></a>        <span class='hs-keyglyph'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Stream</span> <span class='hs-layout'>(</span><span class='hs-conid'>Int</span><span class='hs-layout'>,</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span>
<a name="line-699"></a><span class='hs-comment'>{-# INLINE accum #-}</span>
<a name="line-700"></a><span class='hs-definition'>accum</span> <span class='hs-varid'>f</span> <span class='hs-varop'>!</span><span class='hs-varid'>v</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Stream</span><span class='hs-varop'>.</span><span class='hs-varid'>mapM_</span> <span class='hs-varid'>upd</span> <span class='hs-varid'>s</span>
<a name="line-701"></a>  <span class='hs-keyword'>where</span>
<a name="line-702"></a>    <span class='hs-comment'>{-# INLINE_INNER upd #-}</span>
<a name="line-703"></a>    <span class='hs-varid'>upd</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-704"></a>                  <span class='hs-varid'>a</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-conid'>BOUNDS_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>checkIndex</span><span class='hs-layout'>)</span> <span class='hs-str'>"accum"</span> <span class='hs-varid'>i</span> <span class='hs-varid'>n</span>
<a name="line-705"></a>                     <span class='hs-varop'>$</span> <span class='hs-varid'>unsafeRead</span> <span class='hs-varid'>v</span> <span class='hs-varid'>i</span>
<a name="line-706"></a>                  <span class='hs-varid'>unsafeWrite</span> <span class='hs-varid'>v</span> <span class='hs-varid'>i</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span>
<a name="line-707"></a>
<a name="line-708"></a>    <span class='hs-varop'>!</span><span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>length</span> <span class='hs-varid'>v</span>
<a name="line-709"></a>
<a name="line-710"></a><a name="update"></a><span class='hs-definition'>update</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-711"></a>                        <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Stream</span> <span class='hs-layout'>(</span><span class='hs-conid'>Int</span><span class='hs-layout'>,</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span>
<a name="line-712"></a><a name="!"></a><span class='hs-comment'>{-# INLINE update #-}</span>
<a name="line-713"></a><span class='hs-definition'>update</span> <span class='hs-varop'>!</span><span class='hs-varid'>v</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Stream</span><span class='hs-varop'>.</span><span class='hs-varid'>mapM_</span> <span class='hs-varid'>upd</span> <span class='hs-varid'>s</span>
<a name="line-714"></a>  <span class='hs-keyword'>where</span>
<a name="line-715"></a>    <span class='hs-comment'>{-# INLINE_INNER upd #-}</span>
<a name="line-716"></a>    <span class='hs-varid'>upd</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>BOUNDS_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>checkIndex</span><span class='hs-layout'>)</span> <span class='hs-str'>"update"</span> <span class='hs-varid'>i</span> <span class='hs-varid'>n</span>
<a name="line-717"></a>              <span class='hs-varop'>$</span> <span class='hs-varid'>unsafeWrite</span> <span class='hs-varid'>v</span> <span class='hs-varid'>i</span> <span class='hs-varid'>b</span>
<a name="line-718"></a>
<a name="line-719"></a>    <span class='hs-varop'>!</span><span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>length</span> <span class='hs-varid'>v</span>
<a name="line-720"></a>
<a name="line-721"></a><a name="unsafeAccum"></a><span class='hs-definition'>unsafeAccum</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-722"></a>            <span class='hs-keyglyph'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Stream</span> <span class='hs-layout'>(</span><span class='hs-conid'>Int</span><span class='hs-layout'>,</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span>
<a name="line-723"></a><span class='hs-comment'>{-# INLINE unsafeAccum #-}</span>
<a name="line-724"></a><span class='hs-definition'>unsafeAccum</span> <span class='hs-varid'>f</span> <span class='hs-varop'>!</span><span class='hs-varid'>v</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Stream</span><span class='hs-varop'>.</span><span class='hs-varid'>mapM_</span> <span class='hs-varid'>upd</span> <span class='hs-varid'>s</span>
<a name="line-725"></a>  <span class='hs-keyword'>where</span>
<a name="line-726"></a>    <span class='hs-comment'>{-# INLINE_INNER upd #-}</span>
<a name="line-727"></a>    <span class='hs-varid'>upd</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-728"></a>                  <span class='hs-varid'>a</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-conid'>UNSAFE_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>checkIndex</span><span class='hs-layout'>)</span> <span class='hs-str'>"accum"</span> <span class='hs-varid'>i</span> <span class='hs-varid'>n</span>
<a name="line-729"></a>                     <span class='hs-varop'>$</span> <span class='hs-varid'>unsafeRead</span> <span class='hs-varid'>v</span> <span class='hs-varid'>i</span>
<a name="line-730"></a>                  <span class='hs-varid'>unsafeWrite</span> <span class='hs-varid'>v</span> <span class='hs-varid'>i</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span>
<a name="line-731"></a>
<a name="line-732"></a>    <span class='hs-varop'>!</span><span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>length</span> <span class='hs-varid'>v</span>
<a name="line-733"></a>
<a name="line-734"></a><a name="unsafeUpdate"></a><span class='hs-definition'>unsafeUpdate</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-735"></a>                        <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Stream</span> <span class='hs-layout'>(</span><span class='hs-conid'>Int</span><span class='hs-layout'>,</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span>
<a name="line-736"></a><span class='hs-comment'>{-# INLINE unsafeUpdate #-}</span>
<a name="line-737"></a><span class='hs-definition'>unsafeUpdate</span> <span class='hs-varop'>!</span><span class='hs-varid'>v</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Stream</span><span class='hs-varop'>.</span><span class='hs-varid'>mapM_</span> <span class='hs-varid'>upd</span> <span class='hs-varid'>s</span>
<a name="line-738"></a>  <span class='hs-keyword'>where</span>
<a name="line-739"></a>    <span class='hs-comment'>{-# INLINE_INNER upd #-}</span>
<a name="line-740"></a>    <span class='hs-varid'>upd</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>UNSAFE_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>checkIndex</span><span class='hs-layout'>)</span> <span class='hs-str'>"accum"</span> <span class='hs-varid'>i</span> <span class='hs-varid'>n</span>
<a name="line-741"></a>                  <span class='hs-varop'>$</span> <span class='hs-varid'>unsafeWrite</span> <span class='hs-varid'>v</span> <span class='hs-varid'>i</span> <span class='hs-varid'>b</span>
<a name="line-742"></a>
<a name="line-743"></a>    <span class='hs-varop'>!</span><span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>length</span> <span class='hs-varid'>v</span>
<a name="line-744"></a>
<a name="line-745"></a><a name="reverse"></a><span class='hs-definition'>reverse</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span>
<a name="line-746"></a><span class='hs-comment'>{-# INLINE reverse #-}</span>
<a name="line-747"></a><span class='hs-definition'>reverse</span> <span class='hs-varop'>!</span><span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>reverse_loop</span> <span class='hs-num'>0</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>v</span> <span class='hs-comment'>-</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span>
<a name="line-748"></a>  <span class='hs-keyword'>where</span>
<a name="line-749"></a>    <span class='hs-varid'>reverse_loop</span> <span class='hs-varid'>i</span> <span class='hs-varid'>j</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>i</span> <span class='hs-varop'>&lt;</span> <span class='hs-varid'>j</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-750"></a>                                 <span class='hs-varid'>unsafeSwap</span> <span class='hs-varid'>v</span> <span class='hs-varid'>i</span> <span class='hs-varid'>j</span>
<a name="line-751"></a>                                 <span class='hs-varid'>reverse_loop</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span> <span class='hs-varop'>+</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>j</span> <span class='hs-comment'>-</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span>
<a name="line-752"></a>    <span class='hs-varid'>reverse_loop</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-753"></a>
<a name="line-754"></a><a name="unstablePartition"></a><span class='hs-definition'>unstablePartition</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyword'>forall</span> <span class='hs-varid'>m</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-varop'>.</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-755"></a>                  <span class='hs-keyglyph'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>Int</span>
<a name="line-756"></a><span class='hs-comment'>{-# INLINE unstablePartition #-}</span>
<a name="line-757"></a><span class='hs-definition'>unstablePartition</span> <span class='hs-varid'>f</span> <span class='hs-varop'>!</span><span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>from_left</span> <span class='hs-num'>0</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span>
<a name="line-758"></a>  <span class='hs-keyword'>where</span>
<a name="line-759"></a>    <span class='hs-comment'>-- NOTE: GHC 6.10.4 panics without the signatures on from_left and</span>
<a name="line-760"></a>    <span class='hs-comment'>-- from_right</span>
<a name="line-761"></a>    <span class='hs-varid'>from_left</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>Int</span>
<a name="line-762"></a>    <span class='hs-varid'>from_left</span> <span class='hs-varid'>i</span> <span class='hs-varid'>j</span>
<a name="line-763"></a>      <span class='hs-keyglyph'>|</span> <span class='hs-varid'>i</span> <span class='hs-varop'>==</span> <span class='hs-varid'>j</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-varid'>i</span>
<a name="line-764"></a>      <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-765"></a>                      <span class='hs-varid'>x</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>unsafeRead</span> <span class='hs-varid'>v</span> <span class='hs-varid'>i</span>
<a name="line-766"></a>                      <span class='hs-keyword'>if</span> <span class='hs-varid'>f</span> <span class='hs-varid'>x</span>
<a name="line-767"></a>                        <span class='hs-keyword'>then</span> <span class='hs-varid'>from_left</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varid'>j</span>
<a name="line-768"></a>                        <span class='hs-keyword'>else</span> <span class='hs-varid'>from_right</span> <span class='hs-varid'>i</span> <span class='hs-layout'>(</span><span class='hs-varid'>j</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>)</span>
<a name="line-769"></a>
<a name="line-770"></a>    <span class='hs-varid'>from_right</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>Int</span>
<a name="line-771"></a>    <span class='hs-varid'>from_right</span> <span class='hs-varid'>i</span> <span class='hs-varid'>j</span>
<a name="line-772"></a>      <span class='hs-keyglyph'>|</span> <span class='hs-varid'>i</span> <span class='hs-varop'>==</span> <span class='hs-varid'>j</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-varid'>i</span>
<a name="line-773"></a>      <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-774"></a>                      <span class='hs-varid'>x</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>unsafeRead</span> <span class='hs-varid'>v</span> <span class='hs-varid'>j</span>
<a name="line-775"></a>                      <span class='hs-keyword'>if</span> <span class='hs-varid'>f</span> <span class='hs-varid'>x</span>
<a name="line-776"></a>                        <span class='hs-keyword'>then</span> <span class='hs-keyword'>do</span>
<a name="line-777"></a>                               <span class='hs-varid'>y</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>unsafeRead</span> <span class='hs-varid'>v</span> <span class='hs-varid'>i</span>
<a name="line-778"></a>                               <span class='hs-varid'>unsafeWrite</span> <span class='hs-varid'>v</span> <span class='hs-varid'>i</span> <span class='hs-varid'>x</span>
<a name="line-779"></a>                               <span class='hs-varid'>unsafeWrite</span> <span class='hs-varid'>v</span> <span class='hs-varid'>j</span> <span class='hs-varid'>y</span>
<a name="line-780"></a>                               <span class='hs-varid'>from_left</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varid'>j</span>
<a name="line-781"></a>                        <span class='hs-keyword'>else</span> <span class='hs-varid'>from_right</span> <span class='hs-varid'>i</span> <span class='hs-layout'>(</span><span class='hs-varid'>j</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>)</span>
<a name="line-782"></a>
<a name="line-783"></a><a name="unstablePartitionStream"></a><span class='hs-definition'>unstablePartitionStream</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-784"></a>        <span class='hs-keyglyph'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Stream</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-785"></a><span class='hs-comment'>{-# INLINE unstablePartitionStream #-}</span>
<a name="line-786"></a><span class='hs-definition'>unstablePartitionStream</span> <span class='hs-varid'>f</span> <span class='hs-varid'>s</span>
<a name="line-787"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>upperBound</span> <span class='hs-layout'>(</span><span class='hs-conid'>Stream</span><span class='hs-varop'>.</span><span class='hs-varid'>size</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyword'>of</span>
<a name="line-788"></a>      <span class='hs-conid'>Just</span> <span class='hs-varid'>n</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>unstablePartitionMax</span> <span class='hs-varid'>f</span> <span class='hs-varid'>s</span> <span class='hs-varid'>n</span>
<a name="line-789"></a>      <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>partitionUnknown</span> <span class='hs-varid'>f</span> <span class='hs-varid'>s</span>
<a name="line-790"></a>
<a name="line-791"></a><a name="unstablePartitionMax"></a><span class='hs-definition'>unstablePartitionMax</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-792"></a>        <span class='hs-keyglyph'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Stream</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span>
<a name="line-793"></a>        <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-794"></a><span class='hs-comment'>{-# INLINE unstablePartitionMax #-}</span>
<a name="line-795"></a><span class='hs-definition'>unstablePartitionMax</span> <span class='hs-varid'>f</span> <span class='hs-varid'>s</span> <span class='hs-varid'>n</span>
<a name="line-796"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-797"></a>      <span class='hs-varid'>v</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-conid'>INTERNAL_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>checkLength</span><span class='hs-layout'>)</span> <span class='hs-str'>"unstablePartitionMax"</span> <span class='hs-varid'>n</span>
<a name="line-798"></a>           <span class='hs-varop'>$</span> <span class='hs-varid'>unsafeNew</span> <span class='hs-varid'>n</span>
<a name="line-799"></a>      <span class='hs-keyword'>let</span> <span class='hs-comment'>{-# INLINE_INNER put #-}</span>
<a name="line-800"></a>          <span class='hs-varid'>put</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-layout'>,</span> <span class='hs-varid'>j</span><span class='hs-layout'>)</span> <span class='hs-varid'>x</span>
<a name="line-801"></a>            <span class='hs-keyglyph'>|</span> <span class='hs-varid'>f</span> <span class='hs-varid'>x</span>       <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-802"></a>                            <span class='hs-varid'>unsafeWrite</span> <span class='hs-varid'>v</span> <span class='hs-varid'>i</span> <span class='hs-varid'>x</span>
<a name="line-803"></a>                            <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>,</span> <span class='hs-varid'>j</span><span class='hs-layout'>)</span>
<a name="line-804"></a>            <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-805"></a>                            <span class='hs-varid'>unsafeWrite</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-varid'>j</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varid'>x</span>
<a name="line-806"></a>                            <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-layout'>,</span> <span class='hs-varid'>j</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>)</span>
<a name="line-807"></a>                                
<a name="line-808"></a>      <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-layout'>,</span><span class='hs-varid'>j</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-conid'>Stream</span><span class='hs-varop'>.</span><span class='hs-varid'>foldM'</span> <span class='hs-varid'>put</span> <span class='hs-layout'>(</span><span class='hs-num'>0</span><span class='hs-layout'>,</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span> <span class='hs-varid'>s</span>
<a name="line-809"></a>      <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>unsafeSlice</span> <span class='hs-num'>0</span> <span class='hs-varid'>i</span> <span class='hs-varid'>v</span><span class='hs-layout'>,</span> <span class='hs-varid'>unsafeSlice</span> <span class='hs-varid'>j</span> <span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-comment'>-</span><span class='hs-varid'>j</span><span class='hs-layout'>)</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span>
<a name="line-810"></a>
<a name="line-811"></a><a name="partitionStream"></a><span class='hs-definition'>partitionStream</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-812"></a>        <span class='hs-keyglyph'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Stream</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-813"></a><span class='hs-comment'>{-# INLINE partitionStream #-}</span>
<a name="line-814"></a><span class='hs-definition'>partitionStream</span> <span class='hs-varid'>f</span> <span class='hs-varid'>s</span>
<a name="line-815"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>upperBound</span> <span class='hs-layout'>(</span><span class='hs-conid'>Stream</span><span class='hs-varop'>.</span><span class='hs-varid'>size</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyword'>of</span>
<a name="line-816"></a>      <span class='hs-conid'>Just</span> <span class='hs-varid'>n</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>partitionMax</span> <span class='hs-varid'>f</span> <span class='hs-varid'>s</span> <span class='hs-varid'>n</span>
<a name="line-817"></a>      <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>partitionUnknown</span> <span class='hs-varid'>f</span> <span class='hs-varid'>s</span>
<a name="line-818"></a>
<a name="line-819"></a><a name="partitionMax"></a><span class='hs-definition'>partitionMax</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-820"></a>  <span class='hs-keyglyph'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Stream</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-821"></a><span class='hs-comment'>{-# INLINE partitionMax #-}</span>
<a name="line-822"></a><span class='hs-definition'>partitionMax</span> <span class='hs-varid'>f</span> <span class='hs-varid'>s</span> <span class='hs-varid'>n</span>
<a name="line-823"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-824"></a>      <span class='hs-varid'>v</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-conid'>INTERNAL_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>checkLength</span><span class='hs-layout'>)</span> <span class='hs-str'>"unstablePartitionMax"</span> <span class='hs-varid'>n</span>
<a name="line-825"></a>         <span class='hs-varop'>$</span> <span class='hs-varid'>unsafeNew</span> <span class='hs-varid'>n</span>
<a name="line-826"></a>
<a name="line-827"></a>      <span class='hs-keyword'>let</span> <span class='hs-comment'>{-# INLINE_INNER put #-}</span>
<a name="line-828"></a>          <span class='hs-varid'>put</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-layout'>,</span><span class='hs-varid'>j</span><span class='hs-layout'>)</span> <span class='hs-varid'>x</span>
<a name="line-829"></a>            <span class='hs-keyglyph'>|</span> <span class='hs-varid'>f</span> <span class='hs-varid'>x</span>       <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-830"></a>                            <span class='hs-varid'>unsafeWrite</span> <span class='hs-varid'>v</span> <span class='hs-varid'>i</span> <span class='hs-varid'>x</span>
<a name="line-831"></a>                            <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>,</span><span class='hs-varid'>j</span><span class='hs-layout'>)</span>
<a name="line-832"></a>
<a name="line-833"></a>            <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>j'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>j</span><span class='hs-comment'>-</span><span class='hs-num'>1</span> <span class='hs-keyword'>in</span>
<a name="line-834"></a>                          <span class='hs-keyword'>do</span>
<a name="line-835"></a>                            <span class='hs-varid'>unsafeWrite</span> <span class='hs-varid'>v</span> <span class='hs-varid'>j'</span> <span class='hs-varid'>x</span>
<a name="line-836"></a>                            <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-layout'>,</span><span class='hs-varid'>j'</span><span class='hs-layout'>)</span> 
<a name="line-837"></a>                            
<a name="line-838"></a>      <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-layout'>,</span><span class='hs-varid'>j</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-conid'>Stream</span><span class='hs-varop'>.</span><span class='hs-varid'>foldM'</span> <span class='hs-varid'>put</span> <span class='hs-layout'>(</span><span class='hs-num'>0</span><span class='hs-layout'>,</span><span class='hs-varid'>n</span><span class='hs-layout'>)</span> <span class='hs-varid'>s</span>
<a name="line-839"></a>      <span class='hs-conid'>INTERNAL_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>check</span><span class='hs-layout'>)</span> <span class='hs-str'>"partitionMax"</span> <span class='hs-str'>"invalid indices"</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span> <span class='hs-varop'>&lt;=</span> <span class='hs-varid'>j</span><span class='hs-layout'>)</span>
<a name="line-840"></a>        <span class='hs-varop'>$</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-841"></a>      <span class='hs-keyword'>let</span> <span class='hs-varid'>l</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unsafeSlice</span> <span class='hs-num'>0</span> <span class='hs-varid'>i</span> <span class='hs-varid'>v</span>
<a name="line-842"></a>          <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unsafeSlice</span> <span class='hs-varid'>j</span> <span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-comment'>-</span><span class='hs-varid'>j</span><span class='hs-layout'>)</span> <span class='hs-varid'>v</span>
<a name="line-843"></a>      <span class='hs-varid'>reverse</span> <span class='hs-varid'>r</span>
<a name="line-844"></a>      <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>l</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-845"></a>
<a name="line-846"></a><a name="partitionUnknown"></a><span class='hs-definition'>partitionUnknown</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MVector</span> <span class='hs-varid'>v</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-847"></a>        <span class='hs-keyglyph'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Stream</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-varid'>v</span> <span class='hs-layout'>(</span><span class='hs-conid'>PrimState</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-848"></a><span class='hs-comment'>{-# INLINE partitionUnknown #-}</span>
<a name="line-849"></a><span class='hs-definition'>partitionUnknown</span> <span class='hs-varid'>f</span> <span class='hs-varid'>s</span>
<a name="line-850"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-851"></a>      <span class='hs-varid'>v1</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>unsafeNew</span> <span class='hs-num'>0</span>
<a name="line-852"></a>      <span class='hs-varid'>v2</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>unsafeNew</span> <span class='hs-num'>0</span>
<a name="line-853"></a>      <span class='hs-layout'>(</span><span class='hs-varid'>v1'</span><span class='hs-layout'>,</span> <span class='hs-varid'>n1</span><span class='hs-layout'>,</span> <span class='hs-varid'>v2'</span><span class='hs-layout'>,</span> <span class='hs-varid'>n2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-conid'>Stream</span><span class='hs-varop'>.</span><span class='hs-varid'>foldM'</span> <span class='hs-varid'>put</span> <span class='hs-layout'>(</span><span class='hs-varid'>v1</span><span class='hs-layout'>,</span> <span class='hs-num'>0</span><span class='hs-layout'>,</span> <span class='hs-varid'>v2</span><span class='hs-layout'>,</span> <span class='hs-num'>0</span><span class='hs-layout'>)</span> <span class='hs-varid'>s</span>
<a name="line-854"></a>      <span class='hs-conid'>INTERNAL_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>checkSlice</span><span class='hs-layout'>)</span> <span class='hs-str'>"partitionUnknown"</span> <span class='hs-num'>0</span> <span class='hs-varid'>n1</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>v1'</span><span class='hs-layout'>)</span>
<a name="line-855"></a>        <span class='hs-varop'>$</span> <span class='hs-conid'>INTERNAL_CHECK</span><span class='hs-layout'>(</span><span class='hs-varid'>checkSlice</span><span class='hs-layout'>)</span> <span class='hs-str'>"partitionUnknown"</span> <span class='hs-num'>0</span> <span class='hs-varid'>n2</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>v2'</span><span class='hs-layout'>)</span>
<a name="line-856"></a>        <span class='hs-varop'>$</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>unsafeSlice</span> <span class='hs-num'>0</span> <span class='hs-varid'>n1</span> <span class='hs-varid'>v1'</span><span class='hs-layout'>,</span> <span class='hs-varid'>unsafeSlice</span> <span class='hs-num'>0</span> <span class='hs-varid'>n2</span> <span class='hs-varid'>v2'</span><span class='hs-layout'>)</span>
<a name="line-857"></a>  <span class='hs-keyword'>where</span>
<a name="line-858"></a>    <span class='hs-comment'>-- NOTE: The case distinction has to be on the outside because</span>
<a name="line-859"></a>    <span class='hs-comment'>-- GHC creates a join point for the unsafeWrite even when everything</span>
<a name="line-860"></a>    <span class='hs-comment'>-- is inlined. This is bad because with the join point, v isn't getting</span>
<a name="line-861"></a>    <span class='hs-comment'>-- unboxed.</span>
<a name="line-862"></a>    <span class='hs-comment'>{-# INLINE_INNER put #-}</span>
<a name="line-863"></a>    <span class='hs-varid'>put</span> <span class='hs-layout'>(</span><span class='hs-varid'>v1</span><span class='hs-layout'>,</span> <span class='hs-varid'>i1</span><span class='hs-layout'>,</span> <span class='hs-varid'>v2</span><span class='hs-layout'>,</span> <span class='hs-varid'>i2</span><span class='hs-layout'>)</span> <span class='hs-varid'>x</span>
<a name="line-864"></a>      <span class='hs-keyglyph'>|</span> <span class='hs-varid'>f</span> <span class='hs-varid'>x</span>       <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-865"></a>                      <span class='hs-varid'>v1'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>unsafeAppend1</span> <span class='hs-varid'>v1</span> <span class='hs-varid'>i1</span> <span class='hs-varid'>x</span>
<a name="line-866"></a>                      <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>v1'</span><span class='hs-layout'>,</span> <span class='hs-varid'>i1</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>,</span> <span class='hs-varid'>v2</span><span class='hs-layout'>,</span> <span class='hs-varid'>i2</span><span class='hs-layout'>)</span>
<a name="line-867"></a>      <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-868"></a>                      <span class='hs-varid'>v2'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>unsafeAppend1</span> <span class='hs-varid'>v2</span> <span class='hs-varid'>i2</span> <span class='hs-varid'>x</span>
<a name="line-869"></a>                      <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>v1</span><span class='hs-layout'>,</span> <span class='hs-varid'>i1</span><span class='hs-layout'>,</span> <span class='hs-varid'>v2'</span><span class='hs-layout'>,</span> <span class='hs-varid'>i2</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>)</span>
<a name="line-870"></a>
</pre></body>
</html>