{-# LANGUAGE FlexibleContexts, StandaloneDeriving, TypeFamilies #-}
module Game.LambdaHack.Common.PointArray
( UnboxRepClass(..), Array(..)
, empty, (!), accessI, (//), unsafeUpdateA, unsafeWriteA, unsafeWriteManyA
, replicateA, replicateMA, generateA, generateMA, unfoldrNA, sizeA
, foldrA, foldrA', foldlA', ifoldrA, ifoldrA', ifoldlA', foldMA', ifoldMA'
, mapA, imapA, imapMA_, safeSetA, unsafeSetA
, minIndexA, minLastIndexA, minIndexesA, maxIndexA, maxIndexByA, maxLastIndexA
, forceA, fromListA, toListA
#ifdef EXPOSE_INTERNAL
, toUnboxRep
#endif
) where
import Prelude ()
import Game.LambdaHack.Core.Prelude
import Control.Monad.ST.Strict
import Data.Binary
import Data.Vector.Binary ()
import qualified Data.Vector.Fusion.Bundle as Bundle
import qualified Data.Vector.Generic as G
import qualified Data.Vector.Unboxed as U
import qualified Data.Vector.Unboxed.Mutable as VM
import Game.LambdaHack.Common.Point
import qualified Game.LambdaHack.Definition.Color as Color
import Game.LambdaHack.Definition.Defs
class ( Ord c, Eq (UnboxRep c), Ord (UnboxRep c), Bounded (UnboxRep c)
, Binary (UnboxRep c), U.Unbox (UnboxRep c) )
=> UnboxRepClass c where
type UnboxRep c
type instance UnboxRep c = c
toUnboxRepUnsafe :: c -> UnboxRep c
fromUnboxRep :: UnboxRep c -> c
instance UnboxRepClass Bool where
toUnboxRepUnsafe :: Bool -> UnboxRep Bool
toUnboxRepUnsafe c :: Bool
c = Bool
UnboxRep Bool
c
fromUnboxRep :: UnboxRep Bool -> Bool
fromUnboxRep c :: UnboxRep Bool
c = Bool
UnboxRep Bool
c
instance UnboxRepClass Word8 where
toUnboxRepUnsafe :: Word8 -> UnboxRep Word8
toUnboxRepUnsafe c :: Word8
c = Word8
UnboxRep Word8
c
fromUnboxRep :: UnboxRep Word8 -> Word8
fromUnboxRep c :: UnboxRep Word8
c = Word8
UnboxRep Word8
c
instance UnboxRepClass (ContentId k) where
type UnboxRep (ContentId k) = Word16
toUnboxRepUnsafe :: ContentId k -> UnboxRep (ContentId k)
toUnboxRepUnsafe = ContentId k -> UnboxRep (ContentId k)
forall c. ContentId c -> Word16
fromContentId
fromUnboxRep :: UnboxRep (ContentId k) -> ContentId k
fromUnboxRep = UnboxRep (ContentId k) -> ContentId k
forall c. Word16 -> ContentId c
toContentId
instance UnboxRepClass Color.AttrCharW32 where
type UnboxRep Color.AttrCharW32 = Word32
toUnboxRepUnsafe :: AttrCharW32 -> UnboxRep AttrCharW32
toUnboxRepUnsafe = AttrCharW32 -> Word32
AttrCharW32 -> UnboxRep AttrCharW32
Color.attrCharW32
fromUnboxRep :: UnboxRep AttrCharW32 -> AttrCharW32
fromUnboxRep = Word32 -> AttrCharW32
UnboxRep AttrCharW32 -> AttrCharW32
Color.AttrCharW32
data Array c = Array
{ Array c -> X
axsize :: X
, Array c -> X
aysize :: Y
, Array c -> Vector (UnboxRep c)
avector :: U.Vector (UnboxRep c)
}
deriving instance UnboxRepClass c => Eq (Array c)
instance Show (Array c) where
show :: Array c -> String
show a :: Array c
a = "PointArray.Array with size " String -> ShowS
forall a. [a] -> [a] -> [a]
++ (X, X) -> String
forall a. Show a => a -> String
show (Array c -> X
forall c. Array c -> X
axsize Array c
a, Array c -> X
forall c. Array c -> X
aysize Array c
a)
instance UnboxRepClass c => Binary (Array c) where
put :: Array c -> Put
put Array{..} = do
X -> Put
forall t. Binary t => t -> Put
put X
axsize
X -> Put
forall t. Binary t => t -> Put
put X
aysize
Vector (UnboxRep c) -> Put
forall t. Binary t => t -> Put
put Vector (UnboxRep c)
avector
get :: Get (Array c)
get = do
X
axsize <- Get X
forall t. Binary t => Get t
get
X
aysize <- Get X
forall t. Binary t => Get t
get
Vector (UnboxRep c)
avector <- Get (Vector (UnboxRep c))
forall t. Binary t => Get t
get
Array c -> Get (Array c)
forall (m :: * -> *) a. Monad m => a -> m a
return (Array c -> Get (Array c)) -> Array c -> Get (Array c)
forall a b. (a -> b) -> a -> b
$! $WArray :: forall c. X -> X -> Vector (UnboxRep c) -> Array c
Array{..}
toUnboxRep :: UnboxRepClass c => c -> UnboxRep c
{-# INLINE toUnboxRep #-}
toUnboxRep :: c -> UnboxRep c
toUnboxRep c :: c
c =
#ifdef WITH_EXPENSIVE_ASSERTIONS
assert (c <= fromUnboxRep maxBound) $
#endif
c -> UnboxRep c
forall c. UnboxRepClass c => c -> UnboxRep c
toUnboxRepUnsafe c
c
empty :: UnboxRepClass c => Array c
empty :: Array c
empty = X -> X -> Vector (UnboxRep c) -> Array c
forall c. X -> X -> Vector (UnboxRep c) -> Array c
Array 0 0 Vector (UnboxRep c)
forall a. Unbox a => Vector a
U.empty
(!) :: UnboxRepClass c => Array c -> Point -> c
{-# INLINE (!) #-}
(!) Array{..} p :: Point
p = UnboxRep c -> c
forall c. UnboxRepClass c => UnboxRep c -> c
fromUnboxRep (UnboxRep c -> c) -> UnboxRep c -> c
forall a b. (a -> b) -> a -> b
$ Vector (UnboxRep c)
avector Vector (UnboxRep c) -> X -> UnboxRep c
forall a. Unbox a => Vector a -> X -> a
U.! Point -> X
forall a. Enum a => a -> X
fromEnum Point
p
accessI :: UnboxRepClass c => Array c -> Int -> UnboxRep c
{-# INLINE accessI #-}
accessI :: Array c -> X -> UnboxRep c
accessI Array{..} p :: X
p = Vector (UnboxRep c)
avector Vector (UnboxRep c) -> X -> UnboxRep c
forall a. Unbox a => Vector a -> X -> a
`U.unsafeIndex` X
p
(//) :: UnboxRepClass c => Array c -> [(Point, c)] -> Array c
{-# INLINE (//) #-}
// :: Array c -> [(Point, c)] -> Array c
(//) Array{..} l :: [(Point, c)]
l = let v :: Vector (UnboxRep c)
v = Vector (UnboxRep c)
avector Vector (UnboxRep c) -> [(X, UnboxRep c)] -> Vector (UnboxRep c)
forall a. Unbox a => Vector a -> [(X, a)] -> Vector a
U.// ((Point, c) -> (X, UnboxRep c))
-> [(Point, c)] -> [(X, UnboxRep c)]
forall a b. (a -> b) -> [a] -> [b]
map (Point -> X
forall a. Enum a => a -> X
fromEnum (Point -> X) -> (c -> UnboxRep c) -> (Point, c) -> (X, UnboxRep c)
forall (a :: * -> * -> *) b c b' c'.
Arrow a =>
a b c -> a b' c' -> a (b, b') (c, c')
*** c -> UnboxRep c
forall c. UnboxRepClass c => c -> UnboxRep c
toUnboxRep) [(Point, c)]
l
in $WArray :: forall c. X -> X -> Vector (UnboxRep c) -> Array c
Array{avector :: Vector (UnboxRep c)
avector = Vector (UnboxRep c)
v, ..}
unsafeUpdateA :: UnboxRepClass c => Array c -> [(Point, c)] -> ()
{-# INLINE unsafeUpdateA #-}
unsafeUpdateA :: Array c -> [(Point, c)] -> ()
unsafeUpdateA Array{..} l :: [(Point, c)]
l = (forall s. ST s ()) -> ()
forall a. (forall s. ST s a) -> a
runST ((forall s. ST s ()) -> ()) -> (forall s. ST s ()) -> ()
forall a b. (a -> b) -> a -> b
$ do
MVector s (UnboxRep c)
vThawed <- Vector (UnboxRep c)
-> ST s (MVector (PrimState (ST s)) (UnboxRep c))
forall a (m :: * -> *).
(Unbox a, PrimMonad m) =>
Vector a -> m (MVector (PrimState m) a)
U.unsafeThaw Vector (UnboxRep c)
avector
((Point, c) -> ST s ()) -> [(Point, c)] -> ST s ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (\(p :: Point
p, c :: c
c) -> MVector (PrimState (ST s)) (UnboxRep c)
-> X -> UnboxRep c -> ST s ()
forall (m :: * -> *) a.
(PrimMonad m, Unbox a) =>
MVector (PrimState m) a -> X -> a -> m ()
VM.write MVector s (UnboxRep c)
MVector (PrimState (ST s)) (UnboxRep c)
vThawed (Point -> X
forall a. Enum a => a -> X
fromEnum Point
p) (c -> UnboxRep c
forall c. UnboxRepClass c => c -> UnboxRep c
toUnboxRep c
c)) [(Point, c)]
l
ST s (Vector (UnboxRep c)) -> ST s ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (ST s (Vector (UnboxRep c)) -> ST s ())
-> ST s (Vector (UnboxRep c)) -> ST s ()
forall a b. (a -> b) -> a -> b
$ MVector (PrimState (ST s)) (UnboxRep c)
-> ST s (Vector (UnboxRep c))
forall a (m :: * -> *).
(Unbox a, PrimMonad m) =>
MVector (PrimState m) a -> m (Vector a)
U.unsafeFreeze MVector s (UnboxRep c)
MVector (PrimState (ST s)) (UnboxRep c)
vThawed
unsafeWriteA :: UnboxRepClass c => Array c -> Point -> c -> ()
{-# INLINE unsafeWriteA #-}
unsafeWriteA :: Array c -> Point -> c -> ()
unsafeWriteA Array{..} p :: Point
p c :: c
c = (forall s. ST s ()) -> ()
forall a. (forall s. ST s a) -> a
runST ((forall s. ST s ()) -> ()) -> (forall s. ST s ()) -> ()
forall a b. (a -> b) -> a -> b
$ do
MVector s (UnboxRep c)
vThawed <- Vector (UnboxRep c)
-> ST s (MVector (PrimState (ST s)) (UnboxRep c))
forall a (m :: * -> *).
(Unbox a, PrimMonad m) =>
Vector a -> m (MVector (PrimState m) a)
U.unsafeThaw Vector (UnboxRep c)
avector
MVector (PrimState (ST s)) (UnboxRep c)
-> X -> UnboxRep c -> ST s ()
forall (m :: * -> *) a.
(PrimMonad m, Unbox a) =>
MVector (PrimState m) a -> X -> a -> m ()
VM.write MVector s (UnboxRep c)
MVector (PrimState (ST s)) (UnboxRep c)
vThawed (Point -> X
forall a. Enum a => a -> X
fromEnum Point
p) (c -> UnboxRep c
forall c. UnboxRepClass c => c -> UnboxRep c
toUnboxRep c
c)
ST s (Vector (UnboxRep c)) -> ST s ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (ST s (Vector (UnboxRep c)) -> ST s ())
-> ST s (Vector (UnboxRep c)) -> ST s ()
forall a b. (a -> b) -> a -> b
$ MVector (PrimState (ST s)) (UnboxRep c)
-> ST s (Vector (UnboxRep c))
forall a (m :: * -> *).
(Unbox a, PrimMonad m) =>
MVector (PrimState m) a -> m (Vector a)
U.unsafeFreeze MVector s (UnboxRep c)
MVector (PrimState (ST s)) (UnboxRep c)
vThawed
unsafeWriteManyA :: UnboxRepClass c => Array c -> [Point] -> c -> ()
{-# INLINE unsafeWriteManyA #-}
unsafeWriteManyA :: Array c -> [Point] -> c -> ()
unsafeWriteManyA Array{..} l :: [Point]
l c :: c
c = (forall s. ST s ()) -> ()
forall a. (forall s. ST s a) -> a
runST ((forall s. ST s ()) -> ()) -> (forall s. ST s ()) -> ()
forall a b. (a -> b) -> a -> b
$ do
MVector s (UnboxRep c)
vThawed <- Vector (UnboxRep c)
-> ST s (MVector (PrimState (ST s)) (UnboxRep c))
forall a (m :: * -> *).
(Unbox a, PrimMonad m) =>
Vector a -> m (MVector (PrimState m) a)
U.unsafeThaw Vector (UnboxRep c)
avector
let d :: UnboxRep c
d = c -> UnboxRep c
forall c. UnboxRepClass c => c -> UnboxRep c
toUnboxRep c
c
(Point -> ST s ()) -> [Point] -> ST s ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (\p :: Point
p -> MVector (PrimState (ST s)) (UnboxRep c)
-> X -> UnboxRep c -> ST s ()
forall (m :: * -> *) a.
(PrimMonad m, Unbox a) =>
MVector (PrimState m) a -> X -> a -> m ()
VM.write MVector s (UnboxRep c)
MVector (PrimState (ST s)) (UnboxRep c)
vThawed (Point -> X
forall a. Enum a => a -> X
fromEnum Point
p) UnboxRep c
d) [Point]
l
ST s (Vector (UnboxRep c)) -> ST s ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (ST s (Vector (UnboxRep c)) -> ST s ())
-> ST s (Vector (UnboxRep c)) -> ST s ()
forall a b. (a -> b) -> a -> b
$ MVector (PrimState (ST s)) (UnboxRep c)
-> ST s (Vector (UnboxRep c))
forall a (m :: * -> *).
(Unbox a, PrimMonad m) =>
MVector (PrimState m) a -> m (Vector a)
U.unsafeFreeze MVector s (UnboxRep c)
MVector (PrimState (ST s)) (UnboxRep c)
vThawed
replicateA :: UnboxRepClass c => X -> Y -> c -> Array c
{-# INLINE replicateA #-}
replicateA :: X -> X -> c -> Array c
replicateA axsize :: X
axsize aysize :: X
aysize c :: c
c =
$WArray :: forall c. X -> X -> Vector (UnboxRep c) -> Array c
Array{avector :: Vector (UnboxRep c)
avector = X -> UnboxRep c -> Vector (UnboxRep c)
forall a. Unbox a => X -> a -> Vector a
U.replicate (X
axsize X -> X -> X
forall a. Num a => a -> a -> a
* X
aysize) (UnboxRep c -> Vector (UnboxRep c))
-> UnboxRep c -> Vector (UnboxRep c)
forall a b. (a -> b) -> a -> b
$ c -> UnboxRep c
forall c. UnboxRepClass c => c -> UnboxRep c
toUnboxRep c
c, ..}
replicateMA :: (Monad m, UnboxRepClass c) => X -> Y -> m c -> m (Array c)
{-# INLINE replicateMA #-}
replicateMA :: X -> X -> m c -> m (Array c)
replicateMA axsize :: X
axsize aysize :: X
aysize m :: m c
m = do
Vector (UnboxRep c)
v <- X -> m (UnboxRep c) -> m (Vector (UnboxRep c))
forall (m :: * -> *) a.
(Monad m, Unbox a) =>
X -> m a -> m (Vector a)
U.replicateM (X
axsize X -> X -> X
forall a. Num a => a -> a -> a
* X
aysize) (m (UnboxRep c) -> m (Vector (UnboxRep c)))
-> m (UnboxRep c) -> m (Vector (UnboxRep c))
forall a b. (a -> b) -> a -> b
$ (c -> UnboxRep c) -> m c -> m (UnboxRep c)
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM c -> UnboxRep c
forall c. UnboxRepClass c => c -> UnboxRep c
toUnboxRep m c
m
Array c -> m (Array c)
forall (m :: * -> *) a. Monad m => a -> m a
return (Array c -> m (Array c)) -> Array c -> m (Array c)
forall a b. (a -> b) -> a -> b
$! $WArray :: forall c. X -> X -> Vector (UnboxRep c) -> Array c
Array{avector :: Vector (UnboxRep c)
avector = Vector (UnboxRep c)
v, ..}
generateA :: UnboxRepClass c => X -> Y -> (Point -> c) -> Array c
{-# INLINE generateA #-}
generateA :: X -> X -> (Point -> c) -> Array c
generateA axsize :: X
axsize aysize :: X
aysize f :: Point -> c
f =
let g :: X -> UnboxRep c
g n :: X
n = c -> UnboxRep c
forall c. UnboxRepClass c => c -> UnboxRep c
toUnboxRep (c -> UnboxRep c) -> c -> UnboxRep c
forall a b. (a -> b) -> a -> b
$ Point -> c
f (Point -> c) -> Point -> c
forall a b. (a -> b) -> a -> b
$ X -> Point
forall a. Enum a => X -> a
toEnum X
n
in $WArray :: forall c. X -> X -> Vector (UnboxRep c) -> Array c
Array{avector :: Vector (UnboxRep c)
avector = X -> (X -> UnboxRep c) -> Vector (UnboxRep c)
forall a. Unbox a => X -> (X -> a) -> Vector a
U.generate (X
axsize X -> X -> X
forall a. Num a => a -> a -> a
* X
aysize) X -> UnboxRep c
g, ..}
generateMA :: (Monad m, UnboxRepClass c)
=> X -> Y -> (Point -> m c) -> m (Array c)
{-# INLINE generateMA #-}
generateMA :: X -> X -> (Point -> m c) -> m (Array c)
generateMA axsize :: X
axsize aysize :: X
aysize fm :: Point -> m c
fm = do
let gm :: X -> m (UnboxRep c)
gm n :: X
n = (c -> UnboxRep c) -> m c -> m (UnboxRep c)
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM c -> UnboxRep c
forall c. UnboxRepClass c => c -> UnboxRep c
toUnboxRep (m c -> m (UnboxRep c)) -> m c -> m (UnboxRep c)
forall a b. (a -> b) -> a -> b
$ Point -> m c
fm (Point -> m c) -> Point -> m c
forall a b. (a -> b) -> a -> b
$ X -> Point
forall a. Enum a => X -> a
toEnum X
n
Vector (UnboxRep c)
v <- X -> (X -> m (UnboxRep c)) -> m (Vector (UnboxRep c))
forall (m :: * -> *) a.
(Monad m, Unbox a) =>
X -> (X -> m a) -> m (Vector a)
U.generateM (X
axsize X -> X -> X
forall a. Num a => a -> a -> a
* X
aysize) X -> m (UnboxRep c)
gm
Array c -> m (Array c)
forall (m :: * -> *) a. Monad m => a -> m a
return (Array c -> m (Array c)) -> Array c -> m (Array c)
forall a b. (a -> b) -> a -> b
$! $WArray :: forall c. X -> X -> Vector (UnboxRep c) -> Array c
Array{avector :: Vector (UnboxRep c)
avector = Vector (UnboxRep c)
v, ..}
unfoldrNA :: UnboxRepClass c => X -> Y -> (b -> (c, b)) -> b -> Array c
{-# INLINE unfoldrNA #-}
unfoldrNA :: X -> X -> (b -> (c, b)) -> b -> Array c
unfoldrNA axsize :: X
axsize aysize :: X
aysize fm :: b -> (c, b)
fm b :: b
b =
let gm :: b -> Maybe (UnboxRep c, b)
gm = (UnboxRep c, b) -> Maybe (UnboxRep c, b)
forall a. a -> Maybe a
Just ((UnboxRep c, b) -> Maybe (UnboxRep c, b))
-> (b -> (UnboxRep c, b)) -> b -> Maybe (UnboxRep c, b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (c -> UnboxRep c) -> (c, b) -> (UnboxRep c, b)
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
first c -> UnboxRep c
forall c. UnboxRepClass c => c -> UnboxRep c
toUnboxRep ((c, b) -> (UnboxRep c, b))
-> (b -> (c, b)) -> b -> (UnboxRep c, b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. b -> (c, b)
fm
v :: Vector (UnboxRep c)
v = X -> (b -> Maybe (UnboxRep c, b)) -> b -> Vector (UnboxRep c)
forall a b. Unbox a => X -> (b -> Maybe (a, b)) -> b -> Vector a
U.unfoldrN (X
axsize X -> X -> X
forall a. Num a => a -> a -> a
* X
aysize) b -> Maybe (UnboxRep c, b)
gm b
b
in $WArray :: forall c. X -> X -> Vector (UnboxRep c) -> Array c
Array {avector :: Vector (UnboxRep c)
avector = Vector (UnboxRep c)
v, ..}
sizeA :: Array c -> (X, Y)
{-# INLINE sizeA #-}
sizeA :: Array c -> (X, X)
sizeA Array{..} = (X
axsize, X
aysize)
foldrA :: UnboxRepClass c => (c -> a -> a) -> a -> Array c -> a
{-# INLINE foldrA #-}
foldrA :: (c -> a -> a) -> a -> Array c -> a
foldrA f :: c -> a -> a
f z0 :: a
z0 Array{..} =
(UnboxRep c -> a -> a) -> a -> Vector (UnboxRep c) -> a
forall a b. Unbox a => (a -> b -> b) -> b -> Vector a -> b
U.foldr (\c :: UnboxRep c
c a :: a
a-> c -> a -> a
f (UnboxRep c -> c
forall c. UnboxRepClass c => UnboxRep c -> c
fromUnboxRep UnboxRep c
c) a
a) a
z0 Vector (UnboxRep c)
avector
foldrA' :: UnboxRepClass c => (c -> a -> a) -> a -> Array c -> a
{-# INLINE foldrA' #-}
foldrA' :: (c -> a -> a) -> a -> Array c -> a
foldrA' f :: c -> a -> a
f z0 :: a
z0 Array{..} =
(UnboxRep c -> a -> a) -> a -> Vector (UnboxRep c) -> a
forall a b. Unbox a => (a -> b -> b) -> b -> Vector a -> b
U.foldr' (\c :: UnboxRep c
c a :: a
a-> c -> a -> a
f (UnboxRep c -> c
forall c. UnboxRepClass c => UnboxRep c -> c
fromUnboxRep UnboxRep c
c) a
a) a
z0 Vector (UnboxRep c)
avector
foldlA' :: UnboxRepClass c => (a -> c -> a) -> a -> Array c -> a
{-# INLINE foldlA' #-}
foldlA' :: (a -> c -> a) -> a -> Array c -> a
foldlA' f :: a -> c -> a
f z0 :: a
z0 Array{..} =
(a -> UnboxRep c -> a) -> a -> Vector (UnboxRep c) -> a
forall b a. Unbox b => (a -> b -> a) -> a -> Vector b -> a
U.foldl' (\a :: a
a c :: UnboxRep c
c -> a -> c -> a
f a
a (UnboxRep c -> c
forall c. UnboxRepClass c => UnboxRep c -> c
fromUnboxRep UnboxRep c
c)) a
z0 Vector (UnboxRep c)
avector
ifoldlA' :: UnboxRepClass c => (a -> Point -> c -> a) -> a -> Array c -> a
{-# INLINE ifoldlA' #-}
ifoldlA' :: (a -> Point -> c -> a) -> a -> Array c -> a
ifoldlA' f :: a -> Point -> c -> a
f z0 :: a
z0 Array{..} =
(a -> X -> UnboxRep c -> a) -> a -> Vector (UnboxRep c) -> a
forall b a. Unbox b => (a -> X -> b -> a) -> a -> Vector b -> a
U.ifoldl' (\a :: a
a n :: X
n c :: UnboxRep c
c -> a -> Point -> c -> a
f a
a (X -> Point
forall a. Enum a => X -> a
toEnum X
n) (UnboxRep c -> c
forall c. UnboxRepClass c => UnboxRep c -> c
fromUnboxRep UnboxRep c
c)) a
z0 Vector (UnboxRep c)
avector
ifoldrA :: UnboxRepClass c => (Point -> c -> a -> a) -> a -> Array c -> a
{-# INLINE ifoldrA #-}
ifoldrA :: (Point -> c -> a -> a) -> a -> Array c -> a
ifoldrA f :: Point -> c -> a -> a
f z0 :: a
z0 Array{..} =
(X -> UnboxRep c -> a -> a) -> a -> Vector (UnboxRep c) -> a
forall a b. Unbox a => (X -> a -> b -> b) -> b -> Vector a -> b
U.ifoldr (\n :: X
n c :: UnboxRep c
c a :: a
a -> Point -> c -> a -> a
f (X -> Point
forall a. Enum a => X -> a
toEnum X
n) (UnboxRep c -> c
forall c. UnboxRepClass c => UnboxRep c -> c
fromUnboxRep UnboxRep c
c) a
a) a
z0 Vector (UnboxRep c)
avector
ifoldrA' :: UnboxRepClass c => (Point -> c -> a -> a) -> a -> Array c -> a
{-# INLINE ifoldrA' #-}
ifoldrA' :: (Point -> c -> a -> a) -> a -> Array c -> a
ifoldrA' f :: Point -> c -> a -> a
f z0 :: a
z0 Array{..} =
(X -> UnboxRep c -> a -> a) -> a -> Vector (UnboxRep c) -> a
forall a b. Unbox a => (X -> a -> b -> b) -> b -> Vector a -> b
U.ifoldr' (\n :: X
n c :: UnboxRep c
c a :: a
a -> Point -> c -> a -> a
f (X -> Point
forall a. Enum a => X -> a
toEnum X
n) (UnboxRep c -> c
forall c. UnboxRepClass c => UnboxRep c -> c
fromUnboxRep UnboxRep c
c) a
a) a
z0 Vector (UnboxRep c)
avector
foldMA' :: (Monad m, UnboxRepClass c) => (a -> c -> m a) -> a -> Array c -> m a
{-# INLINE foldMA' #-}
foldMA' :: (a -> c -> m a) -> a -> Array c -> m a
foldMA' f :: a -> c -> m a
f z0 :: a
z0 Array{..} =
(a -> UnboxRep c -> m a) -> a -> Vector (UnboxRep c) -> m a
forall (m :: * -> *) b a.
(Monad m, Unbox b) =>
(a -> b -> m a) -> a -> Vector b -> m a
U.foldM' (\a :: a
a c :: UnboxRep c
c -> a -> c -> m a
f a
a (UnboxRep c -> c
forall c. UnboxRepClass c => UnboxRep c -> c
fromUnboxRep UnboxRep c
c)) a
z0 Vector (UnboxRep c)
avector
ifoldMA' :: (Monad m, UnboxRepClass c)
=> (a -> Point -> c -> m a) -> a -> Array c -> m a
{-# INLINE ifoldMA' #-}
ifoldMA' :: (a -> Point -> c -> m a) -> a -> Array c -> m a
ifoldMA' f :: a -> Point -> c -> m a
f z0 :: a
z0 Array{..} =
(a -> X -> UnboxRep c -> m a) -> a -> Vector (UnboxRep c) -> m a
forall (m :: * -> *) b a.
(Monad m, Unbox b) =>
(a -> X -> b -> m a) -> a -> Vector b -> m a
U.ifoldM' (\a :: a
a n :: X
n c :: UnboxRep c
c -> a -> Point -> c -> m a
f a
a (X -> Point
forall a. Enum a => X -> a
toEnum X
n) (UnboxRep c -> c
forall c. UnboxRepClass c => UnboxRep c -> c
fromUnboxRep UnboxRep c
c)) a
z0 Vector (UnboxRep c)
avector
mapA :: (UnboxRepClass c, UnboxRepClass d) => (c -> d) -> Array c -> Array d
{-# INLINE mapA #-}
mapA :: (c -> d) -> Array c -> Array d
mapA f :: c -> d
f Array{..} =
$WArray :: forall c. X -> X -> Vector (UnboxRep c) -> Array c
Array{avector :: Vector (UnboxRep d)
avector = (UnboxRep c -> UnboxRep d)
-> Vector (UnboxRep c) -> Vector (UnboxRep d)
forall a b. (Unbox a, Unbox b) => (a -> b) -> Vector a -> Vector b
U.map (d -> UnboxRep d
forall c. UnboxRepClass c => c -> UnboxRep c
toUnboxRep (d -> UnboxRep d) -> (UnboxRep c -> d) -> UnboxRep c -> UnboxRep d
forall b c a. (b -> c) -> (a -> b) -> a -> c
. c -> d
f (c -> d) -> (UnboxRep c -> c) -> UnboxRep c -> d
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UnboxRep c -> c
forall c. UnboxRepClass c => UnboxRep c -> c
fromUnboxRep) Vector (UnboxRep c)
avector, ..}
imapA :: (UnboxRepClass c, UnboxRepClass d)
=> (Point -> c -> d) -> Array c -> Array d
{-# INLINE imapA #-}
imapA :: (Point -> c -> d) -> Array c -> Array d
imapA f :: Point -> c -> d
f Array{..} =
let v :: Vector (UnboxRep d)
v = (X -> UnboxRep c -> UnboxRep d)
-> Vector (UnboxRep c) -> Vector (UnboxRep d)
forall a b.
(Unbox a, Unbox b) =>
(X -> a -> b) -> Vector a -> Vector b
U.imap (\n :: X
n c :: UnboxRep c
c ->
d -> UnboxRep d
forall c. UnboxRepClass c => c -> UnboxRep c
toUnboxRep (d -> UnboxRep d) -> d -> UnboxRep d
forall a b. (a -> b) -> a -> b
$ Point -> c -> d
f (X -> Point
forall a. Enum a => X -> a
toEnum X
n) (UnboxRep c -> c
forall c. UnboxRepClass c => UnboxRep c -> c
fromUnboxRep UnboxRep c
c)) Vector (UnboxRep c)
avector
in $WArray :: forall c. X -> X -> Vector (UnboxRep c) -> Array c
Array{avector :: Vector (UnboxRep d)
avector = Vector (UnboxRep d)
v, ..}
imapMA_ :: (Monad m, UnboxRepClass c) => (Point -> c -> m ()) -> Array c -> m ()
{-# INLINE imapMA_ #-}
imapMA_ :: (Point -> c -> m ()) -> Array c -> m ()
imapMA_ f :: Point -> c -> m ()
f Array{..} =
(X -> UnboxRep c -> m ()) -> Vector (UnboxRep c) -> m ()
forall (m :: * -> *) a b.
(Monad m, Unbox a) =>
(X -> a -> m b) -> Vector a -> m ()
U.imapM_ (\n :: X
n c :: UnboxRep c
c -> Point -> c -> m ()
f (X -> Point
forall a. Enum a => X -> a
toEnum X
n) (UnboxRep c -> c
forall c. UnboxRepClass c => UnboxRep c -> c
fromUnboxRep UnboxRep c
c)) Vector (UnboxRep c)
avector
unsafeSetA :: UnboxRepClass c => c -> Array c -> Array c
{-# INLINE unsafeSetA #-}
unsafeSetA :: c -> Array c -> Array c
unsafeSetA c :: c
c Array{..} = (forall s. ST s (Array c)) -> Array c
forall a. (forall s. ST s a) -> a
runST ((forall s. ST s (Array c)) -> Array c)
-> (forall s. ST s (Array c)) -> Array c
forall a b. (a -> b) -> a -> b
$ do
MVector s (UnboxRep c)
vThawed <- Vector (UnboxRep c)
-> ST s (MVector (PrimState (ST s)) (UnboxRep c))
forall a (m :: * -> *).
(Unbox a, PrimMonad m) =>
Vector a -> m (MVector (PrimState m) a)
U.unsafeThaw Vector (UnboxRep c)
avector
MVector (PrimState (ST s)) (UnboxRep c) -> UnboxRep c -> ST s ()
forall (m :: * -> *) a.
(PrimMonad m, Unbox a) =>
MVector (PrimState m) a -> a -> m ()
VM.set MVector s (UnboxRep c)
MVector (PrimState (ST s)) (UnboxRep c)
vThawed (c -> UnboxRep c
forall c. UnboxRepClass c => c -> UnboxRep c
toUnboxRep c
c)
Vector (UnboxRep c)
vFrozen <- MVector (PrimState (ST s)) (UnboxRep c)
-> ST s (Vector (UnboxRep c))
forall a (m :: * -> *).
(Unbox a, PrimMonad m) =>
MVector (PrimState m) a -> m (Vector a)
U.unsafeFreeze MVector s (UnboxRep c)
MVector (PrimState (ST s)) (UnboxRep c)
vThawed
Array c -> ST s (Array c)
forall (m :: * -> *) a. Monad m => a -> m a
return (Array c -> ST s (Array c)) -> Array c -> ST s (Array c)
forall a b. (a -> b) -> a -> b
$! $WArray :: forall c. X -> X -> Vector (UnboxRep c) -> Array c
Array{avector :: Vector (UnboxRep c)
avector = Vector (UnboxRep c)
vFrozen, ..}
safeSetA :: UnboxRepClass c => c -> Array c -> Array c
{-# INLINE safeSetA #-}
safeSetA :: c -> Array c -> Array c
safeSetA c :: c
c Array{..} =
$WArray :: forall c. X -> X -> Vector (UnboxRep c) -> Array c
Array{avector :: Vector (UnboxRep c)
avector = (forall s. MVector s (UnboxRep c) -> ST s ())
-> Vector (UnboxRep c) -> Vector (UnboxRep c)
forall a.
Unbox a =>
(forall s. MVector s a -> ST s ()) -> Vector a -> Vector a
U.modify (\v :: MVector s (UnboxRep c)
v -> MVector (PrimState (ST s)) (UnboxRep c) -> UnboxRep c -> ST s ()
forall (m :: * -> *) a.
(PrimMonad m, Unbox a) =>
MVector (PrimState m) a -> a -> m ()
VM.set MVector s (UnboxRep c)
MVector (PrimState (ST s)) (UnboxRep c)
v (c -> UnboxRep c
forall c. UnboxRepClass c => c -> UnboxRep c
toUnboxRep c
c)) Vector (UnboxRep c)
avector, ..}
minIndexA :: UnboxRepClass c => Array c -> Point
{-# INLINE minIndexA #-}
minIndexA :: Array c -> Point
minIndexA Array{..} = X -> Point
forall a. Enum a => X -> a
toEnum (X -> Point) -> X -> Point
forall a b. (a -> b) -> a -> b
$ Vector (UnboxRep c) -> X
forall a. (Unbox a, Ord a) => Vector a -> X
U.minIndex Vector (UnboxRep c)
avector
minLastIndexA :: UnboxRepClass c => Array c -> Point
{-# INLINE minLastIndexA #-}
minLastIndexA :: Array c -> Point
minLastIndexA Array{..} =
X -> Point
forall a. Enum a => X -> a
toEnum
(X -> Point) -> X -> Point
forall a b. (a -> b) -> a -> b
$ (X, UnboxRep c) -> X
forall a b. (a, b) -> a
fst ((X, UnboxRep c) -> X)
-> (Vector (UnboxRep c) -> (X, UnboxRep c))
-> Vector (UnboxRep c)
-> X
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((X, UnboxRep c) -> (X, UnboxRep c) -> (X, UnboxRep c))
-> Bundle Vector (X, UnboxRep c) -> (X, UnboxRep c)
forall a (v :: * -> *). (a -> a -> a) -> Bundle v a -> a
Bundle.foldl1' (X, UnboxRep c) -> (X, UnboxRep c) -> (X, UnboxRep c)
forall b a. Ord b => (a, b) -> (a, b) -> (a, b)
imin (Bundle Vector (X, UnboxRep c) -> (X, UnboxRep c))
-> (Vector (UnboxRep c) -> Bundle Vector (X, UnboxRep c))
-> Vector (UnboxRep c)
-> (X, UnboxRep c)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bundle Vector (UnboxRep c) -> Bundle Vector (X, UnboxRep c)
forall (v :: * -> *) a. Bundle v a -> Bundle v (X, a)
Bundle.indexed (Bundle Vector (UnboxRep c) -> Bundle Vector (X, UnboxRep c))
-> (Vector (UnboxRep c) -> Bundle Vector (UnboxRep c))
-> Vector (UnboxRep c)
-> Bundle Vector (X, UnboxRep c)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector (UnboxRep c) -> Bundle Vector (UnboxRep c)
forall (v :: * -> *) a. Vector v a => v a -> Bundle v a
G.stream
(Vector (UnboxRep c) -> X) -> Vector (UnboxRep c) -> X
forall a b. (a -> b) -> a -> b
$ Vector (UnboxRep c)
avector
where
imin :: (a, b) -> (a, b) -> (a, b)
imin (i :: a
i, x :: b
x) (j :: a
j, y :: b
y) = a
i a -> (a, b) -> (a, b)
forall a b. a -> b -> b
`seq` a
j a -> (a, b) -> (a, b)
forall a b. a -> b -> b
`seq` if b
x b -> b -> Bool
forall a. Ord a => a -> a -> Bool
>= b
y then (a
j, b
y) else (a
i, b
x)
minIndexesA :: UnboxRepClass c => Array c -> [Point]
{-# INLINE minIndexesA #-}
minIndexesA :: Array c -> [Point]
minIndexesA Array{..} =
((X, UnboxRep c) -> [Point] -> [Point])
-> [Point] -> Bundle Vector (X, UnboxRep c) -> [Point]
forall a b (v :: * -> *). (a -> b -> b) -> b -> Bundle v a -> b
Bundle.foldr (X, UnboxRep c) -> [Point] -> [Point]
imin [] (Bundle Vector (X, UnboxRep c) -> [Point])
-> (Vector (UnboxRep c) -> Bundle Vector (X, UnboxRep c))
-> Vector (UnboxRep c)
-> [Point]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bundle Vector (UnboxRep c) -> Bundle Vector (X, UnboxRep c)
forall (v :: * -> *) a. Bundle v a -> Bundle v (X, a)
Bundle.indexed (Bundle Vector (UnboxRep c) -> Bundle Vector (X, UnboxRep c))
-> (Vector (UnboxRep c) -> Bundle Vector (UnboxRep c))
-> Vector (UnboxRep c)
-> Bundle Vector (X, UnboxRep c)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector (UnboxRep c) -> Bundle Vector (UnboxRep c)
forall (v :: * -> *) a. Vector v a => v a -> Bundle v a
G.stream (Vector (UnboxRep c) -> [Point]) -> Vector (UnboxRep c) -> [Point]
forall a b. (a -> b) -> a -> b
$ Vector (UnboxRep c)
avector
where
imin :: (X, UnboxRep c) -> [Point] -> [Point]
imin (i :: X
i, x :: UnboxRep c
x) acc :: [Point]
acc = if UnboxRep c
x UnboxRep c -> UnboxRep c -> Bool
forall a. Eq a => a -> a -> Bool
== UnboxRep c
minE
then let !j :: Point
j = X -> Point
forall a. Enum a => X -> a
toEnum X
i
in Point
j Point -> [Point] -> [Point]
forall a. a -> [a] -> [a]
: [Point]
acc
else [Point]
acc
!minE :: UnboxRep c
minE = Vector (UnboxRep c) -> UnboxRep c
forall a. (Unbox a, Ord a) => Vector a -> a
U.minimum Vector (UnboxRep c)
avector
maxIndexA :: UnboxRepClass c => Array c -> Point
{-# INLINE maxIndexA #-}
maxIndexA :: Array c -> Point
maxIndexA Array{..} = X -> Point
forall a. Enum a => X -> a
toEnum (X -> Point) -> X -> Point
forall a b. (a -> b) -> a -> b
$ Vector (UnboxRep c) -> X
forall a. (Unbox a, Ord a) => Vector a -> X
U.maxIndex Vector (UnboxRep c)
avector
maxIndexByA :: UnboxRepClass c => (c -> c -> Ordering) -> Array c -> Point
{-# INLINE maxIndexByA #-}
maxIndexByA :: (c -> c -> Ordering) -> Array c -> Point
maxIndexByA f :: c -> c -> Ordering
f Array{..} =
let g :: UnboxRep c -> UnboxRep c -> Ordering
g a :: UnboxRep c
a b :: UnboxRep c
b = c -> c -> Ordering
f (UnboxRep c -> c
forall c. UnboxRepClass c => UnboxRep c -> c
fromUnboxRep UnboxRep c
a) (UnboxRep c -> c
forall c. UnboxRepClass c => UnboxRep c -> c
fromUnboxRep UnboxRep c
b)
in X -> Point
forall a. Enum a => X -> a
toEnum (X -> Point) -> X -> Point
forall a b. (a -> b) -> a -> b
$ (UnboxRep c -> UnboxRep c -> Ordering) -> Vector (UnboxRep c) -> X
forall a. Unbox a => (a -> a -> Ordering) -> Vector a -> X
U.maxIndexBy UnboxRep c -> UnboxRep c -> Ordering
g Vector (UnboxRep c)
avector
maxLastIndexA :: UnboxRepClass c => Array c -> Point
{-# INLINE maxLastIndexA #-}
maxLastIndexA :: Array c -> Point
maxLastIndexA Array{..} =
X -> Point
forall a. Enum a => X -> a
toEnum
(X -> Point) -> X -> Point
forall a b. (a -> b) -> a -> b
$ (X, UnboxRep c) -> X
forall a b. (a, b) -> a
fst ((X, UnboxRep c) -> X)
-> (Vector (UnboxRep c) -> (X, UnboxRep c))
-> Vector (UnboxRep c)
-> X
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((X, UnboxRep c) -> (X, UnboxRep c) -> (X, UnboxRep c))
-> Bundle Vector (X, UnboxRep c) -> (X, UnboxRep c)
forall a (v :: * -> *). (a -> a -> a) -> Bundle v a -> a
Bundle.foldl1' (X, UnboxRep c) -> (X, UnboxRep c) -> (X, UnboxRep c)
forall b a. Ord b => (a, b) -> (a, b) -> (a, b)
imax (Bundle Vector (X, UnboxRep c) -> (X, UnboxRep c))
-> (Vector (UnboxRep c) -> Bundle Vector (X, UnboxRep c))
-> Vector (UnboxRep c)
-> (X, UnboxRep c)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bundle Vector (UnboxRep c) -> Bundle Vector (X, UnboxRep c)
forall (v :: * -> *) a. Bundle v a -> Bundle v (X, a)
Bundle.indexed (Bundle Vector (UnboxRep c) -> Bundle Vector (X, UnboxRep c))
-> (Vector (UnboxRep c) -> Bundle Vector (UnboxRep c))
-> Vector (UnboxRep c)
-> Bundle Vector (X, UnboxRep c)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector (UnboxRep c) -> Bundle Vector (UnboxRep c)
forall (v :: * -> *) a. Vector v a => v a -> Bundle v a
G.stream
(Vector (UnboxRep c) -> X) -> Vector (UnboxRep c) -> X
forall a b. (a -> b) -> a -> b
$ Vector (UnboxRep c)
avector
where
imax :: (a, b) -> (a, b) -> (a, b)
imax (i :: a
i, x :: b
x) (j :: a
j, y :: b
y) = a
i a -> (a, b) -> (a, b)
forall a b. a -> b -> b
`seq` a
j a -> (a, b) -> (a, b)
forall a b. a -> b -> b
`seq` if b
x b -> b -> Bool
forall a. Ord a => a -> a -> Bool
<= b
y then (a
j, b
y) else (a
i, b
x)
forceA :: UnboxRepClass c => Array c -> Array c
{-# INLINE forceA #-}
forceA :: Array c -> Array c
forceA Array{..} = $WArray :: forall c. X -> X -> Vector (UnboxRep c) -> Array c
Array{avector :: Vector (UnboxRep c)
avector = Vector (UnboxRep c) -> Vector (UnboxRep c)
forall a. Unbox a => Vector a -> Vector a
U.force Vector (UnboxRep c)
avector, ..}
fromListA :: UnboxRepClass c => X -> Y -> [c] -> Array c
{-# INLINE fromListA #-}
fromListA :: X -> X -> [c] -> Array c
fromListA axsize :: X
axsize aysize :: X
aysize l :: [c]
l =
$WArray :: forall c. X -> X -> Vector (UnboxRep c) -> Array c
Array{avector :: Vector (UnboxRep c)
avector = X -> [UnboxRep c] -> Vector (UnboxRep c)
forall a. Unbox a => X -> [a] -> Vector a
U.fromListN (X
axsize X -> X -> X
forall a. Num a => a -> a -> a
* X
aysize) ([UnboxRep c] -> Vector (UnboxRep c))
-> [UnboxRep c] -> Vector (UnboxRep c)
forall a b. (a -> b) -> a -> b
$ (c -> UnboxRep c) -> [c] -> [UnboxRep c]
forall a b. (a -> b) -> [a] -> [b]
map c -> UnboxRep c
forall c. UnboxRepClass c => c -> UnboxRep c
toUnboxRep [c]
l, ..}
toListA :: UnboxRepClass c => Array c -> [c]
{-# INLINE toListA #-}
toListA :: Array c -> [c]
toListA Array{..} = (UnboxRep c -> c) -> [UnboxRep c] -> [c]
forall a b. (a -> b) -> [a] -> [b]
map UnboxRep c -> c
forall c. UnboxRepClass c => UnboxRep c -> c
fromUnboxRep ([UnboxRep c] -> [c]) -> [UnboxRep c] -> [c]
forall a b. (a -> b) -> a -> b
$ Vector (UnboxRep c) -> [UnboxRep c]
forall a. Unbox a => Vector a -> [a]
U.toList Vector (UnboxRep c)
avector