{-# 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, Index ix, Manifest r 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 e ix (m :: * -> *).
(Manifest r e, Index ix, 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 e ix s.
(Manifest r e, Index ix) =>
MArray s r ix e -> Sz ix
sizeOfMArray MArray RealWorld r ix e
marr

prop_UnsafeNewLinearWriteRead ::
     forall r ix e.
     (Eq e, Show e, Manifest r e, Index ix, 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 e ix (m :: * -> *).
(Manifest r e, Index ix, PrimMonad m) =>
Sz ix -> m (MArray (PrimState m) r ix e)
unsafeNew Sz ix
sz
  let i :: Ix1
i = Sz ix -> ix -> Ix1
forall ix. Index ix => Sz ix -> ix -> Ix1
toLinearIndex Sz ix
sz ix
ix
  MArray (PrimState IO) r ix e -> Ix1 -> e -> IO ()
forall r e ix (m :: * -> *).
(Manifest r e, Index ix, PrimMonad m) =>
MArray (PrimState m) r ix e -> Ix1 -> e -> m ()
unsafeLinearWrite MArray RealWorld r ix e
MArray (PrimState IO) r ix e
marr Ix1
i e
e1
  MArray (PrimState IO) r ix e -> Ix1 -> IO e
forall r e ix (m :: * -> *).
(Manifest r e, Index ix, PrimMonad m) =>
MArray (PrimState m) r ix e -> Ix1 -> m e
unsafeLinearRead MArray RealWorld r ix e
MArray (PrimState IO) r ix e
marr Ix1
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) -> Ix1 -> IO e
forall r e ix (m :: * -> *).
(Manifest r e, Index ix, PrimMonad m) =>
MArray (PrimState m) r ix e -> (e -> m e) -> Ix1 -> 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) Ix1
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 -> Ix1 -> IO e
forall r e ix (m :: * -> *).
(Manifest r e, Index ix, PrimMonad m) =>
MArray (PrimState m) r ix e -> Ix1 -> m e
unsafeLinearRead MArray RealWorld r ix e
MArray (PrimState IO) r ix e
marr Ix1
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), Index ix, Manifest r 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 e ix (m :: * -> *).
(Manifest r e, Index ix, PrimMonad m) =>
Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
unsafeFreeze (Array r ix e -> Comp
forall r ix e. Strategy r => 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 e ix (m :: * -> *).
(Manifest r e, Index ix, 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
     , Index ix
     , Manifest r 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'.
(Manifest r e, Load r' ix e) =>
Array r' ix e -> Array r ix e
compute (Comp -> Sz ix -> e -> Array DL ix e
forall r ix e. Load r ix e => Comp -> Sz ix -> e -> Array r ix e
A.replicate Comp
comp Sz ix
sz e
e :: Array DL 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
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 e ix (m :: * -> *).
(Manifest r e, Index ix, 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 e ix (m :: * -> *).
(Manifest r e, Index ix, 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
     , Index ix
     , Manifest r 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 e ix (m :: * -> *).
(Manifest r e, Index ix, 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 e ix (m :: * -> *).
(Manifest r e, Index ix, 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 e ix (m :: * -> *).
(Manifest r e, Index ix, 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 e ix (m :: * -> *).
(Manifest r e, Index ix, 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 e ix (m :: * -> *).
(Manifest r e, Index ix, 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), Index ix, Manifest r 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. Size r => 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 :: * -> *).
(Manifest r e, Index ix, 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 e ix (m :: * -> *).
(Manifest r e, Index ix, PrimMonad m) =>
Sz ix -> m (MArray (PrimState m) r ix e)
unsafeNew Sz ix
sz
        MArray (PrimState (ST s)) r ix e
-> Ix1 -> MArray (PrimState (ST s)) r ix e -> Ix1 -> Sz1 -> ST s ()
forall r e ix' ix (m :: * -> *).
(Manifest r e, Index ix', Index ix, PrimMonad m) =>
MArray (PrimState m) r ix' e
-> Ix1 -> MArray (PrimState m) r ix e -> Ix1 -> Sz1 -> m ()
unsafeLinearCopy MArray s r ix e
MArray (PrimState (ST s)) r ix e
marrs Ix1
0 MArray s r ix e
MArray (PrimState (ST s)) r ix e
marrd Ix1
0 (Ix1 -> Sz1
forall ix. Index ix => ix -> Sz ix
Sz (Sz ix -> Ix1
forall ix. Index ix => Sz ix -> Ix1
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 e ix (m :: * -> *).
(Manifest r e, Index ix, PrimMonad m) =>
Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
unsafeFreeze (Array r ix e -> Comp
forall r ix e. Strategy r => 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 e ix (m :: * -> *).
(Manifest r e, Index ix, PrimMonad m) =>
Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
unsafeFreeze (Array r ix e -> Comp
forall r ix e. Strategy r => 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)
     , Manifest r e
     , Index ix
     )
  => ArrIx r ix e
  -> NonNegative Ix1
  -> Ix1
  -> Property
prop_UnsafeLinearCopyPart :: ArrIx r ix e -> NonNegative Ix1 -> Ix1 -> Property
prop_UnsafeLinearCopyPart (ArrIx Array r ix e
arr ix
ix) (NonNegative Ix1
delta) Ix1
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
.&&. Ix1 -> Sz1 -> Vector r e -> Vector r e
forall r e.
(HasCallStack, Source r e) =>
Ix1 -> Sz1 -> Vector r e -> Vector r e
slice' Ix1
i Sz1
k (Array r ix e -> Vector r e
forall r ix e. (Index ix, Size r) => Array r ix e -> Vector r e
flatten Array r ix e
arr) Vector r e -> Vector r e -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== Ix1 -> Sz1 -> Vector r e -> Vector r e
forall r e.
(HasCallStack, Source r e) =>
Ix1 -> Sz1 -> Vector r e -> Vector r e
slice' Ix1
j Sz1
k Vector r e
arrd
  where
    sz :: Sz ix
sz = Array r ix e -> Sz ix
forall r ix e. Size r => Array r ix e -> Sz ix
size Array r ix e
arr
    i :: Ix1
i = Sz ix -> ix -> Ix1
forall ix. Index ix => Sz ix -> ix -> Ix1
toLinearIndex Sz ix
sz ix
ix
    j :: Ix1
j = Ix1 -> Ix1 -> Ix1
forall a. Ord a => a -> a -> a
max Ix1
0 (Ix1
i Ix1 -> Ix1 -> Ix1
forall a. Num a => a -> a -> a
+ Ix1
toOffset)
    k :: Sz1
k = Ix1 -> Sz1
forall ix. Index ix => ix -> Sz ix
Sz (Sz ix -> Ix1
forall ix. Index ix => Sz ix -> Ix1
totalElem Sz ix
sz Ix1 -> Ix1 -> Ix1
forall a. Num a => a -> a -> a
- Ix1
i Ix1 -> Ix1 -> Ix1
forall a. Num a => a -> a -> a
- Ix1
delta)
    sz' :: Sz1
sz' = Ix1 -> Sz1
forall ix. Index ix => ix -> Sz ix
Sz (Ix1
j Ix1 -> Ix1 -> Ix1
forall a. Num a => a -> a -> a
+ Sz1 -> Ix1
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 :: * -> *).
(Manifest r e, Index ix, 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 Ix1 e
marrd <- Sz1 -> ST s (MArray (PrimState (ST s)) r Ix1 e)
forall r e ix (m :: * -> *).
(Manifest r e, Index ix, PrimMonad m) =>
Sz ix -> m (MArray (PrimState m) r ix e)
unsafeNew Sz1
sz'
        MArray (PrimState (ST s)) r ix e
-> Ix1
-> MArray (PrimState (ST s)) r Ix1 e
-> Ix1
-> Sz1
-> ST s ()
forall r e ix' ix (m :: * -> *).
(Manifest r e, Index ix', Index ix, PrimMonad m) =>
MArray (PrimState m) r ix' e
-> Ix1 -> MArray (PrimState m) r ix e -> Ix1 -> Sz1 -> m ()
unsafeLinearCopy MArray s r ix e
MArray (PrimState (ST s)) r ix e
marrs Ix1
i MArray s r Ix1 e
MArray (PrimState (ST s)) r Ix1 e
marrd Ix1
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 e ix (m :: * -> *).
(Manifest r e, Index ix, PrimMonad m) =>
Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
unsafeFreeze (Array r ix e -> Comp
forall r ix e. Strategy r => 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 Ix1 e -> ST s (Vector r e)
forall r e ix (m :: * -> *).
(Manifest r e, Index ix, PrimMonad m) =>
Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
unsafeFreeze (Array r ix e -> Comp
forall r ix e. Strategy r => Array r ix e -> Comp
getComp Array r ix e
arr) MArray s r Ix1 e
MArray (PrimState (ST s)) r Ix1 e
marrd


prop_UnsafeArrayLinearCopy ::
     forall r ix e. (Eq (Array r ix e), Show (Array r ix e), Index ix, Manifest r 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. Size r => 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 e ix (m :: * -> *).
(Manifest r e, Index ix, PrimMonad m) =>
Sz ix -> m (MArray (PrimState m) r ix e)
unsafeNew Sz ix
sz
        Array r ix e
-> Ix1 -> MArray (PrimState (ST s)) r ix e -> Ix1 -> Sz1 -> ST s ()
forall r e ix' ix (m :: * -> *).
(Manifest r e, Index ix', Index ix, PrimMonad m) =>
Array r ix' e
-> Ix1 -> MArray (PrimState m) r ix e -> Ix1 -> Sz1 -> m ()
unsafeArrayLinearCopy Array r ix e
arr Ix1
0 MArray s r ix e
MArray (PrimState (ST s)) r ix e
marr Ix1
0 (Ix1 -> Sz1
forall ix. Index ix => ix -> Sz ix
Sz (Sz ix -> Ix1
forall ix. Index ix => Sz ix -> Ix1
totalElem Sz ix
sz))
        Comp -> MArray (PrimState (ST s)) r ix e -> ST s (Array r ix e)
forall r e ix (m :: * -> *).
(Manifest r e, Index ix, PrimMonad m) =>
Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
unsafeFreeze (Array r ix e -> Comp
forall r ix e. Strategy r => 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), Index ix, Manifest r e)
  => ArrIx r ix e
  -> NonNegative Ix1
  -> Ix1
  -> Property
prop_UnsafeArrayLinearCopyPart :: ArrIx r ix e -> NonNegative Ix1 -> Ix1 -> Property
prop_UnsafeArrayLinearCopyPart (ArrIx Array r ix e
arr ix
ix) (NonNegative Ix1
delta) Ix1
toOffset =
  Ix1 -> Sz1 -> Vector r e -> Vector r e
forall r e.
(HasCallStack, Source r e) =>
Ix1 -> Sz1 -> Vector r e -> Vector r e
slice' Ix1
i Sz1
k (Array r ix e -> Vector r e
forall r ix e. (Index ix, Size r) => Array r ix e -> Vector r e
flatten Array r ix e
arr) Vector r e -> Vector r e -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== Ix1 -> Sz1 -> Vector r e -> Vector r e
forall r e.
(HasCallStack, Source r e) =>
Ix1 -> Sz1 -> Vector r e -> Vector r e
slice' Ix1
j Sz1
k Vector r e
arr'
  where
    sz :: Sz ix
sz = Array r ix e -> Sz ix
forall r ix e. Size r => Array r ix e -> Sz ix
size Array r ix e
arr
    i :: Ix1
i = Sz ix -> ix -> Ix1
forall ix. Index ix => Sz ix -> ix -> Ix1
toLinearIndex Sz ix
sz ix
ix
    j :: Ix1
j = Ix1 -> Ix1 -> Ix1
forall a. Ord a => a -> a -> a
max Ix1
0 (Ix1
i Ix1 -> Ix1 -> Ix1
forall a. Num a => a -> a -> a
+ Ix1
toOffset)
    k :: Sz1
k = Ix1 -> Sz1
forall ix. Index ix => ix -> Sz ix
Sz (Sz ix -> Ix1
forall ix. Index ix => Sz ix -> Ix1
totalElem Sz ix
sz Ix1 -> Ix1 -> Ix1
forall a. Num a => a -> a -> a
- Ix1
i Ix1 -> Ix1 -> Ix1
forall a. Num a => a -> a -> a
- Ix1
delta)
    sz' :: Sz1
sz' = Ix1 -> Sz1
forall ix. Index ix => ix -> Sz ix
Sz (Ix1
j Ix1 -> Ix1 -> Ix1
forall a. Num a => a -> a -> a
+ Sz1 -> Ix1
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 Ix1 e
marr <- Sz1 -> ST s (MArray (PrimState (ST s)) r Ix1 e)
forall r e ix (m :: * -> *).
(Manifest r e, Index ix, PrimMonad m) =>
Sz ix -> m (MArray (PrimState m) r ix e)
unsafeNew Sz1
sz'
        Array r ix e
-> Ix1
-> MArray (PrimState (ST s)) r Ix1 e
-> Ix1
-> Sz1
-> ST s ()
forall r e ix' ix (m :: * -> *).
(Manifest r e, Index ix', Index ix, PrimMonad m) =>
Array r ix' e
-> Ix1 -> MArray (PrimState m) r ix e -> Ix1 -> Sz1 -> m ()
unsafeArrayLinearCopy Array r ix e
arr Ix1
i MArray s r Ix1 e
MArray (PrimState (ST s)) r Ix1 e
marr Ix1
j Sz1
k
        Comp -> MArray (PrimState (ST s)) r Ix1 e -> ST s (Vector r e)
forall r e ix (m :: * -> *).
(Manifest r e, Index ix, PrimMonad m) =>
Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
unsafeFreeze (Array r ix e -> Comp
forall r ix e. Strategy r => Array r ix e -> Comp
getComp Array r ix e
arr) MArray s r Ix1 e
MArray (PrimState (ST s)) r Ix1 e
marr

prop_UnsafeLinearSet ::
     forall r ix e.
     ( Eq (Vector r e)
     , Show (Vector r e)
     , Index ix
     , Manifest r e
     )
  => Comp
  -> SzIx ix
  -> NonNegative Ix1
  -> e
  -> Property
prop_UnsafeLinearSet :: Comp -> SzIx ix -> NonNegative Ix1 -> e -> Property
prop_UnsafeLinearSet Comp
comp (SzIx Sz ix
sz ix
ix) (NonNegative Ix1
delta) e
e =
  Array DL Ix1 e -> Array r Ix1 e
forall r ix e r'.
(Manifest r e, Load r' ix e) =>
Array r' ix e -> Array r ix e
compute (Comp -> Sz1 -> e -> Array DL Ix1 e
forall r ix e. Load r ix e => Comp -> Sz ix -> e -> Array r ix e
A.replicate Comp
Seq Sz1
k e
e :: Array DL Ix1 e) Array r Ix1 e -> Array r Ix1 e -> Property
forall a. (Eq a, Show a) => a -> a -> Property
===
  Ix1 -> Sz1 -> Array r Ix1 e -> Array r Ix1 e
forall r e.
(HasCallStack, Source r e) =>
Ix1 -> Sz1 -> Vector r e -> Vector r e
slice' Ix1
i Sz1
k (Array r ix e -> Array r Ix1 e
forall r ix e. (Index ix, Size r) => Array r ix e -> Vector r e
flatten (Array r ix e
arrd :: Array r ix e))
  where
    i :: Ix1
i = Sz ix -> ix -> Ix1
forall ix. Index ix => Sz ix -> ix -> Ix1
toLinearIndex Sz ix
sz ix
ix
    k :: Sz1
k = Ix1 -> Sz1
forall ix. Index ix => ix -> Sz ix
Sz (Sz ix -> Ix1
forall ix. Index ix => Sz ix -> Ix1
totalElem Sz ix
sz Ix1 -> Ix1 -> Ix1
forall a. Num a => a -> a -> a
- Ix1
i Ix1 -> Ix1 -> Ix1
forall a. Num a => a -> a -> a
- Ix1
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 e ix (m :: * -> *).
(Manifest r e, Index ix, PrimMonad m) =>
Sz ix -> m (MArray (PrimState m) r ix e)
unsafeNew Sz ix
sz
        MArray (PrimState (ST s)) r ix e -> Ix1 -> Sz1 -> e -> ST s ()
forall r e ix (m :: * -> *).
(Manifest r e, Index ix, PrimMonad m) =>
MArray (PrimState m) r ix e -> Ix1 -> Sz1 -> e -> m ()
unsafeLinearSet MArray s r ix e
MArray (PrimState (ST s)) r ix e
marrd Ix1
i Sz1
k e
e
        Comp -> MArray (PrimState (ST s)) r ix e -> ST s (Array r ix e)
forall r e ix (m :: * -> *).
(Manifest r e, Index ix, 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)
     , Manifest r e
     , Index ix
     )
  => ArrIx r ix e
  -> Property
prop_UnsafeLinearShrink :: ArrIx r ix e -> Property
prop_UnsafeLinearShrink (ArrIx Array r ix e
arr ix
ix) =
  Ix1 -> Sz1 -> Vector r e -> Vector r e
forall r e.
(HasCallStack, Source r e) =>
Ix1 -> Sz1 -> Vector r e -> Vector r e
slice' Ix1
0 Sz1
k (Array r ix e -> Vector r e
forall r ix e. (Index ix, Size r) => Array r ix e -> Vector r e
flatten Array r ix e
arr) Vector r e -> Vector r e -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== Ix1 -> Sz1 -> Vector r e -> Vector r e
forall r e.
(HasCallStack, Source r e) =>
Ix1 -> Sz1 -> Vector r e -> Vector r e
slice' Ix1
0 Sz1
k (Array r ix e -> Vector r e
forall r ix e. (Index ix, Size r) => Array r ix e -> Vector r e
flatten Array r ix e
arr')
  where
    sz :: Sz ix
sz = Array r ix e -> Sz ix
forall r ix e. Size r => 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 ((Ix1 -> Ix1 -> Ix1) -> ix -> ix -> ix
forall ix. Index ix => (Ix1 -> Ix1 -> Ix1) -> ix -> ix -> ix
liftIndex2 (-) (Sz ix -> ix
forall ix. Sz ix -> ix
unSz Sz ix
sz) ix
ix)
    k :: Sz1
k = Ix1 -> Sz1
forall ix. Index ix => ix -> Sz ix
Sz (Sz ix -> Ix1
forall ix. Index ix => Sz ix -> Ix1
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 :: * -> *).
(Manifest r e, Index ix, 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 e ix (m :: * -> *).
(Manifest r e, Index ix, 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 e ix (m :: * -> *).
(Manifest r e, Index ix, PrimMonad m) =>
Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
unsafeFreeze (Array r ix e -> Comp
forall r ix e. Strategy r => 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)
     , Manifest r e
     , Index ix
     )
  => 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 =
  Ix1 -> Sz1 -> Vector r e -> Vector r e
forall r e.
(HasCallStack, Source r e) =>
Ix1 -> Sz1 -> Vector r e -> Vector r e
slice' Ix1
0 Sz1
k (Array r ix e -> Vector r e
forall r ix e. (Index ix, Size r) => Array r ix e -> Vector r e
flatten Array r ix e
arr) Vector r e -> Vector r e -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== Ix1 -> Sz1 -> Vector r e -> Vector r e
forall r e.
(HasCallStack, Source r e) =>
Ix1 -> Sz1 -> Vector r e -> Vector r e
slice' Ix1
0 Sz1
k (Array r ix e -> Vector r e
forall r ix e. (Index ix, Size r) => Array r ix e -> Vector r 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. Size r => 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 ((Ix1 -> Ix1 -> Ix1) -> ix -> ix -> ix
forall ix. Index ix => (Ix1 -> Ix1 -> Ix1) -> ix -> ix -> ix
liftIndex2 Ix1 -> Ix1 -> Ix1
forall a. Num a => a -> a -> a
(+) (Sz ix -> ix
forall ix. Sz ix -> ix
unSz Sz ix
sz) ix
ix)
    k :: Sz1
k = Ix1 -> Sz1
forall ix. Index ix => ix -> Sz ix
Sz (Sz ix -> Ix1
forall ix. Index ix => Sz ix -> Ix1
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 e ix (m :: * -> *).
(Manifest r e, Index ix, PrimMonad m) =>
Sz ix -> m (MArray (PrimState m) r ix e)
unsafeNew Sz ix
sz'
        Array r ix e
-> Ix1 -> MArray (PrimState (ST s)) r ix e -> Ix1 -> Sz1 -> ST s ()
forall r e ix' ix (m :: * -> *).
(Manifest r e, Index ix', Index ix, PrimMonad m) =>
Array r ix' e
-> Ix1 -> MArray (PrimState m) r ix e -> Ix1 -> Sz1 -> m ()
unsafeArrayLinearCopy Array r ix e
arr Ix1
0 MArray s r ix e
MArray (PrimState (ST s)) r ix e
marrCopied Ix1
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 :: * -> *).
(Manifest r e, Index ix, 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 e ix (m :: * -> *).
(Manifest r e, Index ix, 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 -> Ix1 -> Sz1 -> e -> ST s ()
forall r e ix (m :: * -> *).
(Manifest r e, Index ix, PrimMonad m) =>
MArray (PrimState m) r ix e -> Ix1 -> Sz1 -> e -> m ()
unsafeLinearSet MArray s r ix e
MArray (PrimState (ST s)) r ix e
marrGrown (Sz ix -> Ix1
forall ix. Index ix => Sz ix -> Ix1
totalElem Sz ix
sz) (Ix1 -> Sz1
forall ix. Index ix => ix -> Sz ix
Sz (Sz ix -> Ix1
forall ix. Index ix => Sz ix -> Ix1
totalElem Sz ix
sz' Ix1 -> Ix1 -> Ix1
forall a. Num a => a -> a -> a
- Sz ix -> Ix1
forall ix. Index ix => Sz ix -> Ix1
totalElem Sz ix
sz)) e
e
          MArray (PrimState (ST s)) r ix e -> Ix1 -> Sz1 -> e -> ST s ()
forall r e ix (m :: * -> *).
(Manifest r e, Index ix, PrimMonad m) =>
MArray (PrimState m) r ix e -> Ix1 -> Sz1 -> e -> m ()
unsafeLinearSet MArray s r ix e
MArray (PrimState (ST s)) r ix e
marrCopied (Sz ix -> Ix1
forall ix. Index ix => Sz ix -> Ix1
totalElem Sz ix
sz) (Ix1 -> Sz1
forall ix. Index ix => ix -> Sz ix
Sz (Sz ix -> Ix1
forall ix. Index ix => Sz ix -> Ix1
totalElem Sz ix
sz' Ix1 -> Ix1 -> Ix1
forall a. Num a => a -> a -> a
- Sz ix -> Ix1
forall ix. Index ix => Sz ix -> Ix1
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 e ix (m :: * -> *).
(Manifest r e, Index ix, PrimMonad m) =>
Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
unsafeFreeze (Array r ix e -> Comp
forall r ix e. Strategy r => 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 e ix (m :: * -> *).
(Manifest r e, Index ix, PrimMonad m) =>
Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
unsafeFreeze (Array r ix e -> Comp
forall r ix e. Strategy r => Array r ix e -> Comp
getComp Array r ix e
arr) MArray s r ix e
MArray (PrimState (ST s)) r ix e
marrGrown


prop_UnsafeLinearSliceMArray ::
     forall r ix e. (HasCallStack, Index ix, Manifest r e, Eq (Vector r e), Show (Vector r e))
  => Array r ix e
  -> Property
prop_UnsafeLinearSliceMArray :: Array r ix e -> Property
prop_UnsafeLinearSliceMArray Array r ix e
arr =
  Gen (Ix1, Sz1) -> ((Ix1, Sz1) -> Property) -> Property
forall a prop.
(Show a, Testable prop) =>
Gen a -> (a -> prop) -> Property
forAll Gen (Ix1, Sz1)
genLinearRegion (((Ix1, Sz1) -> Property) -> Property)
-> ((Ix1, Sz1) -> Property) -> Property
forall a b. (a -> b) -> a -> b
$ \(Ix1
i, Sz1
k) ->
    IO () -> Property
forall a. Testable a => IO a -> Property
propIO (IO () -> Property) -> IO () -> Property
forall a b. (a -> b) -> a -> b
$ do
      MArray RealWorld r ix e
marr <- Array r ix e -> IO (MArray (PrimState IO) r ix e)
forall r ix e (m :: * -> *).
(Manifest r e, Index ix, PrimMonad m) =>
Array r ix e -> m (MArray (PrimState m) r ix e)
thawS Array r ix e
arr
      Comp -> MArray (PrimState IO) r Ix1 e -> IO (Array r Ix1 e)
forall r e ix (m :: * -> *).
(Manifest r e, Index ix, PrimMonad m) =>
Comp -> MArray (PrimState m) r ix e -> m (Array r ix e)
unsafeFreeze Comp
Seq (Ix1 -> Sz1 -> MArray RealWorld r ix e -> MVector RealWorld r e
forall r e ix s.
(Manifest r e, Index ix) =>
Ix1 -> Sz1 -> MArray s r ix e -> MVector s r e
unsafeLinearSliceMArray Ix1
i Sz1
k MArray RealWorld r ix e
marr) IO (Array r Ix1 e) -> Array r Ix1 e -> IO ()
forall a. (HasCallStack, Show a, Eq a) => IO a -> a -> IO ()
`shouldReturn` Ix1 -> Sz1 -> Array r ix e -> Array r Ix1 e
forall r e ix.
(Source r e, Index ix) =>
Ix1 -> Sz1 -> Array r ix e -> Array r Ix1 e
unsafeLinearSlice Ix1
i Sz1
k Array r ix e
arr
  where
    n :: Ix1
n = Sz ix -> Ix1
forall ix. Index ix => Sz ix -> Ix1
totalElem (Array r ix e -> Sz ix
forall r ix e. Size r => Array r ix e -> Sz ix
size Array r ix e
arr)
    genLinearRegion :: Gen (Ix1, Sz1)
genLinearRegion = do
      Ix1
k <- (Ix1, Ix1) -> Gen Ix1
chooseInt (Ix1
0, Ix1
n)
      Ix1
i <- (Ix1, Ix1) -> Gen Ix1
chooseInt (Ix1
0, Ix1
n Ix1 -> Ix1 -> Ix1
forall a. Num a => a -> a -> a
- Ix1
k)
      (Ix1, Sz1) -> Gen (Ix1, Sz1)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Ix1
i, Ix1 -> Sz1
forall ix. Index ix => ix -> Sz ix
Sz Ix1
k)


unsafeMutableSpec ::
     forall r ix e.
     ( Eq (Vector r e)
     , Show (Vector r e)
     , Eq (Array r ix e)
     , Show (Array r ix e)
     , Manifest r e
     , Show e
     , Eq e
     , Load r ix e
     , Arbitrary e
     , Arbitrary ix
     , Typeable e
     )
  => Spec
unsafeMutableSpec :: Spec
unsafeMutableSpec =
  String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe (String
"Manifest (" 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 -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"UnsafeNewMsize" (Property -> Spec) -> Property -> Spec
forall a b. (a -> b) -> a -> b
$ (Arbitrary ix, Index ix, Manifest r e) => Property
forall r ix e. (Arbitrary ix, Index ix, Manifest r e) => Property
prop_UnsafeNewMsize @r @ix @e
    String -> Property -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"UnsafeNewLinearWriteRead" (Property -> Spec) -> Property -> Spec
forall a b. (a -> b) -> a -> b
$ (Eq e, Show e, Manifest r e, Index ix, Arbitrary ix,
 Arbitrary e) =>
Property
forall r ix e.
(Eq e, Show e, Manifest r e, Index ix, Arbitrary ix,
 Arbitrary e) =>
Property
prop_UnsafeNewLinearWriteRead @r @ix @e
    String -> (Array r ix e -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"UnsafeThawFreeze" ((Array r ix e -> Property) -> Spec)
-> (Array r ix e -> Property) -> Spec
forall a b. (a -> b) -> a -> b
$ (Eq (Array r ix e), Show (Array r ix e), Index ix, Manifest r e) =>
Array r ix e -> Property
forall r ix e.
(Eq (Array r ix e), Show (Array r ix e), Index ix, Manifest r e) =>
Array r ix e -> Property
prop_UnsafeThawFreeze @r @ix @e
    String -> Property -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"UnsafeInitializeNew" (Property -> Spec) -> Property -> Spec
forall a b. (a -> b) -> a -> b
$ (Eq (Array r ix e), Show (Array r ix e), Show e, Arbitrary e,
 Arbitrary ix, Index ix, Manifest r e) =>
Property
forall r ix e.
(Eq (Array r ix e), Show (Array r ix e), Show e, Arbitrary e,
 Arbitrary ix, Index ix, Manifest r e) =>
Property
prop_UnsafeInitializeNew @r @ix @e
    String
-> (Comp -> SzIx ix -> NonNegative Ix1 -> e -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"UnsafeLinearSet" ((Comp -> SzIx ix -> NonNegative Ix1 -> e -> Property) -> Spec)
-> (Comp -> SzIx ix -> NonNegative Ix1 -> e -> Property) -> Spec
forall a b. (a -> b) -> a -> b
$ (Eq (Vector r e), Show (Vector r e), Index ix, Manifest r e) =>
Comp -> SzIx ix -> NonNegative Ix1 -> e -> Property
forall r ix e.
(Eq (Vector r e), Show (Vector r e), Index ix, Manifest r e) =>
Comp -> SzIx ix -> NonNegative Ix1 -> e -> Property
prop_UnsafeLinearSet @r @ix @e
    String -> (Array r ix e -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"UnsafeLinearCopy" ((Array r ix e -> Property) -> Spec)
-> (Array r ix e -> Property) -> Spec
forall a b. (a -> b) -> a -> b
$ (Eq (Array r ix e), Show (Array r ix e), Index ix, Manifest r e) =>
Array r ix e -> Property
forall r ix e.
(Eq (Array r ix e), Show (Array r ix e), Index ix, Manifest r e) =>
Array r ix e -> Property
prop_UnsafeLinearCopy @r @ix @e
    String
-> (ArrIx r ix e -> NonNegative Ix1 -> Ix1 -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"UnsafeLinearCopyPart" ((ArrIx r ix e -> NonNegative Ix1 -> Ix1 -> Property) -> Spec)
-> (ArrIx r ix e -> NonNegative Ix1 -> Ix1 -> Property) -> Spec
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), Manifest r e, Index ix) =>
ArrIx r ix e -> NonNegative Ix1 -> Ix1 -> Property
forall r ix e.
(Eq (Vector r e), Show (Vector r e), Eq (Array r ix e),
 Show (Array r ix e), Manifest r e, Index ix) =>
ArrIx r ix e -> NonNegative Ix1 -> Ix1 -> Property
prop_UnsafeLinearCopyPart @r @ix @e
    String -> (Array r ix e -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"UnsafeArrayLinearCopy" ((Array r ix e -> Property) -> Spec)
-> (Array r ix e -> Property) -> Spec
forall a b. (a -> b) -> a -> b
$ (Eq (Array r ix e), Show (Array r ix e), Index ix, Manifest r e) =>
Array r ix e -> Property
forall r ix e.
(Eq (Array r ix e), Show (Array r ix e), Index ix, Manifest r e) =>
Array r ix e -> Property
prop_UnsafeArrayLinearCopy @r @ix @e
    String
-> (ArrIx r ix e -> NonNegative Ix1 -> Ix1 -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"UnsafeArrayLinearCopyPart" ((ArrIx r ix e -> NonNegative Ix1 -> Ix1 -> Property) -> Spec)
-> (ArrIx r ix e -> NonNegative Ix1 -> Ix1 -> Property) -> Spec
forall a b. (a -> b) -> a -> b
$ (Eq (Vector r e), Show (Vector r e), Index ix, Manifest r e) =>
ArrIx r ix e -> NonNegative Ix1 -> Ix1 -> Property
forall r ix e.
(Eq (Vector r e), Show (Vector r e), Index ix, Manifest r e) =>
ArrIx r ix e -> NonNegative Ix1 -> Ix1 -> Property
prop_UnsafeArrayLinearCopyPart @r @ix @e
    String -> (ArrIx r ix e -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"UnsafeLinearShrink" ((ArrIx r ix e -> Property) -> Spec)
-> (ArrIx r ix e -> Property) -> Spec
forall a b. (a -> b) -> a -> b
$ (Eq (Vector r e), Show (Vector r e), Manifest r e, Index ix) =>
ArrIx r ix e -> Property
forall r ix e.
(Eq (Vector r e), Show (Vector r e), Manifest r e, Index ix) =>
ArrIx r ix e -> Property
prop_UnsafeLinearShrink @r @ix @e
    String -> (ArrIx r ix e -> e -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"UnsafeLinearGrow" ((ArrIx r ix e -> e -> Property) -> Spec)
-> (ArrIx r ix e -> e -> Property) -> Spec
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), Manifest r e, Index ix) =>
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), Manifest r e, Index ix) =>
ArrIx r ix e -> e -> Property
prop_UnsafeLinearGrow @r @ix @e
    String -> (Array r ix e -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"UnsafeLinearSliceMArray" ((Array r ix e -> Property) -> Spec)
-> (Array r ix e -> Property) -> Spec
forall a b. (a -> b) -> a -> b
$ (HasCallStack, Index ix, Manifest r e, Eq (Vector r e),
 Show (Vector r e)) =>
Array r ix e -> Property
forall r ix e.
(HasCallStack, Index ix, Manifest r e, Eq (Vector r e),
 Show (Vector r e)) =>
Array r ix e -> Property
prop_UnsafeLinearSliceMArray @r @ix @e

unsafeMutableUnboxedSpec ::
     forall r ix e.
     ( Typeable e
     , Eq (Array r ix e)
     , Show (Array r ix e)
     , Index ix
     , Arbitrary ix
     , Manifest r e
     )
  => Spec
unsafeMutableUnboxedSpec :: Spec
unsafeMutableUnboxedSpec =
  String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe (String
"Manifest 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, Index ix,
 Manifest r e) =>
Property
forall r ix e.
(Eq (Array r ix e), Show (Array r ix e), Arbitrary ix, Index ix,
 Manifest r e) =>
Property
prop_UnsafeInitialize @r @ix @e