{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}

-- |
-- Module      : Data.Massiv.Array.Delayed.Interleaved
-- Copyright   : (c) Alexey Kuleshevich 2018-2022
-- License     : BSD3
-- Maintainer  : Alexey Kuleshevich <lehins@yandex.ru>
-- Stability   : experimental
-- Portability : non-portable
module Data.Massiv.Array.Delayed.Interleaved (
  DI (..),
  Array (..),
  toInterleaved,
  fromInterleaved,
) where

import Data.Massiv.Array.Delayed.Pull
import Data.Massiv.Core.Common
import Data.Massiv.Core.List (L, showArrayList, showsArrayPrec)

-- | Delayed array that will be loaded in an interleaved fashion during parallel
-- computation.
--
-- /Warning/ - Will be deprecated in the next major version update.
data DI = DI

newtype instance Array DI ix e = DIArray
  { forall ix e. Array DI ix e -> Array D ix e
diArray :: Array D ix e
  }
  deriving (Array DI ix e -> Array DI ix e -> Bool
(Array DI ix e -> Array DI ix e -> Bool)
-> (Array DI ix e -> Array DI ix e -> Bool) -> Eq (Array DI ix e)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall ix e.
(Index ix, Eq e) =>
Array DI ix e -> Array DI ix e -> Bool
$c== :: forall ix e.
(Index ix, Eq e) =>
Array DI ix e -> Array DI ix e -> Bool
== :: Array DI ix e -> Array DI ix e -> Bool
$c/= :: forall ix e.
(Index ix, Eq e) =>
Array DI ix e -> Array DI ix e -> Bool
/= :: Array DI ix e -> Array DI ix e -> Bool
Eq, Eq (Array DI ix e)
Eq (Array DI ix e) =>
(Array DI ix e -> Array DI ix e -> Ordering)
-> (Array DI ix e -> Array DI ix e -> Bool)
-> (Array DI ix e -> Array DI ix e -> Bool)
-> (Array DI ix e -> Array DI ix e -> Bool)
-> (Array DI ix e -> Array DI ix e -> Bool)
-> (Array DI ix e -> Array DI ix e -> Array DI ix e)
-> (Array DI ix e -> Array DI ix e -> Array DI ix e)
-> Ord (Array DI ix e)
Array DI ix e -> Array DI ix e -> Bool
Array DI ix e -> Array DI ix e -> Ordering
Array DI ix e -> Array DI ix e -> Array DI ix e
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall ix e. (Index ix, Ord e) => Eq (Array DI ix e)
forall ix e.
(Index ix, Ord e) =>
Array DI ix e -> Array DI ix e -> Bool
forall ix e.
(Index ix, Ord e) =>
Array DI ix e -> Array DI ix e -> Ordering
forall ix e.
(Index ix, Ord e) =>
Array DI ix e -> Array DI ix e -> Array DI ix e
$ccompare :: forall ix e.
(Index ix, Ord e) =>
Array DI ix e -> Array DI ix e -> Ordering
compare :: Array DI ix e -> Array DI ix e -> Ordering
$c< :: forall ix e.
(Index ix, Ord e) =>
Array DI ix e -> Array DI ix e -> Bool
< :: Array DI ix e -> Array DI ix e -> Bool
$c<= :: forall ix e.
(Index ix, Ord e) =>
Array DI ix e -> Array DI ix e -> Bool
<= :: Array DI ix e -> Array DI ix e -> Bool
$c> :: forall ix e.
(Index ix, Ord e) =>
Array DI ix e -> Array DI ix e -> Bool
> :: Array DI ix e -> Array DI ix e -> Bool
$c>= :: forall ix e.
(Index ix, Ord e) =>
Array DI ix e -> Array DI ix e -> Bool
>= :: Array DI ix e -> Array DI ix e -> Bool
$cmax :: forall ix e.
(Index ix, Ord e) =>
Array DI ix e -> Array DI ix e -> Array DI ix e
max :: Array DI ix e -> Array DI ix e -> Array DI ix e
$cmin :: forall ix e.
(Index ix, Ord e) =>
Array DI ix e -> Array DI ix e -> Array DI ix e
min :: Array DI ix e -> Array DI ix e -> Array DI ix e
Ord, (forall a b. (a -> b) -> Array DI ix a -> Array DI ix b)
-> (forall a b. a -> Array DI ix b -> Array DI ix a)
-> Functor (Array DI ix)
forall a b. a -> Array DI ix b -> Array DI ix a
forall a b. (a -> b) -> Array DI ix a -> Array DI ix b
forall ix a b. a -> Array DI ix b -> Array DI ix a
forall ix a b. (a -> b) -> Array DI ix a -> Array DI ix b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall ix a b. (a -> b) -> Array DI ix a -> Array DI ix b
fmap :: forall a b. (a -> b) -> Array DI ix a -> Array DI ix b
$c<$ :: forall ix a b. a -> Array DI ix b -> Array DI ix a
<$ :: forall a b. a -> Array DI ix b -> Array DI ix a
Functor, Functor (Array DI ix)
Functor (Array DI ix) =>
(forall a. a -> Array DI ix a)
-> (forall a b.
    Array DI ix (a -> b) -> Array DI ix a -> Array DI ix b)
-> (forall a b c.
    (a -> b -> c) -> Array DI ix a -> Array DI ix b -> Array DI ix c)
-> (forall a b. Array DI ix a -> Array DI ix b -> Array DI ix b)
-> (forall a b. Array DI ix a -> Array DI ix b -> Array DI ix a)
-> Applicative (Array DI ix)
forall a. a -> Array DI ix a
forall ix. Index ix => Functor (Array DI ix)
forall ix a. Index ix => a -> Array DI ix a
forall ix a b.
Index ix =>
Array DI ix a -> Array DI ix b -> Array DI ix a
forall ix a b.
Index ix =>
Array DI ix a -> Array DI ix b -> Array DI ix b
forall ix a b.
Index ix =>
Array DI ix (a -> b) -> Array DI ix a -> Array DI ix b
forall ix a b c.
Index ix =>
(a -> b -> c) -> Array DI ix a -> Array DI ix b -> Array DI ix c
forall a b. Array DI ix a -> Array DI ix b -> Array DI ix a
forall a b. Array DI ix a -> Array DI ix b -> Array DI ix b
forall a b. Array DI ix (a -> b) -> Array DI ix a -> Array DI ix b
forall a b c.
(a -> b -> c) -> Array DI ix a -> Array DI ix b -> Array DI ix c
forall (f :: * -> *).
Functor f =>
(forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
$cpure :: forall ix a. Index ix => a -> Array DI ix a
pure :: forall a. a -> Array DI ix a
$c<*> :: forall ix a b.
Index ix =>
Array DI ix (a -> b) -> Array DI ix a -> Array DI ix b
<*> :: forall a b. Array DI ix (a -> b) -> Array DI ix a -> Array DI ix b
$cliftA2 :: forall ix a b c.
Index ix =>
(a -> b -> c) -> Array DI ix a -> Array DI ix b -> Array DI ix c
liftA2 :: forall a b c.
(a -> b -> c) -> Array DI ix a -> Array DI ix b -> Array DI ix c
$c*> :: forall ix a b.
Index ix =>
Array DI ix a -> Array DI ix b -> Array DI ix b
*> :: forall a b. Array DI ix a -> Array DI ix b -> Array DI ix b
$c<* :: forall ix a b.
Index ix =>
Array DI ix a -> Array DI ix b -> Array DI ix a
<* :: forall a b. Array DI ix a -> Array DI ix b -> Array DI ix a
Applicative, (forall m. Monoid m => Array DI ix m -> m)
-> (forall m a. Monoid m => (a -> m) -> Array DI ix a -> m)
-> (forall m a. Monoid m => (a -> m) -> Array DI ix a -> m)
-> (forall a b. (a -> b -> b) -> b -> Array DI ix a -> b)
-> (forall a b. (a -> b -> b) -> b -> Array DI ix a -> b)
-> (forall b a. (b -> a -> b) -> b -> Array DI ix a -> b)
-> (forall b a. (b -> a -> b) -> b -> Array DI ix a -> b)
-> (forall a. (a -> a -> a) -> Array DI ix a -> a)
-> (forall a. (a -> a -> a) -> Array DI ix a -> a)
-> (forall a. Array DI ix a -> [a])
-> (forall a. Array DI ix a -> Bool)
-> (forall a. Array DI ix a -> Int)
-> (forall a. Eq a => a -> Array DI ix a -> Bool)
-> (forall a. Ord a => Array DI ix a -> a)
-> (forall a. Ord a => Array DI ix a -> a)
-> (forall a. Num a => Array DI ix a -> a)
-> (forall a. Num a => Array DI ix a -> a)
-> Foldable (Array DI ix)
forall a. Eq a => a -> Array DI ix a -> Bool
forall a. Num a => Array DI ix a -> a
forall a. Ord a => Array DI ix a -> a
forall m. Monoid m => Array DI ix m -> m
forall ix a. (Index ix, Eq a) => a -> Array DI ix a -> Bool
forall ix a. (Index ix, Num a) => Array DI ix a -> a
forall ix a. (Index ix, Ord a) => Array DI ix a -> a
forall ix m. (Index ix, Monoid m) => Array DI ix m -> m
forall ix a. Index ix => Array DI ix a -> Bool
forall ix a. Index ix => Array DI ix a -> Int
forall ix a. Index ix => Array DI ix a -> [a]
forall ix a. Index ix => (a -> a -> a) -> Array DI ix a -> a
forall ix m a.
(Index ix, Monoid m) =>
(a -> m) -> Array DI ix a -> m
forall ix b a. Index ix => (b -> a -> b) -> b -> Array DI ix a -> b
forall ix a b. Index ix => (a -> b -> b) -> b -> Array DI ix a -> b
forall a. Array DI ix a -> Bool
forall a. Array DI ix a -> Int
forall a. Array DI ix a -> [a]
forall a. (a -> a -> a) -> Array DI ix a -> a
forall m a. Monoid m => (a -> m) -> Array DI ix a -> m
forall b a. (b -> a -> b) -> b -> Array DI ix a -> b
forall a b. (a -> b -> b) -> b -> Array DI ix a -> b
forall (t :: * -> *).
(forall m. Monoid m => t m -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. t a -> [a])
-> (forall a. t a -> Bool)
-> (forall a. t a -> Int)
-> (forall a. Eq a => a -> t a -> Bool)
-> (forall a. Ord a => t a -> a)
-> (forall a. Ord a => t a -> a)
-> (forall a. Num a => t a -> a)
-> (forall a. Num a => t a -> a)
-> Foldable t
$cfold :: forall ix m. (Index ix, Monoid m) => Array DI ix m -> m
fold :: forall m. Monoid m => Array DI ix m -> m
$cfoldMap :: forall ix m a.
(Index ix, Monoid m) =>
(a -> m) -> Array DI ix a -> m
foldMap :: forall m a. Monoid m => (a -> m) -> Array DI ix a -> m
$cfoldMap' :: forall ix m a.
(Index ix, Monoid m) =>
(a -> m) -> Array DI ix a -> m
foldMap' :: forall m a. Monoid m => (a -> m) -> Array DI ix a -> m
$cfoldr :: forall ix a b. Index ix => (a -> b -> b) -> b -> Array DI ix a -> b
foldr :: forall a b. (a -> b -> b) -> b -> Array DI ix a -> b
$cfoldr' :: forall ix a b. Index ix => (a -> b -> b) -> b -> Array DI ix a -> b
foldr' :: forall a b. (a -> b -> b) -> b -> Array DI ix a -> b
$cfoldl :: forall ix b a. Index ix => (b -> a -> b) -> b -> Array DI ix a -> b
foldl :: forall b a. (b -> a -> b) -> b -> Array DI ix a -> b
$cfoldl' :: forall ix b a. Index ix => (b -> a -> b) -> b -> Array DI ix a -> b
foldl' :: forall b a. (b -> a -> b) -> b -> Array DI ix a -> b
$cfoldr1 :: forall ix a. Index ix => (a -> a -> a) -> Array DI ix a -> a
foldr1 :: forall a. (a -> a -> a) -> Array DI ix a -> a
$cfoldl1 :: forall ix a. Index ix => (a -> a -> a) -> Array DI ix a -> a
foldl1 :: forall a. (a -> a -> a) -> Array DI ix a -> a
$ctoList :: forall ix a. Index ix => Array DI ix a -> [a]
toList :: forall a. Array DI ix a -> [a]
$cnull :: forall ix a. Index ix => Array DI ix a -> Bool
null :: forall a. Array DI ix a -> Bool
$clength :: forall ix a. Index ix => Array DI ix a -> Int
length :: forall a. Array DI ix a -> Int
$celem :: forall ix a. (Index ix, Eq a) => a -> Array DI ix a -> Bool
elem :: forall a. Eq a => a -> Array DI ix a -> Bool
$cmaximum :: forall ix a. (Index ix, Ord a) => Array DI ix a -> a
maximum :: forall a. Ord a => Array DI ix a -> a
$cminimum :: forall ix a. (Index ix, Ord a) => Array DI ix a -> a
minimum :: forall a. Ord a => Array DI ix a -> a
$csum :: forall ix a. (Index ix, Num a) => Array DI ix a -> a
sum :: forall a. Num a => Array DI ix a -> a
$cproduct :: forall ix a. (Index ix, Num a) => Array DI ix a -> a
product :: forall a. Num a => Array DI ix a -> a
Foldable)

instance (Ragged L ix e, Show e) => Show (Array DI ix e) where
  showsPrec :: Int -> Array DI ix e -> ShowS
showsPrec = (Array DI ix e -> Array D ix e) -> Int -> Array DI ix e -> ShowS
forall r r' ix e.
(Ragged L ix e, Load r ix e, Load r' ix e, Source r' e, Show e) =>
(Array r ix e -> Array r' ix e) -> Int -> Array r ix e -> ShowS
showsArrayPrec Array DI ix e -> Array D ix e
forall ix e. Array DI ix e -> Array D ix e
diArray
  showList :: [Array DI ix e] -> ShowS
showList = [Array DI ix e] -> ShowS
forall arr. Show arr => [arr] -> ShowS
showArrayList

instance Strategy DI where
  setComp :: forall ix e. Comp -> Array DI ix e -> Array DI ix e
setComp Comp
c Array DI ix e
arr = Array DI ix e
arr{diArray = (diArray arr){dComp = c}}
  {-# INLINE setComp #-}
  getComp :: forall ix e. Array DI ix e -> Comp
getComp = Array D ix e -> Comp
forall ix e. Array D ix e -> Comp
dComp (Array D ix e -> Comp)
-> (Array DI ix e -> Array D ix e) -> Array DI ix e -> Comp
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array DI ix e -> Array D ix e
forall ix e. Array DI ix e -> Array D ix e
diArray
  {-# INLINE getComp #-}
  repr :: DI
repr = DI
DI

instance Index ix => Shape DI ix where
  maxLinearSize :: forall e. Array DI ix e -> Maybe Sz1
maxLinearSize = Sz1 -> Maybe Sz1
forall a. a -> Maybe a
Just (Sz1 -> Maybe Sz1)
-> (Array DI ix e -> Sz1) -> Array DI ix e -> Maybe Sz1
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Sz1
forall ix. ix -> Sz ix
SafeSz (Int -> Sz1) -> (Array DI ix e -> Int) -> Array DI ix e -> Sz1
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array DI ix e -> Int
forall ix r e. (Index ix, Size r) => Array r ix e -> Int
elemsCount
  {-# INLINE maxLinearSize #-}

instance Size DI where
  size :: forall ix e. Array DI ix e -> Sz ix
size (DIArray Array D ix e
arr) = Array D ix e -> Sz ix
forall r ix e. Size r => Array r ix e -> Sz ix
forall ix e. Array D ix e -> Sz ix
size Array D ix e
arr
  {-# INLINE size #-}
  unsafeResize :: forall ix ix' e.
(Index ix, Index ix') =>
Sz ix' -> Array DI ix e -> Array DI ix' e
unsafeResize Sz ix'
sz = Array D ix' e -> Array DI ix' e
forall ix e. Array D ix e -> Array DI ix e
DIArray (Array D ix' e -> Array DI ix' e)
-> (Array DI ix e -> Array D ix' e)
-> Array DI ix e
-> Array DI ix' e
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Sz ix' -> Array D ix e -> Array D ix' e
forall r ix ix' e.
(Size r, Index ix, Index ix') =>
Sz ix' -> Array r ix e -> Array r ix' e
forall ix ix' e.
(Index ix, Index ix') =>
Sz ix' -> Array D ix e -> Array D ix' e
unsafeResize Sz ix'
sz (Array D ix e -> Array D ix' e)
-> (Array DI ix e -> Array D ix e)
-> Array DI ix e
-> Array D ix' e
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array DI ix e -> Array D ix e
forall ix e. Array DI ix e -> Array D ix e
diArray
  {-# INLINE unsafeResize #-}

instance Index ix => Load DI ix e where
  makeArray :: Comp -> Sz ix -> (ix -> e) -> Array DI ix e
makeArray Comp
c Sz ix
sz = Array D ix e -> Array DI ix e
forall ix e. Array D ix e -> Array DI ix e
DIArray (Array D ix e -> Array DI ix e)
-> ((ix -> e) -> Array D ix e) -> (ix -> e) -> Array DI ix e
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Comp -> Sz ix -> (ix -> e) -> Array D ix e
forall r ix e.
Load r ix e =>
Comp -> Sz ix -> (ix -> e) -> Array r ix e
makeArray Comp
c Sz ix
sz
  {-# INLINE makeArray #-}
  iterArrayLinearST_ :: forall s.
Scheduler s () -> Array DI ix e -> (Int -> e -> ST s ()) -> ST s ()
iterArrayLinearST_ Scheduler s ()
scheduler (DIArray darr :: Array D ix e
darr@(DArray Comp
_ Sz ix
sz PrefIndex ix e
_)) Int -> e -> ST s ()
uWrite =
    Int -> (Int -> Bool) -> (Int -> Int) -> (Int -> ST s ()) -> ST s ()
forall (f :: * -> *) a.
Applicative f =>
Int -> (Int -> Bool) -> (Int -> Int) -> (Int -> f a) -> f ()
loopA_ Int
0 (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Scheduler s () -> Int
forall s a. Scheduler s a -> Int
numWorkers Scheduler s ()
scheduler) (Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) ((Int -> ST s ()) -> ST s ()) -> (Int -> ST s ()) -> ST s ()
forall a b. (a -> b) -> a -> b
$ \ !Int
start ->
      Scheduler s () -> ST s () -> ST s ()
forall s (m :: * -> *).
MonadPrimBase s m =>
Scheduler s () -> m () -> m ()
scheduleWork_ Scheduler s ()
scheduler (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$
        Sz ix
-> Int
-> Int
-> Int
-> (Int -> Int -> Bool)
-> (Int -> ix -> ST s ())
-> ST s ()
forall ix (m :: * -> *).
(Index ix, Monad m) =>
Sz ix
-> Int
-> Int
-> Int
-> (Int -> Int -> Bool)
-> (Int -> ix -> m ())
-> m ()
iterLinearM_ Sz ix
sz Int
start (Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem Sz ix
sz) (Scheduler s () -> Int
forall s a. Scheduler s a -> Int
numWorkers Scheduler s ()
scheduler) Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
(<) ((Int -> ix -> ST s ()) -> ST s ())
-> (Int -> ix -> ST s ()) -> ST s ()
forall a b. (a -> b) -> a -> b
$ \ !Int
k ->
          Int -> e -> ST s ()
uWrite Int
k (e -> ST s ()) -> (ix -> e) -> ix -> ST s ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array D ix e -> ix -> e
forall ix. Index ix => Array D ix e -> ix -> e
forall r e ix. (Source r e, Index ix) => Array r ix e -> ix -> e
unsafeIndex Array D ix e
darr
  {-# INLINE iterArrayLinearST_ #-}

instance Index ix => StrideLoad DI ix e where
  iterArrayLinearWithStrideST_ :: forall s.
Scheduler s ()
-> Stride ix
-> Sz ix
-> Array DI ix e
-> (Int -> e -> ST s ())
-> ST s ()
iterArrayLinearWithStrideST_ Scheduler s ()
scheduler Stride ix
stride Sz ix
resultSize (DIArray Array D ix e
arr) Int -> e -> ST s ()
uWrite =
    Int -> (Int -> Bool) -> (Int -> Int) -> (Int -> ST s ()) -> ST s ()
forall (f :: * -> *) a.
Applicative f =>
Int -> (Int -> Bool) -> (Int -> Int) -> (Int -> f a) -> f ()
loopA_ Int
0 (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Scheduler s () -> Int
forall s a. Scheduler s a -> Int
numWorkers Scheduler s ()
scheduler) (Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) ((Int -> ST s ()) -> ST s ()) -> (Int -> ST s ()) -> ST s ()
forall a b. (a -> b) -> a -> b
$ \ !Int
start ->
      Scheduler s () -> ST s () -> ST s ()
forall s (m :: * -> *).
MonadPrimBase s m =>
Scheduler s () -> m () -> m ()
scheduleWork_ Scheduler s ()
scheduler (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$
        Sz ix
-> Int
-> Int
-> Int
-> (Int -> Int -> Bool)
-> (Int -> ix -> ST s ())
-> ST s ()
forall ix (m :: * -> *).
(Index ix, Monad m) =>
Sz ix
-> Int
-> Int
-> Int
-> (Int -> Int -> Bool)
-> (Int -> ix -> m ())
-> m ()
iterLinearM_ Sz ix
resultSize Int
start (Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem Sz ix
resultSize) (Scheduler s () -> Int
forall s a. Scheduler s a -> Int
numWorkers Scheduler s ()
scheduler) Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
(<) ((Int -> ix -> ST s ()) -> ST s ())
-> (Int -> ix -> ST s ()) -> ST s ()
forall a b. (a -> b) -> a -> b
$
          \ !Int
i ix
ix -> Int -> e -> ST s ()
uWrite Int
i (Array D ix e -> ix -> e
forall ix. Index ix => Array D ix e -> ix -> e
forall r e ix. (Source r e, Index ix) => Array r ix e -> ix -> e
unsafeIndex Array D ix e
arr ((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
(*) (Stride ix -> ix
forall ix. Stride ix -> ix
unStride Stride ix
stride) ix
ix))
  {-# INLINE iterArrayLinearWithStrideST_ #-}

-- | Convert a source array into an array that, when computed, will have its elemets evaluated out
-- of order (interleaved amongst cores), hence making unbalanced computation better parallelizable.
toInterleaved :: (Index ix, Source r e) => Array r ix e -> Array DI ix e
toInterleaved :: forall ix r e.
(Index ix, Source r e) =>
Array r ix e -> Array DI ix e
toInterleaved = Array D ix e -> Array DI ix e
forall ix e. Array D ix e -> Array DI ix e
DIArray (Array D ix e -> Array DI ix e)
-> (Array r ix e -> Array D ix e) -> Array r ix e -> Array DI ix e
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array r ix e -> Array D ix e
forall ix r e.
(Index ix, Source r e) =>
Array r ix e -> Array D ix e
delay
{-# INLINE toInterleaved #-}

-- | /O(1)/ - Unwrap the interleved array.
--
-- @since 0.2.1
fromInterleaved :: Array DI ix e -> Array D ix e
fromInterleaved :: forall ix e. Array DI ix e -> Array D ix e
fromInterleaved = Array DI ix e -> Array D ix e
forall ix e. Array DI ix e -> Array D ix e
diArray
{-# INLINE fromInterleaved #-}