{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE MonoLocalBinds #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
module Test.Massiv.Core.Mutable
  ( -- * Spec for Mutable instance
    unsafeMutableSpec
  , prop_UnsafeNewMsize
  , prop_UnsafeThawFreeze
  , prop_UnsafeInitializeNew
  , prop_UnsafeArrayLinearCopy
  -- ** Properties that aren't valid for boxed
  , unsafeMutableUnboxedSpec
  , prop_UnsafeInitialize
  ) where

import Data.Massiv.Array as A
import Data.Massiv.Array.Unsafe
import Test.Massiv.Core.Common
import Test.Massiv.Utils



prop_UnsafeNewMsize ::
     forall r ix e.
     (Arbitrary ix, Mutable r ix e)
  => Property
prop_UnsafeNewMsize :: Property
prop_UnsafeNewMsize = (Sz ix -> IO ()) -> Property
forall prop. Testable prop => prop -> Property
property ((Sz ix -> IO ()) -> Property) -> (Sz ix -> IO ()) -> Property
forall a b. (a -> b) -> a -> b
$ \ Sz ix
sz -> do
  MArray RealWorld r ix e
marr :: MArray RealWorld r ix e <- Sz ix -> IO (MArray (PrimState IO) r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Sz ix -> m (MArray (PrimState m) r ix e)
unsafeNew Sz ix
sz
  Sz ix
sz Sz ix -> Sz ix -> IO ()
forall a. (HasCallStack, Show a, Eq a) => a -> a -> IO ()
`shouldBe` MArray RealWorld r ix e -> Sz ix
forall r ix e s. Mutable r ix e => MArray s r ix e -> Sz ix
msize MArray RealWorld r ix e
marr

prop_UnsafeNewLinearWriteRead ::
     forall r ix e.
     (Eq e, Show e, Mutable r ix e, Arbitrary ix, Arbitrary e)
  => Property
prop_UnsafeNewLinearWriteRead :: Property
prop_UnsafeNewLinearWriteRead = (SzIx ix -> e -> e -> IO ()) -> Property
forall prop. Testable prop => prop -> Property
property ((SzIx ix -> e -> e -> IO ()) -> Property)
-> (SzIx ix -> e -> e -> IO ()) -> Property
forall a b. (a -> b) -> a -> b
$ \ (SzIx Sz ix
sz ix
ix) e
e1 e
e2 -> do
  MArray RealWorld r ix e
marr :: MArray RealWorld r ix e <- Sz ix -> IO (MArray (PrimState IO) r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Sz ix -> m (MArray (PrimState m) r ix e)
unsafeNew Sz ix
sz
  let i :: Int
i = Sz ix -> ix -> Int
forall ix. Index ix => Sz ix -> ix -> Int
toLinearIndex Sz ix
sz ix
ix
  MArray (PrimState IO) r ix e -> Int -> e -> IO ()
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> Int -> e -> m ()
unsafeLinearWrite MArray RealWorld r ix e
MArray (PrimState IO) r ix e
marr Int
i e
e1
  MArray (PrimState IO) r ix e -> Int -> IO e
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> Int -> m e
unsafeLinearRead MArray RealWorld r ix e
MArray (PrimState IO) r ix e
marr Int
i IO e -> e -> IO ()
forall a. (HasCallStack, Show a, Eq a) => IO a -> a -> IO ()
`shouldReturn` e
e1
  MArray (PrimState IO) r ix e -> (e -> IO e) -> Int -> IO e
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> (e -> m e) -> Int -> m e
unsafeLinearModify MArray RealWorld r ix e
MArray (PrimState IO) r ix e
marr (\ !e
_ -> e -> IO e
forall (f :: * -> *) a. Applicative f => a -> f a
pure e
e2) Int
i IO e -> e -> IO ()
forall a. (HasCallStack, Show a, Eq a) => IO a -> a -> IO ()
`shouldReturn` e
e1
  MArray (PrimState IO) r ix e -> Int -> IO e
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> Int -> m e
unsafeLinearRead MArray RealWorld r ix e
MArray (PrimState IO) r ix e
marr Int
i IO e -> e -> IO ()
forall a. (HasCallStack, Show a, Eq a) => IO a -> a -> IO ()
`shouldReturn` e
e2


prop_UnsafeThawFreeze ::
     forall r ix e.
     (Eq (Array r ix e), Show (Array r ix e), Mutable r ix e)
  => Array r ix e -> Property
prop_UnsafeThawFreeze :: Array r ix e -> Property
prop_UnsafeThawFreeze Array r ix e
arr = Array r ix e
arr Array r ix e -> Array r ix e -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== (forall s. ST s (Array r ix e)) -> Array r ix e
forall a. (forall s. ST s a) -> a
runST (Comp -> MArray (PrimState (ST s)) r ix e -> ST s (Array r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
unsafeFreeze (Array r ix e -> Comp
forall r ix e. Load r ix e => Array r ix e -> Comp
getComp Array r ix e
arr) (MArray s r ix e -> ST s (Array r ix e))
-> ST s (MArray s r ix e) -> ST s (Array r ix e)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Array r ix e -> ST s (MArray (PrimState (ST s)) r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Array r ix e -> m (MArray (PrimState m) r ix e)
unsafeThaw Array r ix e
arr)


prop_UnsafeInitializeNew ::
     forall r ix e.
     ( Eq (Array r ix e)
     , Show (Array r ix e)
     , Show e
     , Arbitrary e
     , Arbitrary ix
     , Mutable r ix e
     )
  => Property
prop_UnsafeInitializeNew :: Property
prop_UnsafeInitializeNew =
  (Comp -> Sz ix -> e -> Property) -> Property
forall prop. Testable prop => prop -> Property
property ((Comp -> Sz ix -> e -> Property) -> Property)
-> (Comp -> Sz ix -> e -> Property) -> Property
forall a b. (a -> b) -> a -> b
$ \Comp
comp Sz ix
sz e
e ->
    (Array DL ix e -> Array r ix e
forall r ix e r'.
(Mutable r ix e, Load r' ix e) =>
Array r' ix e -> Array r ix e
compute (Comp -> Sz ix -> e -> Array DL ix e
forall ix e. Index ix => Comp -> Sz ix -> e -> Array DL ix e
A.replicate Comp
comp Sz ix
sz e
e) :: Array r ix e) Array r ix e -> Array r ix e -> Property
forall a. (Eq a, Show a) => a -> a -> Property
===
    (forall s. ST s (Array r ix e)) -> Array r ix e
forall a. (forall s. ST s a) -> a
runST (Comp -> MArray (PrimState (ST s)) r ix e -> ST s (Array r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
unsafeFreeze Comp
comp (MArray s r ix e -> ST s (Array r ix e))
-> ST s (MArray s r ix e) -> ST s (Array r ix e)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Maybe e -> Sz ix -> ST s (MArray (PrimState (ST s)) r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Maybe e -> Sz ix -> m (MArray (PrimState m) r ix e)
initializeNew (e -> Maybe e
forall a. a -> Maybe a
Just e
e) Sz ix
sz)

prop_UnsafeInitialize ::
     forall r ix e.
     ( Eq (Array r ix e)
     , Show (Array r ix e)
     , Arbitrary ix
     , Mutable r ix e
     )
  => Property
prop_UnsafeInitialize :: Property
prop_UnsafeInitialize =
  (Comp -> Sz ix -> Property) -> Property
forall prop. Testable prop => prop -> Property
property ((Comp -> Sz ix -> Property) -> Property)
-> (Comp -> Sz ix -> Property) -> Property
forall a b. (a -> b) -> a -> b
$ \Comp
comp Sz ix
sz ->
    (forall s. ST s Property) -> Property
forall a. (forall s. ST s a) -> a
runST ((forall s. ST s Property) -> Property)
-> (forall s. ST s Property) -> Property
forall a b. (a -> b) -> a -> b
$ do
      MArray s r ix e
marr1 :: MArray s r ix e <- Sz ix -> ST s (MArray (PrimState (ST s)) r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Sz ix -> m (MArray (PrimState m) r ix e)
unsafeNew Sz ix
sz
      MArray (PrimState (ST s)) r ix e -> ST s ()
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> m ()
initialize MArray s r ix e
MArray (PrimState (ST s)) r ix e
marr1
      MArray s r ix e
marr2 :: MArray s r ix e <- Maybe e -> Sz ix -> ST s (MArray (PrimState (ST s)) r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Maybe e -> Sz ix -> m (MArray (PrimState m) r ix e)
initializeNew Maybe e
forall a. Maybe a
Nothing Sz ix
sz
      Array r ix e -> Array r ix e -> Property
forall a. (Eq a, Show a) => a -> a -> Property
(===) (Array r ix e -> Array r ix e -> Property)
-> ST s (Array r ix e) -> ST s (Array r ix e -> Property)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Comp -> MArray (PrimState (ST s)) r ix e -> ST s (Array r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
unsafeFreeze Comp
comp MArray s r ix e
MArray (PrimState (ST s)) r ix e
marr1 ST s (Array r ix e -> Property)
-> ST s (Array r ix e) -> ST s Property
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Comp -> MArray (PrimState (ST s)) r ix e -> ST s (Array r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
unsafeFreeze Comp
comp MArray s r ix e
MArray (PrimState (ST s)) r ix e
marr2


prop_UnsafeLinearCopy ::
     forall r ix e. (Eq (Array r ix e), Show (Array r ix e), Mutable r ix e)
  => Array r ix e
  -> Property
prop_UnsafeLinearCopy :: Array r ix e -> Property
prop_UnsafeLinearCopy Array r ix e
arr =
  (Array r ix e
arr, Array r ix e
arr) (Array r ix e, Array r ix e)
-> (Array r ix e, Array r ix e) -> Property
forall a. (Eq a, Show a) => a -> a -> Property
===
  (forall s. ST s (Array r ix e, Array r ix e))
-> (Array r ix e, Array r ix e)
forall a. (forall s. ST s a) -> a
runST
    (do let sz :: Sz ix
sz = Array r ix e -> Sz ix
forall r ix e. Load r ix e => Array r ix e -> Sz ix
size Array r ix e
arr
        MArray s r ix e
marrs <- Array r ix e -> ST s (MArray (PrimState (ST s)) r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Array r ix e -> m (MArray (PrimState m) r ix e)
thawS Array r ix e
arr
        MArray s r ix e
marrd <- Sz ix -> ST s (MArray (PrimState (ST s)) r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Sz ix -> m (MArray (PrimState m) r ix e)
unsafeNew Sz ix
sz
        MArray (PrimState (ST s)) r ix e
-> Int -> MArray (PrimState (ST s)) r ix e -> Int -> Sz1 -> ST s ()
forall r ix e ix' (m :: * -> *).
(Mutable r ix e, Mutable r ix' e, PrimMonad m) =>
MArray (PrimState m) r ix' e
-> Int -> MArray (PrimState m) r ix e -> Int -> Sz1 -> m ()
unsafeLinearCopy MArray s r ix e
MArray (PrimState (ST s)) r ix e
marrs Int
0 MArray s r ix e
MArray (PrimState (ST s)) r ix e
marrd Int
0 (Int -> Sz1
forall ix. Index ix => ix -> Sz ix
Sz (Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem Sz ix
sz))
        Array r ix e
arrd <- Comp -> MArray (PrimState (ST s)) r ix e -> ST s (Array r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
unsafeFreeze (Array r ix e -> Comp
forall r ix e. Load r ix e => Array r ix e -> Comp
getComp Array r ix e
arr) MArray s r ix e
MArray (PrimState (ST s)) r ix e
marrd
        Array r ix e
arrs <- Comp -> MArray (PrimState (ST s)) r ix e -> ST s (Array r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
unsafeFreeze (Array r ix e -> Comp
forall r ix e. Load r ix e => Array r ix e -> Comp
getComp Array r ix e
arr) MArray s r ix e
MArray (PrimState (ST s)) r ix e
marrs
        (Array r ix e, Array r ix e) -> ST s (Array r ix e, Array r ix e)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Array r ix e
arrs, Array r ix e
arrd))

prop_UnsafeLinearCopyPart ::
     forall r ix e.
     ( Eq (Vector r e)
     , Show (Vector r e)
     , Eq (Array r ix e)
     , Show (Array r ix e)
     , Mutable r ix e
     , Mutable r Ix1 e
     )
  => ArrIx r ix e
  -> NonNegative Ix1
  -> Ix1
  -> Property
prop_UnsafeLinearCopyPart :: ArrIx r ix e -> NonNegative Int -> Int -> Property
prop_UnsafeLinearCopyPart (ArrIx Array r ix e
arr ix
ix) (NonNegative Int
delta) Int
toOffset =
  Array r ix e
arr Array r ix e -> Array r ix e -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== Array r ix e
arrs Property -> Property -> Property
forall prop1 prop2.
(Testable prop1, Testable prop2) =>
prop1 -> prop2 -> Property
.&&. Int -> Sz1 -> Vector r e -> Vector r e
forall r e.
Source r Int e =>
Int -> Sz1 -> Vector r e -> Vector r e
slice' Int
i Sz1
k (Array r ix e -> Vector r e
forall r ix e.
(Load r ix e, Resize r ix) =>
Array r ix e -> Array r Int e
flatten Array r ix e
arr) Vector r e -> Vector r e -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== Int -> Sz1 -> Vector r e -> Vector r e
forall r e.
Source r Int e =>
Int -> Sz1 -> Vector r e -> Vector r e
slice' Int
j Sz1
k Vector r e
arrd
  where
    sz :: Sz ix
sz = Array r ix e -> Sz ix
forall r ix e. Load r ix e => Array r ix e -> Sz ix
size Array r ix e
arr
    i :: Int
i = Sz ix -> ix -> Int
forall ix. Index ix => Sz ix -> ix -> Int
toLinearIndex Sz ix
sz ix
ix
    j :: Int
j = Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
0 (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
toOffset)
    k :: Sz1
k = Int -> Sz1
forall ix. Index ix => ix -> Sz ix
Sz (Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem Sz ix
sz Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
delta)
    sz' :: Sz1
sz' = Int -> Sz1
forall ix. Index ix => ix -> Sz ix
Sz (Int
j Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Sz1 -> Int
forall ix. Sz ix -> ix
unSz Sz1
k)
    (Array r ix e
arrs, Vector r e
arrd) =
      (forall s. ST s (Array r ix e, Vector r e))
-> (Array r ix e, Vector r e)
forall a. (forall s. ST s a) -> a
runST ((forall s. ST s (Array r ix e, Vector r e))
 -> (Array r ix e, Vector r e))
-> (forall s. ST s (Array r ix e, Vector r e))
-> (Array r ix e, Vector r e)
forall a b. (a -> b) -> a -> b
$ do
        MArray s r ix e
marrs <- Array r ix e -> ST s (MArray (PrimState (ST s)) r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Array r ix e -> m (MArray (PrimState m) r ix e)
thawS Array r ix e
arr -- make sure that the source does not get modified
        MArray s r Int e
marrd <- Sz1 -> ST s (MArray (PrimState (ST s)) r Int e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Sz ix -> m (MArray (PrimState m) r ix e)
unsafeNew Sz1
sz'
        MArray (PrimState (ST s)) r ix e
-> Int
-> MArray (PrimState (ST s)) r Int e
-> Int
-> Sz1
-> ST s ()
forall r ix e ix' (m :: * -> *).
(Mutable r ix e, Mutable r ix' e, PrimMonad m) =>
MArray (PrimState m) r ix' e
-> Int -> MArray (PrimState m) r ix e -> Int -> Sz1 -> m ()
unsafeLinearCopy MArray s r ix e
MArray (PrimState (ST s)) r ix e
marrs Int
i MArray s r Int e
MArray (PrimState (ST s)) r Int e
marrd Int
j Sz1
k
        (,) (Array r ix e -> Vector r e -> (Array r ix e, Vector r e))
-> ST s (Array r ix e)
-> ST s (Vector r e -> (Array r ix e, Vector r e))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Comp -> MArray (PrimState (ST s)) r ix e -> ST s (Array r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
unsafeFreeze (Array r ix e -> Comp
forall r ix e. Load r ix e => Array r ix e -> Comp
getComp Array r ix e
arr) MArray s r ix e
MArray (PrimState (ST s)) r ix e
marrs ST s (Vector r e -> (Array r ix e, Vector r e))
-> ST s (Vector r e) -> ST s (Array r ix e, Vector r e)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Comp -> MArray (PrimState (ST s)) r Int e -> ST s (Vector r e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
unsafeFreeze (Array r ix e -> Comp
forall r ix e. Load r ix e => Array r ix e -> Comp
getComp Array r ix e
arr) MArray s r Int e
MArray (PrimState (ST s)) r Int e
marrd


prop_UnsafeArrayLinearCopy ::
     forall r ix e. (Eq (Array r ix e), Show (Array r ix e), Mutable r ix e)
  => Array r ix e
  -> Property
prop_UnsafeArrayLinearCopy :: Array r ix e -> Property
prop_UnsafeArrayLinearCopy Array r ix e
arr =
  Array r ix e
arr Array r ix e -> Array r ix e -> Property
forall a. (Eq a, Show a) => a -> a -> Property
===
  (forall s. ST s (Array r ix e)) -> Array r ix e
forall a. (forall s. ST s a) -> a
runST
    (do let sz :: Sz ix
sz = Array r ix e -> Sz ix
forall r ix e. Load r ix e => Array r ix e -> Sz ix
size Array r ix e
arr
        MArray s r ix e
marr <- Sz ix -> ST s (MArray (PrimState (ST s)) r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Sz ix -> m (MArray (PrimState m) r ix e)
unsafeNew Sz ix
sz
        Array r ix e
-> Int -> MArray (PrimState (ST s)) r ix e -> Int -> Sz1 -> ST s ()
forall r ix e ix' (m :: * -> *).
(Mutable r ix e, Mutable r ix' e, PrimMonad m) =>
Array r ix' e
-> Int -> MArray (PrimState m) r ix e -> Int -> Sz1 -> m ()
unsafeArrayLinearCopy Array r ix e
arr Int
0 MArray s r ix e
MArray (PrimState (ST s)) r ix e
marr Int
0 (Int -> Sz1
forall ix. Index ix => ix -> Sz ix
Sz (Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem Sz ix
sz))
        Comp -> MArray (PrimState (ST s)) r ix e -> ST s (Array r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
unsafeFreeze (Array r ix e -> Comp
forall r ix e. Load r ix e => Array r ix e -> Comp
getComp Array r ix e
arr) MArray s r ix e
MArray (PrimState (ST s)) r ix e
marr)


prop_UnsafeArrayLinearCopyPart ::
     forall r ix e.
     ( Eq (Vector r e)
     , Show (Vector r e)
     , Mutable r ix e
     , Mutable r Ix1 e
     )
  => ArrIx r ix e
  -> NonNegative Ix1
  -> Ix1
  -> Property
prop_UnsafeArrayLinearCopyPart :: ArrIx r ix e -> NonNegative Int -> Int -> Property
prop_UnsafeArrayLinearCopyPart (ArrIx Array r ix e
arr ix
ix) (NonNegative Int
delta) Int
toOffset =
  Int -> Sz1 -> Vector r e -> Vector r e
forall r e.
Source r Int e =>
Int -> Sz1 -> Vector r e -> Vector r e
slice' Int
i Sz1
k (Array r ix e -> Vector r e
forall r ix e.
(Load r ix e, Resize r ix) =>
Array r ix e -> Array r Int e
flatten Array r ix e
arr) Vector r e -> Vector r e -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== Int -> Sz1 -> Vector r e -> Vector r e
forall r e.
Source r Int e =>
Int -> Sz1 -> Vector r e -> Vector r e
slice' Int
j Sz1
k Vector r e
arr'
  where
    sz :: Sz ix
sz = Array r ix e -> Sz ix
forall r ix e. Load r ix e => Array r ix e -> Sz ix
size Array r ix e
arr
    i :: Int
i = Sz ix -> ix -> Int
forall ix. Index ix => Sz ix -> ix -> Int
toLinearIndex Sz ix
sz ix
ix
    j :: Int
j = Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
0 (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
toOffset)
    k :: Sz1
k = Int -> Sz1
forall ix. Index ix => ix -> Sz ix
Sz (Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem Sz ix
sz Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
delta)
    sz' :: Sz1
sz' = Int -> Sz1
forall ix. Index ix => ix -> Sz ix
Sz (Int
j Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Sz1 -> Int
forall ix. Sz ix -> ix
unSz Sz1
k)
    arr' :: Vector r e
arr' =
      (forall s. ST s (Vector r e)) -> Vector r e
forall a. (forall s. ST s a) -> a
runST ((forall s. ST s (Vector r e)) -> Vector r e)
-> (forall s. ST s (Vector r e)) -> Vector r e
forall a b. (a -> b) -> a -> b
$ do
        MArray s r Int e
marr <- Sz1 -> ST s (MArray (PrimState (ST s)) r Int e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Sz ix -> m (MArray (PrimState m) r ix e)
unsafeNew Sz1
sz'
        Array r ix e
-> Int
-> MArray (PrimState (ST s)) r Int e
-> Int
-> Sz1
-> ST s ()
forall r ix e ix' (m :: * -> *).
(Mutable r ix e, Mutable r ix' e, PrimMonad m) =>
Array r ix' e
-> Int -> MArray (PrimState m) r ix e -> Int -> Sz1 -> m ()
unsafeArrayLinearCopy Array r ix e
arr Int
i MArray s r Int e
MArray (PrimState (ST s)) r Int e
marr Int
j Sz1
k
        Comp -> MArray (PrimState (ST s)) r Int e -> ST s (Vector r e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
unsafeFreeze (Array r ix e -> Comp
forall r ix e. Load r ix e => Array r ix e -> Comp
getComp Array r ix e
arr) MArray s r Int e
MArray (PrimState (ST s)) r Int e
marr

prop_UnsafeLinearSet ::
     forall r ix e.
     ( Eq (Vector r e)
     , Show (Vector r e)
     , Mutable r ix e
     , Mutable r Ix1 e
     )
  => Comp
  -> SzIx ix
  -> NonNegative Ix1
  -> e
  -> Property
prop_UnsafeLinearSet :: Comp -> SzIx ix -> NonNegative Int -> e -> Property
prop_UnsafeLinearSet Comp
comp (SzIx Sz ix
sz ix
ix) (NonNegative Int
delta) e
e =
  Array DL Int e -> Array r Int e
forall r ix e r'.
(Mutable r ix e, Load r' ix e) =>
Array r' ix e -> Array r ix e
compute (Comp -> Sz1 -> e -> Array DL Int e
forall ix e. Index ix => Comp -> Sz ix -> e -> Array DL ix e
A.replicate Comp
Seq Sz1
k e
e) Array r Int e -> Array r Int e -> Property
forall a. (Eq a, Show a) => a -> a -> Property
===
  Int -> Sz1 -> Array r Int e -> Array r Int e
forall r e.
Source r Int e =>
Int -> Sz1 -> Vector r e -> Vector r e
slice' Int
i Sz1
k (Array r ix e -> Array r Int e
forall r ix e.
(Load r ix e, Resize r ix) =>
Array r ix e -> Array r Int e
flatten (Array r ix e
arrd :: Array r ix e))
  where
    i :: Int
i = Sz ix -> ix -> Int
forall ix. Index ix => Sz ix -> ix -> Int
toLinearIndex Sz ix
sz ix
ix
    k :: Sz1
k = Int -> Sz1
forall ix. Index ix => ix -> Sz ix
Sz (Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem Sz ix
sz Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
delta)
    arrd :: Array r ix e
arrd =
      (forall s. ST s (Array r ix e)) -> Array r ix e
forall a. (forall s. ST s a) -> a
runST ((forall s. ST s (Array r ix e)) -> Array r ix e)
-> (forall s. ST s (Array r ix e)) -> Array r ix e
forall a b. (a -> b) -> a -> b
$ do
        MArray s r ix e
marrd <- Sz ix -> ST s (MArray (PrimState (ST s)) r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Sz ix -> m (MArray (PrimState m) r ix e)
unsafeNew Sz ix
sz
        MArray (PrimState (ST s)) r ix e -> Int -> Sz1 -> e -> ST s ()
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> Int -> Sz1 -> e -> m ()
unsafeLinearSet MArray s r ix e
MArray (PrimState (ST s)) r ix e
marrd Int
i Sz1
k e
e
        Comp -> MArray (PrimState (ST s)) r ix e -> ST s (Array r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
unsafeFreeze Comp
comp MArray s r ix e
MArray (PrimState (ST s)) r ix e
marrd

prop_UnsafeLinearShrink ::
     forall r ix e.
     ( Eq (Vector r e)
     , Show (Vector r e)
     , Mutable r ix e
     , Source r Ix1 e
     )
  => ArrIx r ix e
  -> Property
prop_UnsafeLinearShrink :: ArrIx r ix e -> Property
prop_UnsafeLinearShrink (ArrIx Array r ix e
arr ix
ix) =
  Int -> Sz1 -> Vector r e -> Vector r e
forall r e.
Source r Int e =>
Int -> Sz1 -> Vector r e -> Vector r e
slice' Int
0 Sz1
k (Array r ix e -> Vector r e
forall r ix e.
(Load r ix e, Resize r ix) =>
Array r ix e -> Array r Int e
flatten Array r ix e
arr) Vector r e -> Vector r e -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== Int -> Sz1 -> Vector r e -> Vector r e
forall r e.
Source r Int e =>
Int -> Sz1 -> Vector r e -> Vector r e
slice' Int
0 Sz1
k (Array r ix e -> Vector r e
forall r ix e.
(Load r ix e, Resize r ix) =>
Array r ix e -> Array r Int e
flatten Array r ix e
arr')
  where
    sz :: Sz ix
sz = Array r ix e -> Sz ix
forall r ix e. Load r ix e => Array r ix e -> Sz ix
size Array r ix e
arr
    sz' :: Sz ix
sz' = ix -> Sz ix
forall ix. Index ix => ix -> Sz ix
Sz ((Int -> Int -> Int) -> ix -> ix -> ix
forall ix. Index ix => (Int -> Int -> Int) -> ix -> ix -> ix
liftIndex2 (-) (Sz ix -> ix
forall ix. Sz ix -> ix
unSz Sz ix
sz) ix
ix)
    k :: Sz1
k = Int -> Sz1
forall ix. Index ix => ix -> Sz ix
Sz (Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem Sz ix
sz')
    arr' :: Array r ix e
arr' =
      (forall s. ST s (Array r ix e)) -> Array r ix e
forall a. (forall s. ST s a) -> a
runST ((forall s. ST s (Array r ix e)) -> Array r ix e)
-> (forall s. ST s (Array r ix e)) -> Array r ix e
forall a b. (a -> b) -> a -> b
$ do
        MArray s r ix e
marr <- Array r ix e -> ST s (MArray (PrimState (ST s)) r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Array r ix e -> m (MArray (PrimState m) r ix e)
thawS Array r ix e
arr
        MArray s r ix e
marr' <- MArray (PrimState (ST s)) r ix e
-> Sz ix -> ST s (MArray (PrimState (ST s)) r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e
-> Sz ix -> m (MArray (PrimState m) r ix e)
unsafeLinearShrink MArray s r ix e
MArray (PrimState (ST s)) r ix e
marr Sz ix
sz'
        Comp -> MArray (PrimState (ST s)) r ix e -> ST s (Array r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
unsafeFreeze (Array r ix e -> Comp
forall r ix e. Load r ix e => Array r ix e -> Comp
getComp Array r ix e
arr) MArray s r ix e
MArray (PrimState (ST s)) r ix e
marr'

prop_UnsafeLinearGrow ::
     forall r ix e.
     ( Eq (Array r ix e)
     , Show (Array r ix e)
     , Eq (Vector r e)
     , Show (Vector r e)
     , Mutable r ix e
     , Source r Ix1 e
     )
  => ArrIx r ix e
  -> e
  -> Property
prop_UnsafeLinearGrow :: ArrIx r ix e -> e -> Property
prop_UnsafeLinearGrow (ArrIx Array r ix e
arr ix
ix) e
e =
  Int -> Sz1 -> Vector r e -> Vector r e
forall r e.
Source r Int e =>
Int -> Sz1 -> Vector r e -> Vector r e
slice' Int
0 Sz1
k (Array r ix e -> Vector r e
forall r ix e.
(Load r ix e, Resize r ix) =>
Array r ix e -> Array r Int e
flatten Array r ix e
arr) Vector r e -> Vector r e -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== Int -> Sz1 -> Vector r e -> Vector r e
forall r e.
Source r Int e =>
Int -> Sz1 -> Vector r e -> Vector r e
slice' Int
0 Sz1
k (Array r ix e -> Vector r e
forall r ix e.
(Load r ix e, Resize r ix) =>
Array r ix e -> Array r Int e
flatten Array r ix e
arrGrown) Property -> Property -> Property
forall prop1 prop2.
(Testable prop1, Testable prop2) =>
prop1 -> prop2 -> Property
.&&.
  Array r ix e
arrCopied Array r ix e -> Array r ix e -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== Array r ix e
arrGrown
  where
    sz :: Sz ix
sz = Array r ix e -> Sz ix
forall r ix e. Load r ix e => Array r ix e -> Sz ix
size Array r ix e
arr
    sz' :: Sz ix
sz' = ix -> Sz ix
forall ix. Index ix => ix -> Sz ix
Sz ((Int -> Int -> Int) -> ix -> ix -> ix
forall ix. Index ix => (Int -> Int -> Int) -> ix -> ix -> ix
liftIndex2 Int -> Int -> Int
forall a. Num a => a -> a -> a
(+) (Sz ix -> ix
forall ix. Sz ix -> ix
unSz Sz ix
sz) ix
ix)
    k :: Sz1
k = Int -> Sz1
forall ix. Index ix => ix -> Sz ix
Sz (Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem Sz ix
sz)
    (Array r ix e
arrCopied, Array r ix e
arrGrown) =
      (forall s. ST s (Array r ix e, Array r ix e))
-> (Array r ix e, Array r ix e)
forall a. (forall s. ST s a) -> a
runST ((forall s. ST s (Array r ix e, Array r ix e))
 -> (Array r ix e, Array r ix e))
-> (forall s. ST s (Array r ix e, Array r ix e))
-> (Array r ix e, Array r ix e)
forall a b. (a -> b) -> a -> b
$ do
        MArray s r ix e
marrCopied <- Sz ix -> ST s (MArray (PrimState (ST s)) r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Sz ix -> m (MArray (PrimState m) r ix e)
unsafeNew Sz ix
sz'
        Array r ix e
-> Int -> MArray (PrimState (ST s)) r ix e -> Int -> Sz1 -> ST s ()
forall r ix e ix' (m :: * -> *).
(Mutable r ix e, Mutable r ix' e, PrimMonad m) =>
Array r ix' e
-> Int -> MArray (PrimState m) r ix e -> Int -> Sz1 -> m ()
unsafeArrayLinearCopy Array r ix e
arr Int
0 MArray s r ix e
MArray (PrimState (ST s)) r ix e
marrCopied Int
0 Sz1
k
        MArray s r ix e
marr <- Array r ix e -> ST s (MArray (PrimState (ST s)) r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Array r ix e -> m (MArray (PrimState m) r ix e)
thawS Array r ix e
arr
        MArray s r ix e
marrGrown <- MArray (PrimState (ST s)) r ix e
-> Sz ix -> ST s (MArray (PrimState (ST s)) r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e
-> Sz ix -> m (MArray (PrimState m) r ix e)
unsafeLinearGrow MArray s r ix e
MArray (PrimState (ST s)) r ix e
marr Sz ix
sz'
        Bool -> ST s () -> ST s ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Sz ix
sz' Sz ix -> Sz ix -> Bool
forall a. Eq a => a -> a -> Bool
/= Sz ix
sz) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ do
          MArray (PrimState (ST s)) r ix e -> Int -> Sz1 -> e -> ST s ()
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> Int -> Sz1 -> e -> m ()
unsafeLinearSet MArray s r ix e
MArray (PrimState (ST s)) r ix e
marrGrown (Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem Sz ix
sz) (Int -> Sz1
forall ix. Index ix => ix -> Sz ix
Sz (Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem Sz ix
sz' Int -> Int -> Int
forall a. Num a => a -> a -> a
- Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem Sz ix
sz)) e
e
          MArray (PrimState (ST s)) r ix e -> Int -> Sz1 -> e -> ST s ()
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> Int -> Sz1 -> e -> m ()
unsafeLinearSet MArray s r ix e
MArray (PrimState (ST s)) r ix e
marrCopied (Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem Sz ix
sz) (Int -> Sz1
forall ix. Index ix => ix -> Sz ix
Sz (Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem Sz ix
sz' Int -> Int -> Int
forall a. Num a => a -> a -> a
- Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem Sz ix
sz)) e
e
        (,) (Array r ix e -> Array r ix e -> (Array r ix e, Array r ix e))
-> ST s (Array r ix e)
-> ST s (Array r ix e -> (Array r ix e, Array r ix e))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Comp -> MArray (PrimState (ST s)) r ix e -> ST s (Array r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
unsafeFreeze (Array r ix e -> Comp
forall r ix e. Load r ix e => Array r ix e -> Comp
getComp Array r ix e
arr) MArray s r ix e
MArray (PrimState (ST s)) r ix e
marrCopied ST s (Array r ix e -> (Array r ix e, Array r ix e))
-> ST s (Array r ix e) -> ST s (Array r ix e, Array r ix e)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Comp -> MArray (PrimState (ST s)) r ix e -> ST s (Array r ix e)
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
unsafeFreeze (Array r ix e -> Comp
forall r ix e. Load r ix e => Array r ix e -> Comp
getComp Array r ix e
arr) MArray s r ix e
MArray (PrimState (ST s)) r ix e
marrGrown


unsafeMutableSpec ::
     forall r ix e.
     ( Eq (Vector r e)
     , Show (Vector r e)
     , Eq (Array r ix e)
     , Show (Array r ix e)
     , Mutable r ix e
     , Mutable r Ix1 e
     , Show e
     , Eq e
     , Arbitrary e
     , Arbitrary ix
     , Typeable e
     , Typeable ix
     )
  => Spec
unsafeMutableSpec :: Spec
unsafeMutableSpec =
  String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe (String
"Mutable (" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> String
forall r ix e.
(Typeable r, Typeable ix, Typeable e) =>
String -> String
showsArrayType @r @ix @e String
") (Unsafe)") (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
    String -> Property -> SpecWith (Arg Property)
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"UnsafeNewMsize" (Property -> SpecWith (Arg Property))
-> Property -> SpecWith (Arg Property)
forall a b. (a -> b) -> a -> b
$ (Arbitrary ix, Mutable r ix e) => Property
forall r ix e. (Arbitrary ix, Mutable r ix e) => Property
prop_UnsafeNewMsize @r @ix @e
    String -> Property -> SpecWith (Arg Property)
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"UnsafeNewLinearWriteRead" (Property -> SpecWith (Arg Property))
-> Property -> SpecWith (Arg Property)
forall a b. (a -> b) -> a -> b
$ (Eq e, Show e, Mutable r ix e, Arbitrary ix, Arbitrary e) =>
Property
forall r ix e.
(Eq e, Show e, Mutable r ix e, Arbitrary ix, Arbitrary e) =>
Property
prop_UnsafeNewLinearWriteRead @r @ix @e
    String -> Property -> SpecWith (Arg Property)
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"UnsafeThawFreeze" (Property -> SpecWith (Arg Property))
-> Property -> SpecWith (Arg Property)
forall a b. (a -> b) -> a -> b
$ (Array r ix e -> Property) -> Property
forall prop. Testable prop => prop -> Property
property ((Array r ix e -> Property) -> Property)
-> (Array r ix e -> Property) -> Property
forall a b. (a -> b) -> a -> b
$ (Eq (Array r ix e), Show (Array r ix e), Mutable r ix e) =>
Array r ix e -> Property
forall r ix e.
(Eq (Array r ix e), Show (Array r ix e), Mutable r ix e) =>
Array r ix e -> Property
prop_UnsafeThawFreeze @r @ix @e
    String -> Property -> SpecWith (Arg Property)
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"UnsafeInitializeNew" (Property -> SpecWith (Arg Property))
-> Property -> SpecWith (Arg Property)
forall a b. (a -> b) -> a -> b
$ (Eq (Array r ix e), Show (Array r ix e), Show e, Arbitrary e,
 Arbitrary ix, Mutable r ix e) =>
Property
forall r ix e.
(Eq (Array r ix e), Show (Array r ix e), Show e, Arbitrary e,
 Arbitrary ix, Mutable r ix e) =>
Property
prop_UnsafeInitializeNew @r @ix @e
    String -> Property -> SpecWith (Arg Property)
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"UnsafeLinearSet" (Property -> SpecWith (Arg Property))
-> Property -> SpecWith (Arg Property)
forall a b. (a -> b) -> a -> b
$ (Comp -> SzIx ix -> NonNegative Int -> e -> Property) -> Property
forall prop. Testable prop => prop -> Property
property ((Comp -> SzIx ix -> NonNegative Int -> e -> Property) -> Property)
-> (Comp -> SzIx ix -> NonNegative Int -> e -> Property)
-> Property
forall a b. (a -> b) -> a -> b
$ (Eq (Vector r e), Show (Vector r e), Mutable r ix e,
 Mutable r Int e) =>
Comp -> SzIx ix -> NonNegative Int -> e -> Property
forall r ix e.
(Eq (Vector r e), Show (Vector r e), Mutable r ix e,
 Mutable r Int e) =>
Comp -> SzIx ix -> NonNegative Int -> e -> Property
prop_UnsafeLinearSet @r @ix @e
    String -> Property -> SpecWith (Arg Property)
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"UnsafeLinearCopy" (Property -> SpecWith (Arg Property))
-> Property -> SpecWith (Arg Property)
forall a b. (a -> b) -> a -> b
$ (Array r ix e -> Property) -> Property
forall prop. Testable prop => prop -> Property
property ((Array r ix e -> Property) -> Property)
-> (Array r ix e -> Property) -> Property
forall a b. (a -> b) -> a -> b
$ (Eq (Array r ix e), Show (Array r ix e), Mutable r ix e) =>
Array r ix e -> Property
forall r ix e.
(Eq (Array r ix e), Show (Array r ix e), Mutable r ix e) =>
Array r ix e -> Property
prop_UnsafeLinearCopy @r @ix @e
    String -> Property -> SpecWith (Arg Property)
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"UnsafeLinearCopyPart" (Property -> SpecWith (Arg Property))
-> Property -> SpecWith (Arg Property)
forall a b. (a -> b) -> a -> b
$ (ArrIx r ix e -> NonNegative Int -> Int -> Property) -> Property
forall prop. Testable prop => prop -> Property
property ((ArrIx r ix e -> NonNegative Int -> Int -> Property) -> Property)
-> (ArrIx r ix e -> NonNegative Int -> Int -> Property) -> Property
forall a b. (a -> b) -> a -> b
$ (Eq (Vector r e), Show (Vector r e), Eq (Array r ix e),
 Show (Array r ix e), Mutable r ix e, Mutable r Int e) =>
ArrIx r ix e -> NonNegative Int -> Int -> Property
forall r ix e.
(Eq (Vector r e), Show (Vector r e), Eq (Array r ix e),
 Show (Array r ix e), Mutable r ix e, Mutable r Int e) =>
ArrIx r ix e -> NonNegative Int -> Int -> Property
prop_UnsafeLinearCopyPart @r @ix @e
    String -> Property -> SpecWith (Arg Property)
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"UnsafeArrayLinearCopy" (Property -> SpecWith (Arg Property))
-> Property -> SpecWith (Arg Property)
forall a b. (a -> b) -> a -> b
$ (Array r ix e -> Property) -> Property
forall prop. Testable prop => prop -> Property
property ((Array r ix e -> Property) -> Property)
-> (Array r ix e -> Property) -> Property
forall a b. (a -> b) -> a -> b
$ (Eq (Array r ix e), Show (Array r ix e), Mutable r ix e) =>
Array r ix e -> Property
forall r ix e.
(Eq (Array r ix e), Show (Array r ix e), Mutable r ix e) =>
Array r ix e -> Property
prop_UnsafeArrayLinearCopy @r @ix @e
    String -> Property -> SpecWith (Arg Property)
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"UnsafeArrayLinearCopyPart" (Property -> SpecWith (Arg Property))
-> Property -> SpecWith (Arg Property)
forall a b. (a -> b) -> a -> b
$ (ArrIx r ix e -> NonNegative Int -> Int -> Property) -> Property
forall prop. Testable prop => prop -> Property
property ((ArrIx r ix e -> NonNegative Int -> Int -> Property) -> Property)
-> (ArrIx r ix e -> NonNegative Int -> Int -> Property) -> Property
forall a b. (a -> b) -> a -> b
$ (Eq (Vector r e), Show (Vector r e), Mutable r ix e,
 Mutable r Int e) =>
ArrIx r ix e -> NonNegative Int -> Int -> Property
forall r ix e.
(Eq (Vector r e), Show (Vector r e), Mutable r ix e,
 Mutable r Int e) =>
ArrIx r ix e -> NonNegative Int -> Int -> Property
prop_UnsafeArrayLinearCopyPart @r @ix @e
    String -> Property -> SpecWith (Arg Property)
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"UnsafeLinearShrink" (Property -> SpecWith (Arg Property))
-> Property -> SpecWith (Arg Property)
forall a b. (a -> b) -> a -> b
$ (ArrIx r ix e -> Property) -> Property
forall prop. Testable prop => prop -> Property
property ((ArrIx r ix e -> Property) -> Property)
-> (ArrIx r ix e -> Property) -> Property
forall a b. (a -> b) -> a -> b
$ (Eq (Vector r e), Show (Vector r e), Mutable r ix e,
 Source r Int e) =>
ArrIx r ix e -> Property
forall r ix e.
(Eq (Vector r e), Show (Vector r e), Mutable r ix e,
 Source r Int e) =>
ArrIx r ix e -> Property
prop_UnsafeLinearShrink @r @ix @e
    String -> Property -> SpecWith (Arg Property)
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"UnsafeLinearGrow" (Property -> SpecWith (Arg Property))
-> Property -> SpecWith (Arg Property)
forall a b. (a -> b) -> a -> b
$ (ArrIx r ix e -> e -> Property) -> Property
forall prop. Testable prop => prop -> Property
property ((ArrIx r ix e -> e -> Property) -> Property)
-> (ArrIx r ix e -> e -> Property) -> Property
forall a b. (a -> b) -> a -> b
$ (Eq (Array r ix e), Show (Array r ix e), Eq (Vector r e),
 Show (Vector r e), Mutable r ix e, Source r Int e) =>
ArrIx r ix e -> e -> Property
forall r ix e.
(Eq (Array r ix e), Show (Array r ix e), Eq (Vector r e),
 Show (Vector r e), Mutable r ix e, Source r Int e) =>
ArrIx r ix e -> e -> Property
prop_UnsafeLinearGrow @r @ix @e

unsafeMutableUnboxedSpec ::
     forall r ix e.
     (Typeable e, Typeable ix, Eq (Array r ix e), Show (Array r ix e), Arbitrary ix, Mutable r ix e)
  => Spec
unsafeMutableUnboxedSpec :: Spec
unsafeMutableUnboxedSpec =
  String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe (String
"Mutable Unboxed (" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> String
forall r ix e.
(Typeable r, Typeable ix, Typeable e) =>
String -> String
showsArrayType @r @ix @e String
") (Unsafe)") (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$
    String -> Property -> SpecWith (Arg Property)
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"UnsafeInitialize" (Property -> SpecWith (Arg Property))
-> Property -> SpecWith (Arg Property)
forall a b. (a -> b) -> a -> b
$ (Eq (Array r ix e), Show (Array r ix e), Arbitrary ix,
 Mutable r ix e) =>
Property
forall r ix e.
(Eq (Array r ix e), Show (Array r ix e), Arbitrary ix,
 Mutable r ix e) =>
Property
prop_UnsafeInitialize @r @ix @e