{-# LANGUAGE FlexibleContexts, StandaloneDeriving, TypeFamilies #-}
module Game.LambdaHack.Common.PointArray
( UnboxRepClass(..), Array(..)
, empty, (!), accessI, (//), replicateA, unfoldrNA
, foldrA, foldrA', foldlA', ifoldlA', ifoldrA', foldMA'
, mapA, imapA, imapMA_, minIndexesA, maxIndexA, maxIndexByA, maxLastIndexA
, toListA
#ifdef EXPOSE_INTERNAL
, toUnboxRep
#endif
) where
import Prelude ()
import Game.LambdaHack.Core.Prelude
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 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
Bool -> UnboxRep c -> UnboxRep c
forall a. (?callStack::CallStack) => Bool -> a -> a
assert (c
c c -> c -> Bool
forall a. Ord a => a -> a -> Bool
<= UnboxRep c -> c
forall c. UnboxRepClass c => UnboxRep c -> c
fromUnboxRep UnboxRep c
forall a. Bounded a => a
maxBound) (UnboxRep c -> UnboxRep c) -> UnboxRep c -> UnboxRep c
forall a b. (a -> b) -> a -> b
$
#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, ..}
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, ..}
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, ..}
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 -> a -> a
f (c -> a -> a) -> (UnboxRep c -> c) -> UnboxRep c -> a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UnboxRep c -> c
forall c. UnboxRepClass c => UnboxRep c -> c
fromUnboxRep) 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 -> a -> a
f (c -> a -> a) -> (UnboxRep c -> c) -> UnboxRep c -> a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UnboxRep c -> c
forall c. UnboxRepClass c => UnboxRep c -> c
fromUnboxRep) 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
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
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
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)
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