module Apecs.Experimental.Util
(
quantize, flatten, inbounds, region, flatten',
) where
import Control.Applicative (liftA2)
{-# INLINE quantize #-}
quantize :: (Fractional (v a), Integral b, RealFrac a, Functor v)
=> v a
-> v a
-> v b
quantize :: v a -> v a -> v b
quantize v a
cell v a
vec = a -> b
forall a b. (RealFrac a, Integral b) => a -> b
floor (a -> b) -> v a -> v b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> v a
vecv a -> v a -> v a
forall a. Fractional a => a -> a -> a
/v a
cell
{-# INLINE flatten #-}
flatten :: (Applicative v, Integral a, Foldable v)
=> v a
-> v a -> Maybe a
flatten :: v a -> v a -> Maybe a
flatten v a
size v a
vec = if v a -> v a -> Bool
forall a (v :: * -> *).
(Num a, Ord a, Applicative v, Foldable v) =>
v a -> v a -> Bool
inbounds v a
size v a
vec then a -> Maybe a
forall a. a -> Maybe a
Just (v a -> v a -> a
forall (v :: * -> *) a.
(Applicative v, Integral a, Foldable v) =>
v a -> v a -> a
flatten' v a
size v a
vec) else Maybe a
forall a. Maybe a
Nothing
{-# INLINE inbounds #-}
inbounds :: (Num a, Ord a, Applicative v, Foldable v)
=> v a
-> v a -> Bool
inbounds :: v a -> v a -> Bool
inbounds v a
size v a
vec = v Bool -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
and ((a -> a -> Bool) -> v a -> v a -> v Bool
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (\a
v a
s -> a
v a -> a -> Bool
forall a. Ord a => a -> a -> Bool
>= a
0 Bool -> Bool -> Bool
&& a
v a -> a -> Bool
forall a. Ord a => a -> a -> Bool
<= a
s) v a
vec v a
size)
{-# INLINE region #-}
region :: (Enum a, Applicative v, Traversable v)
=> v a
-> v a
-> [v a]
region :: v a -> v a -> [v a]
region v a
a v a
b = v [a] -> [v a]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
sequence (v [a] -> [v a]) -> v [a] -> [v a]
forall a b. (a -> b) -> a -> b
$ (a -> a -> [a]) -> v a -> v a -> v [a]
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 a -> a -> [a]
forall a. Enum a => a -> a -> [a]
enumFromTo v a
a v a
b
{-# INLINE flatten' #-}
flatten' :: (Applicative v, Integral a, Foldable v)
=> v a
-> v a -> a
flatten' :: v a -> v a -> a
flatten' v a
size v a
vec = ((a, a) -> a -> a) -> a -> v (a, a) -> a
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\(a
n,a
x) a
acc -> a
na -> a -> a
forall a. Num a => a -> a -> a
*a
acc a -> a -> a
forall a. Num a => a -> a -> a
+ a
x) a
0 ((a -> a -> (a, a)) -> v a -> v a -> v (a, a)
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (,) v a
size v a
vec)