module Util.Vector.Mutable where

import Control.Monad (guard)
import Control.Monad.Primitive
import Data.Vector.Generic.Mutable as MV

readMaybe :: (PrimMonad m, MVector v a) => v (PrimState m) a -> Int -> m (Maybe a)
readMaybe :: v (PrimState m) a -> Int -> m (Maybe a)
readMaybe xs :: v (PrimState m) a
xs k :: Int
k = (a -> Maybe () -> Maybe a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Bool -> Maybe ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Int
k Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< v (PrimState m) a -> Int
forall (v :: * -> * -> *) a s. MVector v a => v s a -> Int
MV.length v (PrimState m) a
xs)) (a -> Maybe a) -> m a -> m (Maybe a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> v (PrimState m) a -> Int -> m a
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Int -> m a
unsafeRead v (PrimState m) a
xs Int
k