{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
module Data.Massiv.Array.Ops.Construct
(
empty
, singleton
, replicate
, makeArray
, makeArrayLinear
, makeArrayR
, makeArrayLinearR
, makeVectorR
, iterateN
, iiterateN
, unfoldlS_
, iunfoldlS_
, unfoldrS_
, iunfoldrS_
, randomArray
, randomArrayS
, randomArrayWS
, makeArrayA
, makeArrayAR
, makeArrayLinearA
, (...)
, (..:)
, range
, rangeStepM
, rangeStep'
, rangeInclusive
, rangeStepInclusiveM
, rangeStepInclusive'
, rangeSize
, rangeStepSize
, enumFromN
, enumFromStepN
, expandWithin
, expandWithinM
, expandWithin'
, expandOuter
, expandInner
) where
import Control.Applicative hiding (empty)
import Control.Monad (when, void)
import Control.Monad.ST
import Data.Massiv.Array.Delayed.Pull
import Data.Massiv.Array.Delayed.Push
import Data.Massiv.Array.Mutable
import Data.Massiv.Core.Common
import Prelude hiding (enumFromTo, replicate)
makeArrayR :: Construct r ix e => r -> Comp -> Sz ix -> (ix -> e) -> Array r ix e
makeArrayR :: r -> Comp -> Sz ix -> (ix -> e) -> Array r ix e
makeArrayR r
_ = Comp -> Sz ix -> (ix -> e) -> Array r ix e
forall r ix e.
Construct r ix e =>
Comp -> Sz ix -> (ix -> e) -> Array r ix e
makeArray
{-# INLINE makeArrayR #-}
makeArrayLinearR :: Construct r ix e => r -> Comp -> Sz ix -> (Int -> e) -> Array r ix e
makeArrayLinearR :: r -> Comp -> Sz ix -> (Int -> e) -> Array r ix e
makeArrayLinearR r
_ = Comp -> Sz ix -> (Int -> e) -> Array r ix e
forall r ix e.
Construct r ix e =>
Comp -> Sz ix -> (Int -> e) -> Array r ix e
makeArrayLinear
{-# INLINE makeArrayLinearR #-}
makeVectorR :: Construct r Ix1 e => r -> Comp -> Sz1 -> (Ix1 -> e) -> Array r Ix1 e
makeVectorR :: r -> Comp -> Sz1 -> (Int -> e) -> Array r Int e
makeVectorR r
_ = Comp -> Sz1 -> (Int -> e) -> Array r Int e
forall r ix e.
Construct r ix e =>
Comp -> Sz ix -> (ix -> e) -> Array r ix e
makeArray
{-# INLINE makeVectorR #-}
newtype STA r ix a = STA {STA r ix a -> forall s. MArray s r ix a -> ST s (Array r ix a)
_runSTA :: forall s. MArray s r ix a -> ST s (Array r ix a)}
runSTA :: Mutable r ix e => Sz ix -> STA r ix e -> Array r ix e
runSTA :: Sz ix -> STA r ix e -> Array r ix e
runSTA !Sz ix
sz (STA forall s. MArray s r ix e -> ST s (Array r ix e)
m) = (forall s. ST s (Array r ix e)) -> Array r ix e
forall a. (forall s. ST s a) -> a
runST (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 ST s (MArray s r ix e)
-> (MArray s r ix e -> ST s (Array r ix e)) -> ST s (Array r ix e)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= MArray s r ix e -> ST s (Array r ix e)
forall s. MArray s r ix e -> ST s (Array r ix e)
m)
{-# INLINE runSTA #-}
makeArrayA ::
forall r ix e f. (Mutable r ix e, Applicative f)
=> Sz ix
-> (ix -> f e)
-> f (Array r ix e)
makeArrayA :: Sz ix -> (ix -> f e) -> f (Array r ix e)
makeArrayA !Sz ix
sz ix -> f e
f =
let n :: Int
n = Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem Sz ix
sz
go :: Int -> f (STA r ix e)
go !Int
i
| Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
n =
(e -> STA r ix e -> STA r ix e)
-> f e -> f (STA r ix e) -> f (STA r ix e)
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2
(\e
e (STA forall s. MArray s r ix e -> ST s (Array r ix e)
st) -> (forall s. MArray s r ix e -> ST s (Array r ix e)) -> STA r ix e
forall r ix a.
(forall s. MArray s r ix a -> ST s (Array r ix a)) -> STA r ix a
STA (\MArray s r ix e
ma -> MArray (PrimState (ST s)) r ix e -> Int -> e -> ST s ()
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> Int -> e -> m ()
unsafeLinearWrite MArray s r ix e
MArray (PrimState (ST s)) r ix e
ma Int
i e
e ST s () -> ST s (Array r ix e) -> ST s (Array r ix e)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> MArray s r ix e -> ST s (Array r ix e)
forall s. MArray s r ix e -> ST s (Array r ix e)
st MArray s r ix e
ma))
(ix -> f e
f (Sz ix -> Int -> ix
forall ix. Index ix => Sz ix -> Int -> ix
fromLinearIndex Sz ix
sz Int
i))
(Int -> f (STA r ix e)
go (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1))
| Bool
otherwise = STA r ix e -> f (STA r ix e)
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((forall s. MArray s r ix e -> ST s (Array r ix e)) -> STA r ix e
forall r ix a.
(forall s. MArray s r ix a -> ST s (Array r ix a)) -> STA r ix a
STA (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
Seq))
in Sz ix -> STA r ix e -> Array r ix e
forall r ix e.
Mutable r ix e =>
Sz ix -> STA r ix e -> Array r ix e
runSTA Sz ix
sz (STA r ix e -> Array r ix e) -> f (STA r ix e) -> f (Array r ix e)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> f (STA r ix e)
go Int
0
{-# INLINE makeArrayA #-}
makeArrayLinearA ::
forall r ix e f. (Mutable r ix e, Applicative f)
=> Sz ix
-> (Int -> f e)
-> f (Array r ix e)
makeArrayLinearA :: Sz ix -> (Int -> f e) -> f (Array r ix e)
makeArrayLinearA !Sz ix
sz Int -> f e
f =
let n :: Int
n = Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem Sz ix
sz
go :: Int -> f (STA r ix e)
go !Int
i
| Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
n =
(e -> STA r ix e -> STA r ix e)
-> f e -> f (STA r ix e) -> f (STA r ix e)
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (\e
e (STA forall s. MArray s r ix e -> ST s (Array r ix e)
st) -> (forall s. MArray s r ix e -> ST s (Array r ix e)) -> STA r ix e
forall r ix a.
(forall s. MArray s r ix a -> ST s (Array r ix a)) -> STA r ix a
STA (\MArray s r ix e
ma -> MArray (PrimState (ST s)) r ix e -> Int -> e -> ST s ()
forall r ix e (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
MArray (PrimState m) r ix e -> Int -> e -> m ()
unsafeLinearWrite MArray s r ix e
MArray (PrimState (ST s)) r ix e
ma Int
i e
e ST s () -> ST s (Array r ix e) -> ST s (Array r ix e)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> MArray s r ix e -> ST s (Array r ix e)
forall s. MArray s r ix e -> ST s (Array r ix e)
st MArray s r ix e
ma)) (Int -> f e
f Int
i) (Int -> f (STA r ix e)
go (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1))
| Bool
otherwise = STA r ix e -> f (STA r ix e)
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((forall s. MArray s r ix e -> ST s (Array r ix e)) -> STA r ix e
forall r ix a.
(forall s. MArray s r ix a -> ST s (Array r ix a)) -> STA r ix a
STA (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
Seq))
in Sz ix -> STA r ix e -> Array r ix e
forall r ix e.
Mutable r ix e =>
Sz ix -> STA r ix e -> Array r ix e
runSTA Sz ix
sz (STA r ix e -> Array r ix e) -> f (STA r ix e) -> f (Array r ix e)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> f (STA r ix e)
go Int
0
{-# INLINE makeArrayLinearA #-}
makeArrayAR ::
forall r ix e f. (Mutable r ix e, Applicative f)
=> r
-> Sz ix
-> (ix -> f e)
-> f (Array r ix e)
makeArrayAR :: r -> Sz ix -> (ix -> f e) -> f (Array r ix e)
makeArrayAR r
_ = Sz ix -> (ix -> f e) -> f (Array r ix e)
forall r ix e (f :: * -> *).
(Mutable r ix e, Applicative f) =>
Sz ix -> (ix -> f e) -> f (Array r ix e)
makeArrayA
{-# INLINE makeArrayAR #-}
iterateN :: forall ix e . Index ix => Sz ix -> (e -> e) -> e -> Array DL ix e
iterateN :: Sz ix -> (e -> e) -> e -> Array DL ix e
iterateN Sz ix
sz e -> e
f = Sz ix -> (e -> (e, e)) -> e -> Array DL ix e
forall ix e a.
Construct DL ix e =>
Sz ix -> (a -> (e, a)) -> a -> Array DL ix e
unfoldrS_ Sz ix
sz ((e -> (e, e)) -> e -> Array DL ix e)
-> (e -> (e, e)) -> e -> Array DL ix e
forall a b. (a -> b) -> a -> b
$ \e
a -> let !a' :: e
a' = e -> e
f e
a in (e
a', e
a')
{-# INLINE iterateN #-}
iiterateN :: forall ix e . Index ix => Sz ix -> (e -> ix -> e) -> e -> Array DL ix e
iiterateN :: Sz ix -> (e -> ix -> e) -> e -> Array DL ix e
iiterateN Sz ix
sz e -> ix -> e
f = Sz ix -> (e -> ix -> (e, e)) -> e -> Array DL ix e
forall ix e a.
Construct DL ix e =>
Sz ix -> (a -> ix -> (e, a)) -> a -> Array DL ix e
iunfoldrS_ Sz ix
sz ((e -> ix -> (e, e)) -> e -> Array DL ix e)
-> (e -> ix -> (e, e)) -> e -> Array DL ix e
forall a b. (a -> b) -> a -> b
$ \e
a ix
ix -> let !a' :: e
a' = e -> ix -> e
f e
a ix
ix in (e
a', e
a')
{-# INLINE iiterateN #-}
unfoldrS_ :: forall ix e a . Construct DL ix e => Sz ix -> (a -> (e, a)) -> a -> Array DL ix e
unfoldrS_ :: Sz ix -> (a -> (e, a)) -> a -> Array DL ix e
unfoldrS_ Sz ix
sz a -> (e, a)
f = Sz ix -> (a -> ix -> (e, a)) -> a -> Array DL ix e
forall ix e a.
Construct DL ix e =>
Sz ix -> (a -> ix -> (e, a)) -> a -> Array DL ix e
iunfoldrS_ Sz ix
sz (\a
a ix
_ -> a -> (e, a)
f a
a)
{-# INLINE unfoldrS_ #-}
iunfoldrS_ ::
forall ix e a. Construct DL ix e
=> Sz ix
-> (a -> ix -> (e, a))
-> a
-> Array DL ix e
iunfoldrS_ :: Sz ix -> (a -> ix -> (e, a)) -> a -> Array DL ix e
iunfoldrS_ Sz ix
sz a -> ix -> (e, a)
f a
acc0 = DLArray :: forall ix e.
Comp
-> Sz ix
-> (forall (m :: * -> *).
Monad m =>
Scheduler m ()
-> Int -> (Int -> e -> m ()) -> (Int -> Sz1 -> e -> m ()) -> m ())
-> Array DL ix e
DLArray {dlComp :: Comp
dlComp = Comp
Seq, dlSize :: Sz ix
dlSize = Sz ix
sz, dlLoad :: forall (m :: * -> *).
Monad m =>
Scheduler m ()
-> Int -> (Int -> e -> m ()) -> (Int -> Sz1 -> e -> m ()) -> m ()
dlLoad = forall (m :: * -> *).
Monad m =>
Scheduler m ()
-> Int -> (Int -> e -> m ()) -> (Int -> Sz1 -> e -> m ()) -> m ()
load}
where
load :: Monad m =>
Scheduler m () -> Ix1 -> (Ix1 -> e -> m ()) -> (Ix1 -> Sz1 -> e -> m ()) -> m ()
load :: Scheduler m ()
-> Int -> (Int -> e -> m ()) -> (Int -> Sz1 -> e -> m ()) -> m ()
load Scheduler m ()
_ Int
startAt Int -> e -> m ()
dlWrite Int -> Sz1 -> e -> m ()
_ =
m a -> m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (m a -> m ()) -> m a -> m ()
forall a b. (a -> b) -> a -> b
$
Int
-> (Int -> Bool) -> (Int -> Int) -> a -> (Int -> a -> m a) -> m a
forall (m :: * -> *) a.
Monad m =>
Int
-> (Int -> Bool) -> (Int -> Int) -> a -> (Int -> a -> m a) -> m a
loopM Int
startAt (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< 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
startAt) (Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) a
acc0 ((Int -> a -> m a) -> m a) -> (Int -> a -> m a) -> m a
forall a b. (a -> b) -> a -> b
$ \ !Int
i !a
acc ->
let (e
e, a
acc') = a -> ix -> (e, a)
f a
acc (ix -> (e, a)) -> ix -> (e, a)
forall a b. (a -> b) -> a -> b
$ Sz ix -> Int -> ix
forall ix. Index ix => Sz ix -> Int -> ix
fromLinearIndex Sz ix
sz (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
startAt)
in a
acc' a -> m () -> m a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Int -> e -> m ()
dlWrite Int
i e
e
{-# INLINE load #-}
{-# INLINE iunfoldrS_ #-}
unfoldlS_ :: Construct DL ix e => Sz ix -> (a -> (a, e)) -> a -> Array DL ix e
unfoldlS_ :: Sz ix -> (a -> (a, e)) -> a -> Array DL ix e
unfoldlS_ Sz ix
sz a -> (a, e)
f = Sz ix -> (ix -> a -> (a, e)) -> a -> Array DL ix e
forall ix e a.
Construct DL ix e =>
Sz ix -> (ix -> a -> (a, e)) -> a -> Array DL ix e
iunfoldlS_ Sz ix
sz ((a -> (a, e)) -> ix -> a -> (a, e)
forall a b. a -> b -> a
const a -> (a, e)
f)
{-# INLINE unfoldlS_ #-}
iunfoldlS_ ::
forall ix e a. Construct DL ix e
=> Sz ix
-> (ix -> a -> (a, e))
-> a
-> Array DL ix e
iunfoldlS_ :: Sz ix -> (ix -> a -> (a, e)) -> a -> Array DL ix e
iunfoldlS_ Sz ix
sz ix -> a -> (a, e)
f a
acc0 = DLArray :: forall ix e.
Comp
-> Sz ix
-> (forall (m :: * -> *).
Monad m =>
Scheduler m ()
-> Int -> (Int -> e -> m ()) -> (Int -> Sz1 -> e -> m ()) -> m ())
-> Array DL ix e
DLArray {dlComp :: Comp
dlComp = Comp
Seq, dlSize :: Sz ix
dlSize = Sz ix
sz, dlLoad :: forall (m :: * -> *).
Monad m =>
Scheduler m ()
-> Int -> (Int -> e -> m ()) -> (Int -> Sz1 -> e -> m ()) -> m ()
dlLoad = forall (m :: * -> *).
Monad m =>
Scheduler m ()
-> Int -> (Int -> e -> m ()) -> (Int -> Sz1 -> e -> m ()) -> m ()
load}
where
load :: Monad m =>
Scheduler m () -> Ix1 -> (Ix1 -> e -> m ()) -> (Ix1 -> Sz1 -> e -> m ()) -> m ()
load :: Scheduler m ()
-> Int -> (Int -> e -> m ()) -> (Int -> Sz1 -> e -> m ()) -> m ()
load Scheduler m ()
_ Int
startAt Int -> e -> m ()
dlWrite Int -> Sz1 -> e -> m ()
_ =
m a -> m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (m a -> m ()) -> m a -> m ()
forall a b. (a -> b) -> a -> b
$
Int
-> (Int -> Bool) -> (Int -> Int) -> a -> (Int -> a -> m a) -> m a
forall (m :: * -> *) a.
Monad m =>
Int
-> (Int -> Bool) -> (Int -> Int) -> a -> (Int -> a -> m a) -> m a
loopDeepM Int
startAt (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< 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
startAt) (Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) a
acc0 ((Int -> a -> m a) -> m a) -> (Int -> a -> m a) -> m a
forall a b. (a -> b) -> a -> b
$ \ !Int
i !a
acc ->
let (a
acc', e
e) = ix -> a -> (a, e)
f (Sz ix -> Int -> ix
forall ix. Index ix => Sz ix -> Int -> ix
fromLinearIndex Sz ix
sz (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
startAt)) a
acc
in a
acc' a -> m () -> m a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Int -> e -> m ()
dlWrite Int
i e
e
{-# INLINE load #-}
{-# INLINE iunfoldlS_ #-}
randomArray ::
forall ix e g. Index ix
=> g
-> (g -> (g, g))
-> (g -> (e, g))
-> Comp
-> Sz ix
-> Array DL ix e
randomArray :: g
-> (g -> (g, g)) -> (g -> (e, g)) -> Comp -> Sz ix -> Array DL ix e
randomArray g
gen g -> (g, g)
splitGen g -> (e, g)
nextRandom Comp
comp Sz ix
sz = Comp
-> Sz ix
-> Maybe e
-> (forall (m :: * -> *).
Monad m =>
Scheduler m () -> Int -> (Int -> e -> m ()) -> m ())
-> Array DL ix e
forall ix e.
Index ix =>
Comp
-> Sz ix
-> Maybe e
-> (forall (m :: * -> *).
Monad m =>
Scheduler m () -> Int -> (Int -> e -> m ()) -> m ())
-> Array DL ix e
unsafeMakeLoadArray Comp
comp Sz ix
sz Maybe e
forall a. Maybe a
Nothing forall (m :: * -> *).
Monad m =>
Scheduler m () -> Int -> (Int -> e -> m ()) -> m ()
load
where
!totalLength :: Int
totalLength = Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem Sz ix
sz
load :: Monad m => Scheduler m () -> Int -> (Int -> e -> m ()) -> m ()
load :: Scheduler m () -> Int -> (Int -> e -> m ()) -> m ()
load Scheduler m ()
scheduler Int
startAt Int -> e -> m ()
writeAt =
Int -> Int -> (Int -> Int -> m ()) -> m ()
forall a. Int -> Int -> (Int -> Int -> a) -> a
splitLinearly (Scheduler m () -> Int
forall (m :: * -> *) a. Scheduler m a -> Int
numWorkers Scheduler m ()
scheduler) Int
totalLength ((Int -> Int -> m ()) -> m ()) -> (Int -> Int -> m ()) -> m ()
forall a b. (a -> b) -> a -> b
$ \Int
chunkLength Int
slackStart -> do
let slackStartAt :: Int
slackStartAt = Int
slackStart Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
startAt
writeRandom :: Int -> g -> m g
writeRandom Int
k g
genII =
let (e
e, g
genII') = g -> (e, g)
nextRandom g
genII
in g
genII' g -> m () -> m g
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Int -> e -> m ()
writeAt Int
k e
e
g
genForSlack <-
Int
-> (Int -> Bool) -> (Int -> Int) -> g -> (Int -> g -> m g) -> m g
forall (m :: * -> *) a.
Monad m =>
Int
-> (Int -> Bool) -> (Int -> Int) -> a -> (Int -> a -> m a) -> m a
loopM Int
startAt (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
slackStartAt) (Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
chunkLength) g
gen ((Int -> g -> m g) -> m g) -> (Int -> g -> m g) -> m g
forall a b. (a -> b) -> a -> b
$ \Int
start g
genI -> do
let (g
genI0, g
genI1) =
if Scheduler m () -> Int
forall (m :: * -> *) a. Scheduler m a -> Int
numWorkers Scheduler m ()
scheduler Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
1
then (g
genI, g
genI)
else g -> (g, g)
splitGen g
genI
Scheduler m () -> m () -> m ()
forall (m :: * -> *). Scheduler m () -> m () -> m ()
scheduleWork_ Scheduler m ()
scheduler (m () -> m ()) -> m () -> m ()
forall a b. (a -> b) -> a -> b
$
m g -> m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (m g -> m ()) -> m g -> m ()
forall a b. (a -> b) -> a -> b
$ Int
-> (Int -> Bool) -> (Int -> Int) -> g -> (Int -> g -> m g) -> m g
forall (m :: * -> *) a.
Monad m =>
Int
-> (Int -> Bool) -> (Int -> Int) -> a -> (Int -> a -> m a) -> m a
loopM Int
start (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
start Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
chunkLength) (Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) g
genI0 Int -> g -> m g
writeRandom
g -> m g
forall (f :: * -> *) a. Applicative f => a -> f a
pure g
genI1
Bool -> m () -> m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Int
slackStartAt Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
totalLength Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
startAt) (m () -> m ()) -> m () -> m ()
forall a b. (a -> b) -> a -> b
$
Scheduler m () -> m () -> m ()
forall (m :: * -> *). Scheduler m () -> m () -> m ()
scheduleWork_ Scheduler m ()
scheduler (m () -> m ()) -> m () -> m ()
forall a b. (a -> b) -> a -> b
$
m g -> m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (m g -> m ()) -> m g -> m ()
forall a b. (a -> b) -> a -> b
$ Int
-> (Int -> Bool) -> (Int -> Int) -> g -> (Int -> g -> m g) -> m g
forall (m :: * -> *) a.
Monad m =>
Int
-> (Int -> Bool) -> (Int -> Int) -> a -> (Int -> a -> m a) -> m a
loopM Int
slackStartAt (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
totalLength Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
startAt) (Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) g
genForSlack Int -> g -> m g
writeRandom
{-# INLINE randomArray #-}
randomArrayS ::
forall r ix e g. Mutable r ix e
=> g
-> Sz ix
-> (g -> (e, g))
-> (g, Array r ix e)
randomArrayS :: g -> Sz ix -> (g -> (e, g)) -> (g, Array r ix e)
randomArrayS g
gen Sz ix
sz g -> (e, g)
nextRandom =
(forall s. ST s (g, Array r ix e)) -> (g, Array r ix e)
forall a. (forall s. ST s a) -> a
runST ((forall s. ST s (g, Array r ix e)) -> (g, Array r ix e))
-> (forall s. ST s (g, Array r ix e)) -> (g, Array r ix e)
forall a b. (a -> b) -> a -> b
$ Sz ix -> (g -> ST s (e, g)) -> g -> ST s (g, Array r ix e)
forall r ix e a (m :: * -> *).
(Mutable r ix e, PrimMonad m) =>
Sz ix -> (a -> m (e, a)) -> a -> m (a, Array r ix e)
unfoldrPrimM Sz ix
sz ((e, g) -> ST s (e, g)
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((e, g) -> ST s (e, g)) -> (g -> (e, g)) -> g -> ST s (e, g)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. g -> (e, g)
nextRandom) g
gen
{-# INLINE randomArrayS #-}
randomArrayWS ::
forall r ix e g m. (Mutable r ix e, MonadUnliftIO m, PrimMonad m)
=> WorkerStates g
-> Sz ix
-> (g -> m e)
-> m (Array r ix e)
randomArrayWS :: WorkerStates g -> Sz ix -> (g -> m e) -> m (Array r ix e)
randomArrayWS WorkerStates g
states Sz ix
sz g -> m e
genRandom = WorkerStates g -> Sz ix -> (Int -> g -> m e) -> m (Array r ix e)
forall r ix e s (m :: * -> *).
(Mutable r ix e, MonadUnliftIO m, PrimMonad m) =>
WorkerStates s -> Sz ix -> (Int -> s -> m e) -> m (Array r ix e)
generateArrayLinearWS WorkerStates g
states Sz ix
sz ((g -> m e) -> Int -> g -> m e
forall a b. a -> b -> a
const g -> m e
genRandom)
{-# INLINE randomArrayWS #-}
infix 4 ..., ..:
(...) :: Index ix => ix -> ix -> Array D ix ix
... :: ix -> ix -> Array D ix ix
(...) = Comp -> ix -> ix -> Array D ix ix
forall ix. Index ix => Comp -> ix -> ix -> Array D ix ix
rangeInclusive Comp
Seq
{-# INLINE (...) #-}
(..:) :: Index ix => ix -> ix -> Array D ix ix
..: :: ix -> ix -> Array D ix ix
(..:) = Comp -> ix -> ix -> Array D ix ix
forall ix. Index ix => Comp -> ix -> ix -> Array D ix ix
range Comp
Seq
{-# INLINE (..:) #-}
range :: Index ix => Comp -> ix -> ix -> Array D ix ix
range :: Comp -> ix -> ix -> Array D ix ix
range Comp
comp !ix
from !ix
to = Comp -> ix -> Sz ix -> Array D ix ix
forall ix. Index ix => Comp -> ix -> Sz ix -> Array D ix ix
rangeSize Comp
comp ix
from (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 (-) ix
to ix
from))
{-# INLINE range #-}
rangeStepM :: (Index ix, MonadThrow m) =>
Comp
-> ix
-> ix
-> ix
-> m (Array D ix ix)
rangeStepM :: Comp -> ix -> ix -> ix -> m (Array D ix ix)
rangeStepM Comp
comp !ix
from !ix
step !ix
to
| (Bool -> Int -> Bool) -> Bool -> ix -> Bool
forall ix a. Index ix => (a -> Int -> a) -> a -> ix -> a
foldlIndex (\Bool
acc Int
i -> Bool
acc Bool -> Bool -> Bool
|| Int
i Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0) Bool
False ix
step = IndexException -> m (Array D ix ix)
forall (m :: * -> *) e a. (MonadThrow m, Exception e) => e -> m a
throwM (IndexException -> m (Array D ix ix))
-> IndexException -> m (Array D ix ix)
forall a b. (a -> b) -> a -> b
$ ix -> IndexException
forall ix. Index ix => ix -> IndexException
IndexZeroException ix
step
| Bool
otherwise =
let dist :: ix
dist = (Int -> Int -> Int) -> ix -> ix -> ix
forall ix. Index ix => (Int -> Int -> Int) -> ix -> ix -> ix
liftIndex2 (-) ix
to ix
from
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. Integral a => a -> a -> a
div ix
dist ix
step
r :: ix
r = (Int -> Int) -> ix -> ix
forall ix. Index ix => (Int -> Int) -> ix -> ix
liftIndex Int -> Int
forall a. Num a => a -> a
signum (ix -> ix) -> ix -> ix
forall a b. (a -> b) -> a -> b
$ (Int -> Int -> Int) -> ix -> ix -> ix
forall ix. Index ix => (Int -> Int -> Int) -> ix -> ix -> ix
liftIndex2 Int -> Int -> Int
forall a. Integral a => a -> a -> a
mod ix
dist ix
step
in Array D ix ix -> m (Array D ix ix)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Array D ix ix -> m (Array D ix ix))
-> Array D ix ix -> m (Array D ix ix)
forall a b. (a -> b) -> a -> b
$ Comp -> ix -> ix -> Sz ix -> Array D ix ix
forall ix. Index ix => Comp -> ix -> ix -> Sz ix -> Array D ix ix
rangeStepSize Comp
comp ix
from ix
step (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
(+) ix
sz ix
r))
{-# INLINE rangeStepM #-}
rangeStep' :: Index ix => Comp -> ix -> ix -> ix -> Array D ix ix
rangeStep' :: Comp -> ix -> ix -> ix -> Array D ix ix
rangeStep' Comp
comp ix
from ix
step = (SomeException -> Array D ix ix)
-> (Array D ix ix -> Array D ix ix)
-> Either SomeException (Array D ix ix)
-> Array D ix ix
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either SomeException -> Array D ix ix
forall a e. Exception e => e -> a
throw Array D ix ix -> Array D ix ix
forall a. a -> a
id (Either SomeException (Array D ix ix) -> Array D ix ix)
-> (ix -> Either SomeException (Array D ix ix))
-> ix
-> Array D ix ix
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Comp -> ix -> ix -> ix -> Either SomeException (Array D ix ix)
forall ix (m :: * -> *).
(Index ix, MonadThrow m) =>
Comp -> ix -> ix -> ix -> m (Array D ix ix)
rangeStepM Comp
comp ix
from ix
step
{-# INLINE rangeStep' #-}
rangeInclusive :: Index ix => Comp -> ix -> ix -> Array D ix ix
rangeInclusive :: Comp -> ix -> ix -> Array D ix ix
rangeInclusive Comp
comp ix
ixFrom ix
ixTo =
Comp -> ix -> Sz ix -> Array D ix ix
forall ix. Index ix => Comp -> ix -> Sz ix -> Array D ix ix
rangeSize Comp
comp ix
ixFrom (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) -> ix -> ix
forall ix. Index ix => (Int -> Int) -> ix -> ix
liftIndex (Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) ix
ixTo) ix
ixFrom))
{-# INLINE rangeInclusive #-}
rangeStepInclusiveM :: (MonadThrow m, Index ix) => Comp -> ix -> ix -> ix -> m (Array D ix ix)
rangeStepInclusiveM :: Comp -> ix -> ix -> ix -> m (Array D ix ix)
rangeStepInclusiveM Comp
comp ix
ixFrom ix
step ix
ixTo = Comp -> ix -> ix -> ix -> m (Array D ix ix)
forall ix (m :: * -> *).
(Index ix, MonadThrow m) =>
Comp -> ix -> ix -> ix -> m (Array D ix ix)
rangeStepM Comp
comp ix
ixFrom ix
step ((Int -> Int) -> ix -> ix
forall ix. Index ix => (Int -> Int) -> ix -> ix
liftIndex (Int
1 Int -> Int -> Int
forall a. Num a => a -> a -> a
+) ix
ixTo)
{-# INLINE rangeStepInclusiveM #-}
rangeStepInclusive' :: Index ix => Comp -> ix -> ix -> ix -> Array D ix ix
rangeStepInclusive' :: Comp -> ix -> ix -> ix -> Array D ix ix
rangeStepInclusive' Comp
comp ix
ixFrom ix
step = (SomeException -> Array D ix ix)
-> (Array D ix ix -> Array D ix ix)
-> Either SomeException (Array D ix ix)
-> Array D ix ix
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either SomeException -> Array D ix ix
forall a e. Exception e => e -> a
throw Array D ix ix -> Array D ix ix
forall a. a -> a
id (Either SomeException (Array D ix ix) -> Array D ix ix)
-> (ix -> Either SomeException (Array D ix ix))
-> ix
-> Array D ix ix
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Comp -> ix -> ix -> ix -> Either SomeException (Array D ix ix)
forall (m :: * -> *) ix.
(MonadThrow m, Index ix) =>
Comp -> ix -> ix -> ix -> m (Array D ix ix)
rangeStepInclusiveM Comp
comp ix
ixFrom ix
step
{-# INLINE rangeStepInclusive' #-}
rangeSize :: Index ix =>
Comp
-> ix
-> Sz ix
-> Array D ix ix
rangeSize :: Comp -> ix -> Sz ix -> Array D ix ix
rangeSize Comp
comp !ix
from !Sz ix
sz = Comp -> Sz ix -> (ix -> ix) -> Array D ix ix
forall r ix e.
Construct r ix e =>
Comp -> Sz ix -> (ix -> e) -> Array r ix e
makeArray Comp
comp 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
(+) ix
from)
{-# INLINE rangeSize #-}
rangeStepSize :: Index ix =>
Comp
-> ix
-> ix
-> Sz ix
-> Array D ix ix
rangeStepSize :: Comp -> ix -> ix -> Sz ix -> Array D ix ix
rangeStepSize Comp
comp !ix
from !ix
step !Sz ix
sz =
Comp -> Sz ix -> (ix -> ix) -> Array D ix ix
forall r ix e.
Construct r ix e =>
Comp -> Sz ix -> (ix -> e) -> Array r ix e
makeArray Comp
comp 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
(+) ix
from (ix -> ix) -> (ix -> ix) -> ix -> ix
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (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
(*) ix
step)
{-# INLINE rangeStepSize #-}
enumFromN :: Num e =>
Comp
-> e
-> Sz1
-> Vector D e
enumFromN :: Comp -> e -> Sz1 -> Vector D e
enumFromN Comp
comp !e
from !Sz1
sz = Comp -> Sz1 -> (Int -> e) -> Vector D e
forall r ix e.
Construct r ix e =>
Comp -> Sz ix -> (Int -> e) -> Array r ix e
makeArrayLinear Comp
comp Sz1
sz ((Int -> e) -> Vector D e) -> (Int -> e) -> Vector D e
forall a b. (a -> b) -> a -> b
$ \ Int
i -> e
from e -> e -> e
forall a. Num a => a -> a -> a
+ Int -> e
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
i
{-# INLINE enumFromN #-}
enumFromStepN :: Num e =>
Comp
-> e
-> e
-> Sz1
-> Vector D e
enumFromStepN :: Comp -> e -> e -> Sz1 -> Vector D e
enumFromStepN Comp
comp !e
from !e
step !Sz1
sz = Comp -> Sz1 -> (Int -> e) -> Vector D e
forall r ix e.
Construct r ix e =>
Comp -> Sz ix -> (Int -> e) -> Array r ix e
makeArrayLinear Comp
comp Sz1
sz ((Int -> e) -> Vector D e) -> (Int -> e) -> Vector D e
forall a b. (a -> b) -> a -> b
$ \ Int
i -> e
from e -> e -> e
forall a. Num a => a -> a -> a
+ Int -> e
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
i e -> e -> e
forall a. Num a => a -> a -> a
* e
step
{-# INLINE enumFromStepN #-}
expandWithin ::
forall ix e r n a. (IsIndexDimension ix n, Manifest r (Lower ix) a)
=> Dimension n
-> Sz1
-> (a -> Ix1 -> e)
-> Array r (Lower ix) a
-> Array D ix e
expandWithin :: Dimension n
-> Sz1 -> (a -> Int -> e) -> Array r (Lower ix) a -> Array D ix e
expandWithin Dimension n
dim (Sz Int
k) a -> Int -> e
f Array r (Lower ix) a
arr =
Comp -> Sz ix -> (ix -> e) -> Array D ix e
forall r ix e.
Construct r ix e =>
Comp -> Sz ix -> (ix -> e) -> Array r ix e
makeArray (Array r (Lower ix) a -> Comp
forall r ix e. Load r ix e => Array r ix e -> Comp
getComp Array r (Lower ix) a
arr) Sz ix
sz ((ix -> e) -> Array D ix e) -> (ix -> e) -> Array D ix e
forall a b. (a -> b) -> a -> b
$ \ix
ix ->
let (Int
i, Lower ix
ixl) = ix -> Dimension n -> (Int, Lower ix)
forall ix (n :: Nat).
IsIndexDimension ix n =>
ix -> Dimension n -> (Int, Lower ix)
pullOutDimension ix
ix Dimension n
dim
in a -> Int -> e
f (Array r (Lower ix) a -> Lower ix -> a
forall r ix e. Source r ix e => Array r ix e -> ix -> e
unsafeIndex Array r (Lower ix) a
arr Lower ix
ixl) Int
i
where
szl :: Lower ix
szl = Sz (Lower ix) -> Lower ix
forall ix. Sz ix -> ix
unSz (Array r (Lower ix) a -> Sz (Lower ix)
forall r ix e. Load r ix e => Array r ix e -> Sz ix
size Array r (Lower ix) a
arr)
sz :: Sz ix
sz = ix -> Sz ix
forall ix. ix -> Sz ix
SafeSz (Lower ix -> Dimension n -> Int -> ix
forall ix (n :: Nat).
IsIndexDimension ix n =>
Lower ix -> Dimension n -> Int -> ix
insertDimension Lower ix
szl Dimension n
dim Int
k)
{-# INLINE expandWithin #-}
expandWithin'
:: (Index ix, Manifest r (Lower ix) a)
=> Dim
-> Sz1
-> (a -> Ix1 -> b)
-> Array r (Lower ix) a
-> Array D ix b
expandWithin' :: Dim
-> Sz1 -> (a -> Int -> b) -> Array r (Lower ix) a -> Array D ix b
expandWithin' Dim
dim Sz1
k a -> Int -> b
f Array r (Lower ix) a
arr = (SomeException -> Array D ix b)
-> (Array D ix b -> Array D ix b)
-> Either SomeException (Array D ix b)
-> Array D ix b
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either SomeException -> Array D ix b
forall a e. Exception e => e -> a
throw Array D ix b -> Array D ix b
forall a. a -> a
id (Either SomeException (Array D ix b) -> Array D ix b)
-> Either SomeException (Array D ix b) -> Array D ix b
forall a b. (a -> b) -> a -> b
$ Dim
-> Sz1
-> (a -> Int -> b)
-> Array r (Lower ix) a
-> Either SomeException (Array D ix b)
forall ix r a (m :: * -> *) b.
(Index ix, Manifest r (Lower ix) a, MonadThrow m) =>
Dim
-> Sz1
-> (a -> Int -> b)
-> Array r (Lower ix) a
-> m (Array D ix b)
expandWithinM Dim
dim Sz1
k a -> Int -> b
f Array r (Lower ix) a
arr
{-# INLINE expandWithin' #-}
expandWithinM
:: (Index ix, Manifest r (Lower ix) a, MonadThrow m)
=> Dim
-> Sz1
-> (a -> Ix1 -> b)
-> Array r (Lower ix) a
-> m (Array D ix b)
expandWithinM :: Dim
-> Sz1
-> (a -> Int -> b)
-> Array r (Lower ix) a
-> m (Array D ix b)
expandWithinM Dim
dim Sz1
k a -> Int -> b
f Array r (Lower ix) a
arr = do
Sz ix
sz <- Sz (Lower ix) -> Dim -> Sz1 -> m (Sz ix)
forall (m :: * -> *) ix.
(MonadThrow m, Index ix) =>
Sz (Lower ix) -> Dim -> Sz1 -> m (Sz ix)
insertSzM (Array r (Lower ix) a -> Sz (Lower ix)
forall r ix e. Load r ix e => Array r ix e -> Sz ix
size Array r (Lower ix) a
arr) Dim
dim Sz1
k
Array D ix b -> m (Array D ix b)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Array D ix b -> m (Array D ix b))
-> Array D ix b -> m (Array D ix b)
forall a b. (a -> b) -> a -> b
$
Comp -> Sz ix -> (ix -> b) -> Array D ix b
forall r ix e.
Construct r ix e =>
Comp -> Sz ix -> (ix -> e) -> Array r ix e
makeArray (Array r (Lower ix) a -> Comp
forall r ix e. Load r ix e => Array r ix e -> Comp
getComp Array r (Lower ix) a
arr) Sz ix
sz ((ix -> b) -> Array D ix b) -> (ix -> b) -> Array D ix b
forall a b. (a -> b) -> a -> b
$ \ix
ix ->
let (Int
i, Lower ix
ixl) = ix -> Dim -> (Int, Lower ix)
forall ix. Index ix => ix -> Dim -> (Int, Lower ix)
pullOutDim' ix
ix Dim
dim
in a -> Int -> b
f (Array r (Lower ix) a -> Lower ix -> a
forall r ix e. Source r ix e => Array r ix e -> ix -> e
unsafeIndex Array r (Lower ix) a
arr Lower ix
ixl) Int
i
{-# INLINE expandWithinM #-}
expandOuter
:: (Index ix, Manifest r (Lower ix) a)
=> Sz1
-> (a -> Ix1 -> b)
-> Array r (Lower ix) a
-> Array D ix b
expandOuter :: Sz1 -> (a -> Int -> b) -> Array r (Lower ix) a -> Array D ix b
expandOuter Sz1
k a -> Int -> b
f Array r (Lower ix) a
arr =
Comp -> Sz ix -> (ix -> b) -> Array D ix b
forall r ix e.
Construct r ix e =>
Comp -> Sz ix -> (ix -> e) -> Array r ix e
makeArray (Array r (Lower ix) a -> Comp
forall r ix e. Load r ix e => Array r ix e -> Comp
getComp Array r (Lower ix) a
arr) Sz ix
sz ((ix -> b) -> Array D ix b) -> (ix -> b) -> Array D ix b
forall a b. (a -> b) -> a -> b
$ \ix
ix ->
let (Int
i, Lower ix
ixl) = ix -> (Int, Lower ix)
forall ix. Index ix => ix -> (Int, Lower ix)
unconsDim ix
ix
in a -> Int -> b
f (Array r (Lower ix) a -> Lower ix -> a
forall r ix e. Source r ix e => Array r ix e -> ix -> e
unsafeIndex Array r (Lower ix) a
arr Lower ix
ixl) Int
i
where
szl :: Sz (Lower ix)
szl = Array r (Lower ix) a -> Sz (Lower ix)
forall r ix e. Load r ix e => Array r ix e -> Sz ix
size Array r (Lower ix) a
arr
sz :: Sz ix
sz = Sz1 -> Sz (Lower ix) -> Sz ix
forall ix. Index ix => Sz1 -> Sz (Lower ix) -> Sz ix
consSz Sz1
k Sz (Lower ix)
szl
{-# INLINE expandOuter #-}
expandInner
:: (Index ix, Manifest r (Lower ix) a)
=> Sz1
-> (a -> Ix1 -> b)
-> Array r (Lower ix) a
-> Array D ix b
expandInner :: Sz1 -> (a -> Int -> b) -> Array r (Lower ix) a -> Array D ix b
expandInner Sz1
k a -> Int -> b
f Array r (Lower ix) a
arr =
Comp -> Sz ix -> (ix -> b) -> Array D ix b
forall r ix e.
Construct r ix e =>
Comp -> Sz ix -> (ix -> e) -> Array r ix e
makeArray (Array r (Lower ix) a -> Comp
forall r ix e. Load r ix e => Array r ix e -> Comp
getComp Array r (Lower ix) a
arr) Sz ix
sz ((ix -> b) -> Array D ix b) -> (ix -> b) -> Array D ix b
forall a b. (a -> b) -> a -> b
$ \ix
ix ->
let (Lower ix
ixl, Int
i) = ix -> (Lower ix, Int)
forall ix. Index ix => ix -> (Lower ix, Int)
unsnocDim ix
ix
in a -> Int -> b
f (Array r (Lower ix) a -> Lower ix -> a
forall r ix e. Source r ix e => Array r ix e -> ix -> e
unsafeIndex Array r (Lower ix) a
arr Lower ix
ixl) Int
i
where
szl :: Sz (Lower ix)
szl = Array r (Lower ix) a -> Sz (Lower ix)
forall r ix e. Load r ix e => Array r ix e -> Sz ix
size Array r (Lower ix) a
arr
sz :: Sz ix
sz = Sz (Lower ix) -> Sz1 -> Sz ix
forall ix. Index ix => Sz (Lower ix) -> Sz1 -> Sz ix
snocSz Sz (Lower ix)
szl Sz1
k
{-# INLINE expandInner #-}