{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE DeriveTraversable #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TupleSections #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
module Data.Chimera
(
memoize
, memoizeFix
, Chimera
, VChimera
, UChimera
, tabulate
, tabulateFix
, tabulateFix'
, iterate
, unfoldr
, cycle
, fromListWithDef
, fromVectorWithDef
, interleave
, index
, toList
, tabulateM
, tabulateFixM
, tabulateFixM'
, iterateM
, unfoldrM
, mapSubvectors
, traverseSubvectors
, zipSubvectors
, zipWithSubvectors
, zipWithMSubvectors
, sliceSubvectors
) where
import Prelude hiding ((^), (*), div, fromIntegral, not, and, or, cycle, iterate, drop)
import Control.Applicative
import Control.Monad.Fix
import Control.Monad.Trans.Class
import qualified Control.Monad.Trans.State.Lazy as LazyState
import Control.Monad.Zip
import Data.Bits
import qualified Data.Foldable as F
import Data.Functor.Identity
import qualified Data.Primitive.Array as A
import qualified Data.Vector as V
import qualified Data.Vector.Generic as G
import qualified Data.Vector.Unboxed as U
#ifdef MIN_VERSION_mtl
import Control.Monad.Reader (MonadReader, ask, local)
#endif
#ifdef MIN_VERSION_distributive
import Data.Distributive
#ifdef MIN_VERSION_adjunctions
import qualified Data.Functor.Rep as Rep
#endif
#endif
import Data.Chimera.FromIntegral
newtype Chimera v a = Chimera { forall (v :: * -> *) a. Chimera v a -> Array (v a)
unChimera :: A.Array (v a) }
deriving
( (forall a b. (a -> b) -> Chimera v a -> Chimera v b)
-> (forall a b. a -> Chimera v b -> Chimera v a)
-> Functor (Chimera v)
forall a b. a -> Chimera v b -> Chimera v a
forall a b. (a -> b) -> Chimera v a -> Chimera v b
forall (v :: * -> *) a b.
Functor v =>
a -> Chimera v b -> Chimera v a
forall (v :: * -> *) a b.
Functor v =>
(a -> b) -> Chimera v a -> Chimera v b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall (v :: * -> *) a b.
Functor v =>
(a -> b) -> Chimera v a -> Chimera v b
fmap :: forall a b. (a -> b) -> Chimera v a -> Chimera v b
$c<$ :: forall (v :: * -> *) a b.
Functor v =>
a -> Chimera v b -> Chimera v a
<$ :: forall a b. a -> Chimera v b -> Chimera v a
Functor
, (forall m. Monoid m => Chimera v m -> m)
-> (forall m a. Monoid m => (a -> m) -> Chimera v a -> m)
-> (forall m a. Monoid m => (a -> m) -> Chimera v a -> m)
-> (forall a b. (a -> b -> b) -> b -> Chimera v a -> b)
-> (forall a b. (a -> b -> b) -> b -> Chimera v a -> b)
-> (forall b a. (b -> a -> b) -> b -> Chimera v a -> b)
-> (forall b a. (b -> a -> b) -> b -> Chimera v a -> b)
-> (forall a. (a -> a -> a) -> Chimera v a -> a)
-> (forall a. (a -> a -> a) -> Chimera v a -> a)
-> (forall a. Chimera v a -> [a])
-> (forall a. Chimera v a -> Bool)
-> (forall a. Chimera v a -> Int)
-> (forall a. Eq a => a -> Chimera v a -> Bool)
-> (forall a. Ord a => Chimera v a -> a)
-> (forall a. Ord a => Chimera v a -> a)
-> (forall a. Num a => Chimera v a -> a)
-> (forall a. Num a => Chimera v a -> a)
-> Foldable (Chimera v)
forall a. Eq a => a -> Chimera v a -> Bool
forall a. Num a => Chimera v a -> a
forall a. Ord a => Chimera v a -> a
forall m. Monoid m => Chimera v m -> m
forall a. Chimera v a -> Bool
forall a. Chimera v a -> Int
forall a. Chimera v a -> [a]
forall a. (a -> a -> a) -> Chimera v a -> a
forall m a. Monoid m => (a -> m) -> Chimera v a -> m
forall b a. (b -> a -> b) -> b -> Chimera v a -> b
forall a b. (a -> b -> b) -> b -> Chimera v a -> b
forall (v :: * -> *) a.
(Foldable v, Eq a) =>
a -> Chimera v a -> Bool
forall (v :: * -> *) a. (Foldable v, Num a) => Chimera v a -> a
forall (v :: * -> *) a. (Foldable v, Ord a) => Chimera v a -> a
forall (v :: * -> *) m. (Foldable v, Monoid m) => Chimera v m -> m
forall (v :: * -> *) a. Foldable v => Chimera v a -> Bool
forall (v :: * -> *) a. Foldable v => Chimera v a -> Int
forall (v :: * -> *) a. Foldable v => Chimera v a -> [a]
forall (v :: * -> *) a.
Foldable v =>
(a -> a -> a) -> Chimera v a -> a
forall (v :: * -> *) m a.
(Foldable v, Monoid m) =>
(a -> m) -> Chimera v a -> m
forall (v :: * -> *) b a.
Foldable v =>
(b -> a -> b) -> b -> Chimera v a -> b
forall (v :: * -> *) a b.
Foldable v =>
(a -> b -> b) -> b -> Chimera v 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 (v :: * -> *) m. (Foldable v, Monoid m) => Chimera v m -> m
fold :: forall m. Monoid m => Chimera v m -> m
$cfoldMap :: forall (v :: * -> *) m a.
(Foldable v, Monoid m) =>
(a -> m) -> Chimera v a -> m
foldMap :: forall m a. Monoid m => (a -> m) -> Chimera v a -> m
$cfoldMap' :: forall (v :: * -> *) m a.
(Foldable v, Monoid m) =>
(a -> m) -> Chimera v a -> m
foldMap' :: forall m a. Monoid m => (a -> m) -> Chimera v a -> m
$cfoldr :: forall (v :: * -> *) a b.
Foldable v =>
(a -> b -> b) -> b -> Chimera v a -> b
foldr :: forall a b. (a -> b -> b) -> b -> Chimera v a -> b
$cfoldr' :: forall (v :: * -> *) a b.
Foldable v =>
(a -> b -> b) -> b -> Chimera v a -> b
foldr' :: forall a b. (a -> b -> b) -> b -> Chimera v a -> b
$cfoldl :: forall (v :: * -> *) b a.
Foldable v =>
(b -> a -> b) -> b -> Chimera v a -> b
foldl :: forall b a. (b -> a -> b) -> b -> Chimera v a -> b
$cfoldl' :: forall (v :: * -> *) b a.
Foldable v =>
(b -> a -> b) -> b -> Chimera v a -> b
foldl' :: forall b a. (b -> a -> b) -> b -> Chimera v a -> b
$cfoldr1 :: forall (v :: * -> *) a.
Foldable v =>
(a -> a -> a) -> Chimera v a -> a
foldr1 :: forall a. (a -> a -> a) -> Chimera v a -> a
$cfoldl1 :: forall (v :: * -> *) a.
Foldable v =>
(a -> a -> a) -> Chimera v a -> a
foldl1 :: forall a. (a -> a -> a) -> Chimera v a -> a
$ctoList :: forall (v :: * -> *) a. Foldable v => Chimera v a -> [a]
toList :: forall a. Chimera v a -> [a]
$cnull :: forall (v :: * -> *) a. Foldable v => Chimera v a -> Bool
null :: forall a. Chimera v a -> Bool
$clength :: forall (v :: * -> *) a. Foldable v => Chimera v a -> Int
length :: forall a. Chimera v a -> Int
$celem :: forall (v :: * -> *) a.
(Foldable v, Eq a) =>
a -> Chimera v a -> Bool
elem :: forall a. Eq a => a -> Chimera v a -> Bool
$cmaximum :: forall (v :: * -> *) a. (Foldable v, Ord a) => Chimera v a -> a
maximum :: forall a. Ord a => Chimera v a -> a
$cminimum :: forall (v :: * -> *) a. (Foldable v, Ord a) => Chimera v a -> a
minimum :: forall a. Ord a => Chimera v a -> a
$csum :: forall (v :: * -> *) a. (Foldable v, Num a) => Chimera v a -> a
sum :: forall a. Num a => Chimera v a -> a
$cproduct :: forall (v :: * -> *) a. (Foldable v, Num a) => Chimera v a -> a
product :: forall a. Num a => Chimera v a -> a
Foldable
, Functor (Chimera v)
Foldable (Chimera v)
(Functor (Chimera v), Foldable (Chimera v)) =>
(forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Chimera v a -> f (Chimera v b))
-> (forall (f :: * -> *) a.
Applicative f =>
Chimera v (f a) -> f (Chimera v a))
-> (forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Chimera v a -> m (Chimera v b))
-> (forall (m :: * -> *) a.
Monad m =>
Chimera v (m a) -> m (Chimera v a))
-> Traversable (Chimera v)
forall (t :: * -> *).
(Functor t, Foldable t) =>
(forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> t a -> f (t b))
-> (forall (f :: * -> *) a. Applicative f => t (f a) -> f (t a))
-> (forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> t a -> m (t b))
-> (forall (m :: * -> *) a. Monad m => t (m a) -> m (t a))
-> Traversable t
forall (v :: * -> *). Traversable v => Functor (Chimera v)
forall (v :: * -> *). Traversable v => Foldable (Chimera v)
forall (v :: * -> *) (m :: * -> *) a.
(Traversable v, Monad m) =>
Chimera v (m a) -> m (Chimera v a)
forall (v :: * -> *) (f :: * -> *) a.
(Traversable v, Applicative f) =>
Chimera v (f a) -> f (Chimera v a)
forall (v :: * -> *) (m :: * -> *) a b.
(Traversable v, Monad m) =>
(a -> m b) -> Chimera v a -> m (Chimera v b)
forall (v :: * -> *) (f :: * -> *) a b.
(Traversable v, Applicative f) =>
(a -> f b) -> Chimera v a -> f (Chimera v b)
forall (m :: * -> *) a.
Monad m =>
Chimera v (m a) -> m (Chimera v a)
forall (f :: * -> *) a.
Applicative f =>
Chimera v (f a) -> f (Chimera v a)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Chimera v a -> m (Chimera v b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Chimera v a -> f (Chimera v b)
$ctraverse :: forall (v :: * -> *) (f :: * -> *) a b.
(Traversable v, Applicative f) =>
(a -> f b) -> Chimera v a -> f (Chimera v b)
traverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Chimera v a -> f (Chimera v b)
$csequenceA :: forall (v :: * -> *) (f :: * -> *) a.
(Traversable v, Applicative f) =>
Chimera v (f a) -> f (Chimera v a)
sequenceA :: forall (f :: * -> *) a.
Applicative f =>
Chimera v (f a) -> f (Chimera v a)
$cmapM :: forall (v :: * -> *) (m :: * -> *) a b.
(Traversable v, Monad m) =>
(a -> m b) -> Chimera v a -> m (Chimera v b)
mapM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Chimera v a -> m (Chimera v b)
$csequence :: forall (v :: * -> *) (m :: * -> *) a.
(Traversable v, Monad m) =>
Chimera v (m a) -> m (Chimera v a)
sequence :: forall (m :: * -> *) a.
Monad m =>
Chimera v (m a) -> m (Chimera v a)
Traversable
)
type VChimera = Chimera V.Vector
type UChimera = Chimera U.Vector
instance Applicative (Chimera V.Vector) where
pure :: forall a. a -> Chimera Vector a
pure a
a = Array (Vector a) -> Chimera Vector a
forall (v :: * -> *) a. Array (v a) -> Chimera v a
Chimera (Array (Vector a) -> Chimera Vector a)
-> Array (Vector a) -> Chimera Vector a
forall a b. (a -> b) -> a -> b
$ Int -> [Vector a] -> Array (Vector a)
forall a. Int -> [a] -> Array a
A.arrayFromListN (Int
bits Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) ([Vector a] -> Array (Vector a)) -> [Vector a] -> Array (Vector a)
forall a b. (a -> b) -> a -> b
$
a -> Vector a
forall (v :: * -> *) a. Vector v a => a -> v a
G.singleton a
a Vector a -> [Vector a] -> [Vector a]
forall a. a -> [a] -> [a]
: (Int -> Vector a) -> [Int] -> [Vector a]
forall a b. (a -> b) -> [a] -> [b]
map (\Int
k -> Int -> a -> Vector a
forall (v :: * -> *) a. Vector v a => Int -> a -> v a
G.replicate (Int
1 Int -> Int -> Int
forall a. Bits a => a -> Int -> a
`shiftL` Int
k) a
a) [Int
0 .. Int
bits Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1]
<*> :: forall a b.
Chimera Vector (a -> b) -> Chimera Vector a -> Chimera Vector b
(<*>) = (Vector (a -> b) -> Vector a -> Vector b)
-> Chimera Vector (a -> b) -> Chimera Vector a -> Chimera Vector b
forall (u :: * -> *) a (v :: * -> *) b (w :: * -> *) c.
(Vector u a, Vector v b, Vector w c) =>
(u a -> v b -> w c) -> Chimera u a -> Chimera v b -> Chimera w c
zipWithSubvectors Vector (a -> b) -> Vector a -> Vector b
forall a b. Vector (a -> b) -> Vector a -> Vector b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
(<*>)
#if __GLASGOW_HASKELL__ > 801
liftA2 :: forall a b c.
(a -> b -> c)
-> Chimera Vector a -> Chimera Vector b -> Chimera Vector c
liftA2 a -> b -> c
f = (Vector a -> Vector b -> Vector c)
-> Chimera Vector a -> Chimera Vector b -> Chimera Vector c
forall (u :: * -> *) a (v :: * -> *) b (w :: * -> *) c.
(Vector u a, Vector v b, Vector w c) =>
(u a -> v b -> w c) -> Chimera u a -> Chimera v b -> Chimera w c
zipWithSubvectors ((a -> b -> c) -> Vector a -> Vector b -> Vector c
forall a b c. (a -> b -> c) -> Vector a -> Vector b -> Vector c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 a -> b -> c
f)
#endif
instance Monad (Chimera V.Vector) where
Chimera Vector a
m >>= :: forall a b.
Chimera Vector a -> (a -> Chimera Vector b) -> Chimera Vector b
>>= a -> Chimera Vector b
f = (Word -> b) -> Chimera Vector b
forall (v :: * -> *) a. Vector v a => (Word -> a) -> Chimera v a
tabulate ((Word -> b) -> Chimera Vector b)
-> (Word -> b) -> Chimera Vector b
forall a b. (a -> b) -> a -> b
$ \Word
w -> Chimera Vector b -> Word -> b
forall (v :: * -> *) a. Vector v a => Chimera v a -> Word -> a
index (a -> Chimera Vector b
f (Chimera Vector a -> Word -> a
forall (v :: * -> *) a. Vector v a => Chimera v a -> Word -> a
index Chimera Vector a
m Word
w)) Word
w
instance MonadFix (Chimera V.Vector) where
mfix :: forall a. (a -> Chimera Vector a) -> Chimera Vector a
mfix = (Word -> a) -> Chimera Vector a
forall (v :: * -> *) a. Vector v a => (Word -> a) -> Chimera v a
tabulate ((Word -> a) -> Chimera Vector a)
-> ((a -> Chimera Vector a) -> Word -> a)
-> (a -> Chimera Vector a)
-> Chimera Vector a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> Word -> a) -> Word -> a
forall a. (a -> Word -> a) -> Word -> a
forall (m :: * -> *) a. MonadFix m => (a -> m a) -> m a
mfix ((a -> Word -> a) -> Word -> a)
-> ((a -> Chimera Vector a) -> a -> Word -> a)
-> (a -> Chimera Vector a)
-> Word
-> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Chimera Vector a -> Word -> a)
-> (a -> Chimera Vector a) -> a -> Word -> a
forall a b. (a -> b) -> (a -> a) -> a -> b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Chimera Vector a -> Word -> a
forall (v :: * -> *) a. Vector v a => Chimera v a -> Word -> a
index
instance MonadZip (Chimera V.Vector) where
mzip :: forall a b.
Chimera Vector a -> Chimera Vector b -> Chimera Vector (a, b)
mzip = (Vector a -> Vector b -> Vector (a, b))
-> Chimera Vector a -> Chimera Vector b -> Chimera Vector (a, b)
forall (u :: * -> *) a (v :: * -> *) b (w :: * -> *) c.
(Vector u a, Vector v b, Vector w c) =>
(u a -> v b -> w c) -> Chimera u a -> Chimera v b -> Chimera w c
zipWithSubvectors Vector a -> Vector b -> Vector (a, b)
forall a b. Vector a -> Vector b -> Vector (a, b)
forall (m :: * -> *) a b. MonadZip m => m a -> m b -> m (a, b)
mzip
mzipWith :: forall a b c.
(a -> b -> c)
-> Chimera Vector a -> Chimera Vector b -> Chimera Vector c
mzipWith = (Vector a -> Vector b -> Vector c)
-> Chimera Vector a -> Chimera Vector b -> Chimera Vector c
forall (u :: * -> *) a (v :: * -> *) b (w :: * -> *) c.
(Vector u a, Vector v b, Vector w c) =>
(u a -> v b -> w c) -> Chimera u a -> Chimera v b -> Chimera w c
zipWithSubvectors ((Vector a -> Vector b -> Vector c)
-> Chimera Vector a -> Chimera Vector b -> Chimera Vector c)
-> ((a -> b -> c) -> Vector a -> Vector b -> Vector c)
-> (a -> b -> c)
-> Chimera Vector a
-> Chimera Vector b
-> Chimera Vector c
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> b -> c) -> Vector a -> Vector b -> Vector c
forall a b c. (a -> b -> c) -> Vector a -> Vector b -> Vector c
forall (m :: * -> *) a b c.
MonadZip m =>
(a -> b -> c) -> m a -> m b -> m c
mzipWith
#ifdef MIN_VERSION_mtl
instance MonadReader Word (Chimera V.Vector) where
ask :: Chimera Vector Word
ask = (Word -> Word) -> Chimera Vector Word
forall (v :: * -> *) a. Vector v a => (Word -> a) -> Chimera v a
tabulate Word -> Word
forall a. a -> a
id
local :: forall a. (Word -> Word) -> Chimera Vector a -> Chimera Vector a
local = (Chimera Vector a -> (Word -> Word) -> Chimera Vector a)
-> (Word -> Word) -> Chimera Vector a -> Chimera Vector a
forall a b c. (a -> b -> c) -> b -> a -> c
flip ((Chimera Vector a -> (Word -> Word) -> Chimera Vector a)
-> (Word -> Word) -> Chimera Vector a -> Chimera Vector a)
-> (Chimera Vector a -> (Word -> Word) -> Chimera Vector a)
-> (Word -> Word)
-> Chimera Vector a
-> Chimera Vector a
forall a b. (a -> b) -> a -> b
$ ((Word -> a) -> Chimera Vector a
forall (v :: * -> *) a. Vector v a => (Word -> a) -> Chimera v a
tabulate ((Word -> a) -> Chimera Vector a)
-> ((Word -> Word) -> Word -> a)
-> (Word -> Word)
-> Chimera Vector a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) (((Word -> Word) -> Word -> a)
-> (Word -> Word) -> Chimera Vector a)
-> (Chimera Vector a -> (Word -> Word) -> Word -> a)
-> Chimera Vector a
-> (Word -> Word)
-> Chimera Vector a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Word -> a) -> (Word -> Word) -> Word -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
(.) ((Word -> a) -> (Word -> Word) -> Word -> a)
-> (Chimera Vector a -> Word -> a)
-> Chimera Vector a
-> (Word -> Word)
-> Word
-> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Chimera Vector a -> Word -> a
forall (v :: * -> *) a. Vector v a => Chimera v a -> Word -> a
index
#endif
#ifdef MIN_VERSION_distributive
instance Distributive (Chimera V.Vector) where
distribute :: forall (f :: * -> *) a.
Functor f =>
f (Chimera Vector a) -> Chimera Vector (f a)
distribute = (Word -> f a) -> Chimera Vector (f a)
forall (v :: * -> *) a. Vector v a => (Word -> a) -> Chimera v a
tabulate ((Word -> f a) -> Chimera Vector (f a))
-> (f (Chimera Vector a) -> Word -> f a)
-> f (Chimera Vector a)
-> Chimera Vector (f a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Word -> f (Chimera Vector a) -> f a)
-> f (Chimera Vector a) -> Word -> f a
forall a b c. (a -> b -> c) -> b -> a -> c
flip ((Chimera Vector a -> a) -> f (Chimera Vector a) -> f a
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Chimera Vector a -> a) -> f (Chimera Vector a) -> f a)
-> (Word -> Chimera Vector a -> a)
-> Word
-> f (Chimera Vector a)
-> f a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Chimera Vector a -> Word -> a) -> Word -> Chimera Vector a -> a
forall a b c. (a -> b -> c) -> b -> a -> c
flip Chimera Vector a -> Word -> a
forall (v :: * -> *) a. Vector v a => Chimera v a -> Word -> a
index)
collect :: forall (f :: * -> *) a b.
Functor f =>
(a -> Chimera Vector b) -> f a -> Chimera Vector (f b)
collect a -> Chimera Vector b
f = (Word -> f b) -> Chimera Vector (f b)
forall (v :: * -> *) a. Vector v a => (Word -> a) -> Chimera v a
tabulate ((Word -> f b) -> Chimera Vector (f b))
-> (f a -> Word -> f b) -> f a -> Chimera Vector (f b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Word -> f a -> f b) -> f a -> Word -> f b
forall a b c. (a -> b -> c) -> b -> a -> c
flip ((a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
(<$>) ((a -> b) -> f a -> f b) -> (Word -> a -> b) -> Word -> f a -> f b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Chimera Vector b -> b) -> (a -> Chimera Vector b) -> a -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Chimera Vector b
f) ((Chimera Vector b -> b) -> a -> b)
-> (Word -> Chimera Vector b -> b) -> Word -> a -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Chimera Vector b -> Word -> b) -> Word -> Chimera Vector b -> b
forall a b c. (a -> b -> c) -> b -> a -> c
flip Chimera Vector b -> Word -> b
forall (v :: * -> *) a. Vector v a => Chimera v a -> Word -> a
index)
#ifdef MIN_VERSION_adjunctions
instance Rep.Representable (Chimera V.Vector) where
type Rep (Chimera V.Vector) = Word
tabulate :: forall a. (Rep (Chimera Vector) -> a) -> Chimera Vector a
tabulate = (Word -> a) -> Chimera Vector a
(Rep (Chimera Vector) -> a) -> Chimera Vector a
forall (v :: * -> *) a. Vector v a => (Word -> a) -> Chimera v a
tabulate
index :: forall a. Chimera Vector a -> Rep (Chimera Vector) -> a
index = Chimera Vector a -> Word -> a
Chimera Vector a -> Rep (Chimera Vector) -> a
forall (v :: * -> *) a. Vector v a => Chimera v a -> Word -> a
index
#endif
#endif
bits :: Int
bits :: Int
bits = Word -> Int
forall b. FiniteBits b => b -> Int
finiteBitSize (Word
0 :: Word)
tabulate :: G.Vector v a => (Word -> a) -> Chimera v a
tabulate :: forall (v :: * -> *) a. Vector v a => (Word -> a) -> Chimera v a
tabulate Word -> a
f = Identity (Chimera v a) -> Chimera v a
forall a. Identity a -> a
runIdentity (Identity (Chimera v a) -> Chimera v a)
-> Identity (Chimera v a) -> Chimera v a
forall a b. (a -> b) -> a -> b
$ (Word -> Identity a) -> Identity (Chimera v a)
forall (m :: * -> *) (v :: * -> *) a.
(Monad m, Vector v a) =>
(Word -> m a) -> m (Chimera v a)
tabulateM (a -> Identity a
forall a. a -> Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (a -> Identity a) -> (Word -> a) -> Word -> Identity a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word -> a
f)
generateArrayM :: Monad m => Int -> (Int -> m a) -> m (A.Array a)
generateArrayM :: forall (m :: * -> *) a.
Monad m =>
Int -> (Int -> m a) -> m (Array a)
generateArrayM Int
n Int -> m a
f = Int -> [a] -> Array a
forall a. Int -> [a] -> Array a
A.arrayFromListN Int
n ([a] -> Array a) -> m [a] -> m (Array a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Int -> m a) -> [Int] -> m [a]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> [a] -> f [b]
traverse Int -> m a
f [Int
0..Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1]
tabulateM
:: (Monad m, G.Vector v a)
=> (Word -> m a)
-> m (Chimera v a)
tabulateM :: forall (m :: * -> *) (v :: * -> *) a.
(Monad m, Vector v a) =>
(Word -> m a) -> m (Chimera v a)
tabulateM Word -> m a
f = Array (v a) -> Chimera v a
forall (v :: * -> *) a. Array (v a) -> Chimera v a
Chimera (Array (v a) -> Chimera v a) -> m (Array (v a)) -> m (Chimera v a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> (Int -> m (v a)) -> m (Array (v a))
forall (m :: * -> *) a.
Monad m =>
Int -> (Int -> m a) -> m (Array a)
generateArrayM (Int
bits Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) Int -> m (v a)
tabulateSubVector
where
tabulateSubVector :: Int -> m (v a)
tabulateSubVector Int
0 = a -> v a
forall (v :: * -> *) a. Vector v a => a -> v a
G.singleton (a -> v a) -> m a -> m (v a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Word -> m a
f Word
0
tabulateSubVector Int
i = Int -> (Int -> m a) -> m (v a)
forall (m :: * -> *) (v :: * -> *) a.
(Monad m, Vector v a) =>
Int -> (Int -> m a) -> m (v a)
G.generateM Int
ii (\Int
j -> Word -> m a
f (Int -> Word
int2word (Int
ii Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
j)))
where
ii :: Int
ii = Int
1 Int -> Int -> Int
forall a. Bits a => a -> Int -> a
`unsafeShiftL` (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)
{-# SPECIALIZE tabulateM :: G.Vector v a => (Word -> Identity a) -> Identity (Chimera v a) #-}
tabulateFix :: G.Vector v a => ((Word -> a) -> Word -> a) -> Chimera v a
tabulateFix :: forall (v :: * -> *) a.
Vector v a =>
((Word -> a) -> Word -> a) -> Chimera v a
tabulateFix (Word -> a) -> Word -> a
uf = Identity (Chimera v a) -> Chimera v a
forall a. Identity a -> a
runIdentity (Identity (Chimera v a) -> Chimera v a)
-> Identity (Chimera v a) -> Chimera v a
forall a b. (a -> b) -> a -> b
$ ((Word -> Identity a) -> Word -> Identity a)
-> Identity (Chimera v a)
forall (m :: * -> *) (v :: * -> *) a.
(Monad m, Vector v a) =>
((Word -> m a) -> Word -> m a) -> m (Chimera v a)
tabulateFixM ((a -> Identity a
forall a. a -> Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (a -> Identity a) -> (Word -> a) -> Word -> Identity a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((Word -> a) -> Word -> Identity a)
-> ((Word -> Identity a) -> Word -> a)
-> (Word -> Identity a)
-> Word
-> Identity a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Word -> a) -> Word -> a
uf ((Word -> a) -> Word -> a)
-> ((Word -> Identity a) -> Word -> a)
-> (Word -> Identity a)
-> Word
-> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Identity a -> a
forall a. Identity a -> a
runIdentity (Identity a -> a) -> (Word -> Identity a) -> Word -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.))
tabulateFix' :: G.Vector v a => ((Word -> a) -> Word -> a) -> Chimera v a
tabulateFix' :: forall (v :: * -> *) a.
Vector v a =>
((Word -> a) -> Word -> a) -> Chimera v a
tabulateFix' (Word -> a) -> Word -> a
uf = Identity (Chimera v a) -> Chimera v a
forall a. Identity a -> a
runIdentity (Identity (Chimera v a) -> Chimera v a)
-> Identity (Chimera v a) -> Chimera v a
forall a b. (a -> b) -> a -> b
$ ((Word -> Identity a) -> Word -> Identity a)
-> Identity (Chimera v a)
forall (m :: * -> *) (v :: * -> *) a.
(Monad m, Vector v a) =>
((Word -> m a) -> Word -> m a) -> m (Chimera v a)
tabulateFixM' ((a -> Identity a
forall a. a -> Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (a -> Identity a) -> (Word -> a) -> Word -> Identity a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((Word -> a) -> Word -> Identity a)
-> ((Word -> Identity a) -> Word -> a)
-> (Word -> Identity a)
-> Word
-> Identity a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Word -> a) -> Word -> a
uf ((Word -> a) -> Word -> a)
-> ((Word -> Identity a) -> Word -> a)
-> (Word -> Identity a)
-> Word
-> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Identity a -> a
forall a. Identity a -> a
runIdentity (Identity a -> a) -> (Word -> Identity a) -> Word -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.))
tabulateFixM
:: (Monad m, G.Vector v a)
=> ((Word -> m a) -> Word -> m a)
-> m (Chimera v a)
tabulateFixM :: forall (m :: * -> *) (v :: * -> *) a.
(Monad m, Vector v a) =>
((Word -> m a) -> Word -> m a) -> m (Chimera v a)
tabulateFixM = Strategy -> ((Word -> m a) -> Word -> m a) -> m (Chimera v a)
forall (m :: * -> *) (v :: * -> *) a.
(Monad m, Vector v a) =>
Strategy -> ((Word -> m a) -> Word -> m a) -> m (Chimera v a)
tabulateFixM_ Strategy
Downwards
{-# SPECIALIZE tabulateFixM :: G.Vector v a => ((Word -> Identity a) -> Word -> Identity a) -> Identity (Chimera v a) #-}
tabulateFixM'
:: forall m v a.
(Monad m, G.Vector v a)
=> ((Word -> m a) -> Word -> m a)
-> m (Chimera v a)
tabulateFixM' :: forall (m :: * -> *) (v :: * -> *) a.
(Monad m, Vector v a) =>
((Word -> m a) -> Word -> m a) -> m (Chimera v a)
tabulateFixM' = Strategy -> ((Word -> m a) -> Word -> m a) -> m (Chimera v a)
forall (m :: * -> *) (v :: * -> *) a.
(Monad m, Vector v a) =>
Strategy -> ((Word -> m a) -> Word -> m a) -> m (Chimera v a)
tabulateFixM_ Strategy
Full
{-# SPECIALIZE tabulateFixM' :: G.Vector v a => ((Word -> Identity a) -> Word -> Identity a) -> Identity (Chimera v a) #-}
data Strategy = Full | Downwards
tabulateFixM_
:: forall m v a.
(Monad m, G.Vector v a)
=> Strategy
-> ((Word -> m a) -> Word -> m a)
-> m (Chimera v a)
tabulateFixM_ :: forall (m :: * -> *) (v :: * -> *) a.
(Monad m, Vector v a) =>
Strategy -> ((Word -> m a) -> Word -> m a) -> m (Chimera v a)
tabulateFixM_ Strategy
strat (Word -> m a) -> Word -> m a
f = m (Chimera v a)
result
where
result :: m (Chimera v a)
result :: m (Chimera v a)
result = Array (v a) -> Chimera v a
forall (v :: * -> *) a. Array (v a) -> Chimera v a
Chimera (Array (v a) -> Chimera v a) -> m (Array (v a)) -> m (Chimera v a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> (Int -> m (v a)) -> m (Array (v a))
forall (m :: * -> *) a.
Monad m =>
Int -> (Int -> m a) -> m (Array a)
generateArrayM (Int
bits Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) Int -> m (v a)
tabulateSubVector
tabulateSubVector :: Int -> m (v a)
tabulateSubVector :: Int -> m (v a)
tabulateSubVector Int
0 = a -> v a
forall (v :: * -> *) a. Vector v a => a -> v a
G.singleton (a -> v a) -> m a -> m (v a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> case Strategy
strat of
Strategy
Downwards -> ((Word -> m a) -> Word -> m a) -> Word -> m a
forall a. (a -> a) -> a
fix (Word -> m a) -> Word -> m a
f Word
0
Strategy
Full -> (Word -> m a) -> Word -> m a
f (\Word
k -> (Chimera v a -> Word -> a) -> Word -> Chimera v a -> a
forall a b c. (a -> b -> c) -> b -> a -> c
flip Chimera v a -> Word -> a
forall (v :: * -> *) a. Vector v a => Chimera v a -> Word -> a
index Word
k (Chimera v a -> a) -> m (Chimera v a) -> m a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m (Chimera v a)
result) Word
0
tabulateSubVector Int
i = m (v a)
subResult
where
subResult :: m (v a)
subResult = Int -> (Int -> m a) -> m (v a)
forall (m :: * -> *) (v :: * -> *) a.
(Monad m, Vector v a) =>
Int -> (Int -> m a) -> m (v a)
G.generateM Int
ii (\Int
j -> (Word -> m a) -> Word -> m a
f Word -> m a
fixF (Int -> Word
int2word (Int
ii Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
j)))
subResultBoxed :: m (Vector a)
subResultBoxed = Int -> (Int -> m a) -> m (Vector a)
forall (m :: * -> *) a.
Monad m =>
Int -> (Int -> m a) -> m (Vector a)
V.generateM Int
ii (\Int
j -> (Word -> m a) -> Word -> m a
f Word -> m a
fixF (Int -> Word
int2word (Int
ii Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
j)))
ii :: Int
ii = Int
1 Int -> Int -> Int
forall a. Bits a => a -> Int -> a
`unsafeShiftL` (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)
fixF :: Word -> m a
fixF :: Word -> m a
fixF Word
k
| Word
k Word -> Word -> Bool
forall a. Ord a => a -> a -> Bool
< Int -> Word
int2word Int
ii
= (Chimera v a -> Word -> a) -> Word -> Chimera v a -> a
forall a b c. (a -> b -> c) -> b -> a -> c
flip Chimera v a -> Word -> a
forall (v :: * -> *) a. Vector v a => Chimera v a -> Word -> a
index Word
k (Chimera v a -> a) -> m (Chimera v a) -> m a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m (Chimera v a)
result
| Word
k Word -> Word -> Bool
forall a. Ord a => a -> a -> Bool
<= Int -> Word
int2word Int
ii Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftL` Int
1 Word -> Word -> Word
forall a. Num a => a -> a -> a
- Word
1
= (Vector a -> Int -> a
forall a. Vector a -> Int -> a
`V.unsafeIndex` (Word -> Int
word2int Word
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
ii)) (Vector a -> a) -> m (Vector a) -> m a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m (Vector a)
subResultBoxed
| Bool
otherwise
= case Strategy
strat of
Strategy
Downwards -> (Word -> m a) -> Word -> m a
f Word -> m a
fixF Word
k
Strategy
Full -> (Chimera v a -> Word -> a) -> Word -> Chimera v a -> a
forall a b c. (a -> b -> c) -> b -> a -> c
flip Chimera v a -> Word -> a
forall (v :: * -> *) a. Vector v a => Chimera v a -> Word -> a
index Word
k (Chimera v a -> a) -> m (Chimera v a) -> m a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m (Chimera v a)
result
iterate :: G.Vector v a => (a -> a) -> a -> Chimera v a
iterate :: forall (v :: * -> *) a. Vector v a => (a -> a) -> a -> Chimera v a
iterate a -> a
f = Identity (Chimera v a) -> Chimera v a
forall a. Identity a -> a
runIdentity (Identity (Chimera v a) -> Chimera v a)
-> (a -> Identity (Chimera v a)) -> a -> Chimera v a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> Identity a) -> a -> Identity (Chimera v a)
forall (m :: * -> *) (v :: * -> *) a.
(Monad m, Vector v a) =>
(a -> m a) -> a -> m (Chimera v a)
iterateM (a -> Identity a
forall a. a -> Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (a -> Identity a) -> (a -> a) -> a -> Identity a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> a
f)
iterateListNM :: forall a m. Monad m => Int -> (a -> m a) -> a -> m [a]
iterateListNM :: forall a (m :: * -> *). Monad m => Int -> (a -> m a) -> a -> m [a]
iterateListNM Int
n a -> m a
f = if Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0 then m [a] -> a -> m [a]
forall a b. a -> b -> a
const ([a] -> m [a]
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure []) else Int -> a -> m [a]
go (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)
where
go :: Int -> a -> m [a]
go :: Int -> a -> m [a]
go Int
0 a
s = [a] -> m [a]
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure [a
s]
go Int
k a
s = do
a
fs <- a -> m a
f a
s
(a
s a -> [a] -> [a]
forall a. a -> [a] -> [a]
:) ([a] -> [a]) -> m [a] -> m [a]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> a -> m [a]
go (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) a
fs
iterateM :: (Monad m, G.Vector v a) => (a -> m a) -> a -> m (Chimera v a)
iterateM :: forall (m :: * -> *) (v :: * -> *) a.
(Monad m, Vector v a) =>
(a -> m a) -> a -> m (Chimera v a)
iterateM a -> m a
f a
seed = do
a
nextSeed <- a -> m a
f a
seed
let z :: v a
z = a -> v a
forall (v :: * -> *) a. Vector v a => a -> v a
G.singleton a
seed
[v a]
zs <- Int -> (v a -> m (v a)) -> v a -> m [v a]
forall a (m :: * -> *). Monad m => Int -> (a -> m a) -> a -> m [a]
iterateListNM Int
bits v a -> m (v a)
go (a -> v a
forall (v :: * -> *) a. Vector v a => a -> v a
G.singleton a
nextSeed)
Chimera v a -> m (Chimera v a)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Chimera v a -> m (Chimera v a)) -> Chimera v a -> m (Chimera v a)
forall a b. (a -> b) -> a -> b
$ Array (v a) -> Chimera v a
forall (v :: * -> *) a. Array (v a) -> Chimera v a
Chimera (Array (v a) -> Chimera v a) -> Array (v a) -> Chimera v a
forall a b. (a -> b) -> a -> b
$ Int -> [Item (Array (v a))] -> Array (v a)
forall l. IsList l => Int -> [Item l] -> l
A.fromListN (Int
bits Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) (v a
z v a -> [v a] -> [v a]
forall a. a -> [a] -> [a]
: [v a]
zs)
where
go :: v a -> m (v a)
go v a
vec = do
a
nextSeed <- a -> m a
f (v a -> a
forall (v :: * -> *) a. Vector v a => v a -> a
G.unsafeLast v a
vec)
Int -> (a -> m a) -> a -> m (v a)
forall (m :: * -> *) (v :: * -> *) a.
(Monad m, Vector v a) =>
Int -> (a -> m a) -> a -> m (v a)
G.iterateNM (v a -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int
G.length v a
vec Int -> Int -> Int
forall a. Bits a => a -> Int -> a
`shiftL` Int
1) a -> m a
f a
nextSeed
{-# SPECIALIZE iterateM :: G.Vector v a => (a -> Identity a) -> a -> Identity (Chimera v a) #-}
unfoldr :: G.Vector v b => (a -> (b, a)) -> a -> Chimera v b
unfoldr :: forall (v :: * -> *) b a.
Vector v b =>
(a -> (b, a)) -> a -> Chimera v b
unfoldr a -> (b, a)
f = Identity (Chimera v b) -> Chimera v b
forall a. Identity a -> a
runIdentity (Identity (Chimera v b) -> Chimera v b)
-> (a -> Identity (Chimera v b)) -> a -> Chimera v b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> Identity (b, a)) -> a -> Identity (Chimera v b)
forall (m :: * -> *) (v :: * -> *) b a.
(Monad m, Vector v b) =>
(a -> m (b, a)) -> a -> m (Chimera v b)
unfoldrM ((b, a) -> Identity (b, a)
forall a. a -> Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((b, a) -> Identity (b, a))
-> (a -> (b, a)) -> a -> Identity (b, a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> (b, a)
f)
unfoldrExactVecNM :: forall m a b v. (Monad m, G.Vector v b) => Int -> (a -> m (b, a)) -> a -> m (v b, a)
unfoldrExactVecNM :: forall (m :: * -> *) a b (v :: * -> *).
(Monad m, Vector v b) =>
Int -> (a -> m (b, a)) -> a -> m (v b, a)
unfoldrExactVecNM Int
n a -> m (b, a)
f a
s = (StateT a m (v b, a) -> a -> m (v b, a))
-> a -> StateT a m (v b, a) -> m (v b, a)
forall a b c. (a -> b -> c) -> b -> a -> c
flip StateT a m (v b, a) -> a -> m (v b, a)
forall (m :: * -> *) s a. Monad m => StateT s m a -> s -> m a
LazyState.evalStateT a
s (StateT a m (v b, a) -> m (v b, a))
-> StateT a m (v b, a) -> m (v b, a)
forall a b. (a -> b) -> a -> b
$ do
v b
vec <- Int -> StateT a m b -> StateT a m (v b)
forall (m :: * -> *) (v :: * -> *) a.
(Monad m, Vector v a) =>
Int -> m a -> m (v a)
G.replicateM Int
n StateT a m b
f'
a
seed <- StateT a m a
forall (m :: * -> *) s. Monad m => StateT s m s
LazyState.get
(v b, a) -> StateT a m (v b, a)
forall a. a -> StateT a m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (v b
vec, a
seed)
where
f' :: LazyState.StateT a m b
f' :: StateT a m b
f' = do
a
seed <- StateT a m a
forall (m :: * -> *) s. Monad m => StateT s m s
LazyState.get
(b
value, a
newSeed) <- m (b, a) -> StateT a m (b, a)
forall (m :: * -> *) a. Monad m => m a -> StateT a m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (a -> m (b, a)
f a
seed)
a -> StateT a m ()
forall (m :: * -> *) s. Monad m => s -> StateT s m ()
LazyState.put a
newSeed
b -> StateT a m b
forall a. a -> StateT a m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure b
value
unfoldrM :: (Monad m, G.Vector v b) => (a -> m (b, a)) -> a -> m (Chimera v b)
unfoldrM :: forall (m :: * -> *) (v :: * -> *) b a.
(Monad m, Vector v b) =>
(a -> m (b, a)) -> a -> m (Chimera v b)
unfoldrM a -> m (b, a)
f a
seed = do
let go :: Int -> a -> m [v b]
go Int
n a
s = if Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
bits then [v b] -> m [v b]
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure [] else do
(v b
vec, a
s') <- Int -> (a -> m (b, a)) -> a -> m (v b, a)
forall (m :: * -> *) a b (v :: * -> *).
(Monad m, Vector v b) =>
Int -> (a -> m (b, a)) -> a -> m (v b, a)
unfoldrExactVecNM (Int
1 Int -> Int -> Int
forall a. Bits a => a -> Int -> a
`shiftL` Int
n) a -> m (b, a)
f a
s
[v b]
rest <- Int -> a -> m [v b]
go (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) a
s'
[v b] -> m [v b]
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([v b] -> m [v b]) -> [v b] -> m [v b]
forall a b. (a -> b) -> a -> b
$ v b
vec v b -> [v b] -> [v b]
forall a. a -> [a] -> [a]
: [v b]
rest
(v b
z, a
seed') <- Int -> (a -> m (b, a)) -> a -> m (v b, a)
forall (m :: * -> *) a b (v :: * -> *).
(Monad m, Vector v b) =>
Int -> (a -> m (b, a)) -> a -> m (v b, a)
unfoldrExactVecNM Int
1 a -> m (b, a)
f a
seed
[v b]
zs <- Int -> a -> m [v b]
go Int
0 a
seed'
Chimera v b -> m (Chimera v b)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Chimera v b -> m (Chimera v b)) -> Chimera v b -> m (Chimera v b)
forall a b. (a -> b) -> a -> b
$ Array (v b) -> Chimera v b
forall (v :: * -> *) a. Array (v a) -> Chimera v a
Chimera (Array (v b) -> Chimera v b) -> Array (v b) -> Chimera v b
forall a b. (a -> b) -> a -> b
$ Int -> [Item (Array (v b))] -> Array (v b)
forall l. IsList l => Int -> [Item l] -> l
A.fromListN (Int
bits Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) (v b
z v b -> [v b] -> [v b]
forall a. a -> [a] -> [a]
: [v b]
zs)
interleaveVec :: G.Vector v a => v a -> v a -> v a
interleaveVec :: forall (v :: * -> *) a. Vector v a => v a -> v a -> v a
interleaveVec v a
as v a
bs = Int -> (Int -> a) -> v a
forall (v :: * -> *) a. Vector v a => Int -> (Int -> a) -> v a
G.generate (v a -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int
G.length v a
as Int -> Int -> Int
forall a. Bits a => a -> Int -> a
`shiftL` Int
1)
(\Int
n -> (if Int -> Bool
forall a. Integral a => a -> Bool
even Int
n then v a
as else v a
bs) v a -> Int -> a
forall (v :: * -> *) a.
(HasCallStack, Vector v a) =>
v a -> Int -> a
G.! (Int
n Int -> Int -> Int
forall a. Bits a => a -> Int -> a
`shiftR` Int
1))
interleave :: G.Vector v a => Chimera v a -> Chimera v a -> Chimera v a
interleave :: forall (v :: * -> *) a.
Vector v a =>
Chimera v a -> Chimera v a -> Chimera v a
interleave (Chimera Array (v a)
as) (Chimera Array (v a)
bs) = Array (v a) -> Chimera v a
forall (v :: * -> *) a. Array (v a) -> Chimera v a
Chimera (Array (v a) -> Chimera v a) -> Array (v a) -> Chimera v a
forall a b. (a -> b) -> a -> b
$ Int -> [v a] -> Array (v a)
forall a. Int -> [a] -> Array a
A.arrayFromListN (Int
bits Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) [v a]
vecs
where
vecs :: [v a]
vecs = Array (v a) -> Int -> v a
forall a. Array a -> Int -> a
A.indexArray Array (v a)
as Int
0 v a -> [v a] -> [v a]
forall a. a -> [a] -> [a]
: Array (v a) -> Int -> v a
forall a. Array a -> Int -> a
A.indexArray Array (v a)
bs Int
0 v a -> [v a] -> [v a]
forall a. a -> [a] -> [a]
:
(Int -> v a) -> [Int] -> [v a]
forall a b. (a -> b) -> [a] -> [b]
map (\Int
i -> v a -> v a -> v a
forall (v :: * -> *) a. Vector v a => v a -> v a -> v a
interleaveVec (Array (v a) -> Int -> v a
forall a. Array a -> Int -> a
A.indexArray Array (v a)
as Int
i) (Array (v a) -> Int -> v a
forall a. Array a -> Int -> a
A.indexArray Array (v a)
bs Int
i)) [Int
1 .. Int
bits Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1]
index :: G.Vector v a => Chimera v a -> Word -> a
index :: forall (v :: * -> *) a. Vector v a => Chimera v a -> Word -> a
index (Chimera Array (v a)
vs) Word
i =
(Array (v a)
vs Array (v a) -> Int -> v a
forall a. Array a -> Int -> a
`A.indexArray` (Int
bits Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
lz))
v a -> Int -> a
forall (v :: * -> *) a. Vector v a => v a -> Int -> a
`G.unsafeIndex`
Word -> Int
word2int (Word
i Word -> Word -> Word
forall a. Bits a => a -> a -> a
.&. Word -> Word
forall a. Bits a => a -> a
complement ((Word
1 Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftL` (Int
bits Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)) Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`unsafeShiftR` Int
lz))
where
lz :: Int
!lz :: Int
lz = Word -> Int
forall b. FiniteBits b => b -> Int
countLeadingZeros Word
i
{-# INLINE index #-}
toList :: G.Vector v a => Chimera v a -> [a]
toList :: forall (v :: * -> *) a. Vector v a => Chimera v a -> [a]
toList (Chimera Array (v a)
vs) = (v a -> [a]) -> Array (v a) -> [a]
forall m a. Monoid m => (a -> m) -> Array a -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap v a -> [a]
forall (v :: * -> *) a. Vector v a => v a -> [a]
G.toList Array (v a)
vs
measureOff :: Int -> [a] -> Either Int ([a], [a])
measureOff :: forall a. Int -> [a] -> Either Int ([a], [a])
measureOff Int
n
| Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0 = ([a], [a]) -> Either Int ([a], [a])
forall a b. b -> Either a b
Right (([a], [a]) -> Either Int ([a], [a]))
-> ([a] -> ([a], [a])) -> [a] -> Either Int ([a], [a])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([], )
| Bool
otherwise = Int -> [a] -> Either Int ([a], [a])
forall {t} {a}. (Eq t, Num t) => t -> [a] -> Either t ([a], [a])
go Int
n
where
go :: t -> [a] -> Either t ([a], [a])
go t
m [] = t -> Either t ([a], [a])
forall a b. a -> Either a b
Left t
m
go t
1 (a
x : [a]
xs) = ([a], [a]) -> Either t ([a], [a])
forall a b. b -> Either a b
Right ([a
x], [a]
xs)
go t
m (a
x : [a]
xs) = case t -> [a] -> Either t ([a], [a])
go (t
m t -> t -> t
forall a. Num a => a -> a -> a
- t
1) [a]
xs of
l :: Either t ([a], [a])
l@Left{} -> Either t ([a], [a])
l
Right ([a]
xs', [a]
xs'') -> ([a], [a]) -> Either t ([a], [a])
forall a b. b -> Either a b
Right (a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
xs', [a]
xs'')
measureOffVector :: G.Vector v a => Int -> v a -> Either Int (v a, v a)
measureOffVector :: forall (v :: * -> *) a.
Vector v a =>
Int -> v a -> Either Int (v a, v a)
measureOffVector Int
n v a
xs
| Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
l = (v a, v a) -> Either Int (v a, v a)
forall a b. b -> Either a b
Right (Int -> v a -> (v a, v a)
forall (v :: * -> *) a. Vector v a => Int -> v a -> (v a, v a)
G.splitAt Int
n v a
xs)
| Bool
otherwise = Int -> Either Int (v a, v a)
forall a b. a -> Either a b
Left (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
l)
where
l :: Int
l = v a -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int
G.length v a
xs
fromListWithDef
:: G.Vector v a
=> a
-> [a]
-> Chimera v a
fromListWithDef :: forall (v :: * -> *) a. Vector v a => a -> [a] -> Chimera v a
fromListWithDef a
a = Array (v a) -> Chimera v a
forall (v :: * -> *) a. Array (v a) -> Chimera v a
Chimera (Array (v a) -> Chimera v a)
-> ([a] -> Array (v a)) -> [a] -> Chimera v a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [Item (Array (v a))] -> Array (v a)
forall l. IsList l => Int -> [Item l] -> l
A.fromListN (Int
bits Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) ([v a] -> Array (v a)) -> ([a] -> [v a]) -> [a] -> Array (v a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> [v a]
go0
where
go0 :: [a] -> [v a]
go0 = \case
[] -> a -> v a
forall (v :: * -> *) a. Vector v a => a -> v a
G.singleton a
a v a -> [v a] -> [v a]
forall a. a -> [a] -> [a]
: (Int -> v a) -> [Int] -> [v a]
forall a b. (a -> b) -> [a] -> [b]
map (\Int
k -> Int -> a -> v a
forall (v :: * -> *) a. Vector v a => Int -> a -> v a
G.replicate (Int
1 Int -> Int -> Int
forall a. Bits a => a -> Int -> a
`shiftL` Int
k) a
a) [Int
0 .. Int
bits Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1]
a
x : [a]
xs -> a -> v a
forall (v :: * -> *) a. Vector v a => a -> v a
G.singleton a
x v a -> [v a] -> [v a]
forall a. a -> [a] -> [a]
: Int -> [a] -> [v a]
go Int
0 [a]
xs
go :: Int -> [a] -> [v a]
go Int
k [a]
xs = case Int -> [a] -> Either Int ([a], [a])
forall a. Int -> [a] -> Either Int ([a], [a])
measureOff Int
kk [a]
xs of
Left Int
l -> Int -> [a] -> v a
forall (v :: * -> *) a. Vector v a => Int -> [a] -> v a
G.fromListN Int
kk ([a]
xs [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ Int -> a -> [a]
forall a. Int -> a -> [a]
replicate Int
l a
a) v a -> [v a] -> [v a]
forall a. a -> [a] -> [a]
:
(Int -> v a) -> [Int] -> [v a]
forall a b. (a -> b) -> [a] -> [b]
map (\Int
n -> Int -> a -> v a
forall (v :: * -> *) a. Vector v a => Int -> a -> v a
G.replicate (Int
1 Int -> Int -> Int
forall a. Bits a => a -> Int -> a
`shiftL` Int
n) a
a) [Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1 .. Int
bits Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1]
Right ([a]
ys, [a]
zs) -> Int -> [a] -> v a
forall (v :: * -> *) a. Vector v a => Int -> [a] -> v a
G.fromListN Int
kk [a]
ys v a -> [v a] -> [v a]
forall a. a -> [a] -> [a]
: Int -> [a] -> [v a]
go (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) [a]
zs
where
kk :: Int
kk = Int
1 Int -> Int -> Int
forall a. Bits a => a -> Int -> a
`shiftL` Int
k
fromVectorWithDef
:: G.Vector v a
=> a
-> v a
-> Chimera v a
fromVectorWithDef :: forall (v :: * -> *) a. Vector v a => a -> v a -> Chimera v a
fromVectorWithDef a
a = Array (v a) -> Chimera v a
forall (v :: * -> *) a. Array (v a) -> Chimera v a
Chimera (Array (v a) -> Chimera v a)
-> (v a -> Array (v a)) -> v a -> Chimera v a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [Item (Array (v a))] -> Array (v a)
forall l. IsList l => Int -> [Item l] -> l
A.fromListN (Int
bits Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) ([v a] -> Array (v a)) -> (v a -> [v a]) -> v a -> Array (v a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. v a -> [v a]
go0
where
go0 :: v a -> [v a]
go0 v a
xs = case v a -> Maybe (a, v a)
forall (v :: * -> *) a. Vector v a => v a -> Maybe (a, v a)
G.uncons v a
xs of
Maybe (a, v a)
Nothing -> a -> v a
forall (v :: * -> *) a. Vector v a => a -> v a
G.singleton a
a v a -> [v a] -> [v a]
forall a. a -> [a] -> [a]
: (Int -> v a) -> [Int] -> [v a]
forall a b. (a -> b) -> [a] -> [b]
map (\Int
k -> Int -> a -> v a
forall (v :: * -> *) a. Vector v a => Int -> a -> v a
G.replicate (Int
1 Int -> Int -> Int
forall a. Bits a => a -> Int -> a
`shiftL` Int
k) a
a) [Int
0 .. Int
bits Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1]
Just (a
y, v a
ys) -> a -> v a
forall (v :: * -> *) a. Vector v a => a -> v a
G.singleton a
y v a -> [v a] -> [v a]
forall a. a -> [a] -> [a]
: Int -> v a -> [v a]
go Int
0 v a
ys
go :: Int -> v a -> [v a]
go Int
k v a
xs = case Int -> v a -> Either Int (v a, v a)
forall (v :: * -> *) a.
Vector v a =>
Int -> v a -> Either Int (v a, v a)
measureOffVector Int
kk v a
xs of
Left Int
l -> (v a
xs v a -> v a -> v a
forall (v :: * -> *) a. Vector v a => v a -> v a -> v a
G.++ Int -> a -> v a
forall (v :: * -> *) a. Vector v a => Int -> a -> v a
G.replicate Int
l a
a) v a -> [v a] -> [v a]
forall a. a -> [a] -> [a]
:
(Int -> v a) -> [Int] -> [v a]
forall a b. (a -> b) -> [a] -> [b]
map (\Int
n -> Int -> a -> v a
forall (v :: * -> *) a. Vector v a => Int -> a -> v a
G.replicate (Int
1 Int -> Int -> Int
forall a. Bits a => a -> Int -> a
`shiftL` Int
n) a
a) [Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1 .. Int
bits Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1]
Right (v a
ys, v a
zs) -> v a
ys v a -> [v a] -> [v a]
forall a. a -> [a] -> [a]
: Int -> v a -> [v a]
go (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) v a
zs
where
kk :: Int
kk = Int
1 Int -> Int -> Int
forall a. Bits a => a -> Int -> a
`shiftL` Int
k
cycle :: G.Vector v a => v a -> Chimera v a
cycle :: forall (v :: * -> *) a. Vector v a => v a -> Chimera v a
cycle v a
vec = case Word
l of
Word
0 -> [Char] -> Chimera v a
forall a. HasCallStack => [Char] -> a
error [Char]
"Data.Chimera.cycle: empty list"
Word
_ -> (Word -> a) -> Chimera v a
forall (v :: * -> *) a. Vector v a => (Word -> a) -> Chimera v a
tabulate (v a -> Int -> a
forall (v :: * -> *) a. Vector v a => v a -> Int -> a
G.unsafeIndex v a
vec (Int -> a) -> (Word -> Int) -> Word -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word -> Int
word2int (Word -> Int) -> (Word -> Word) -> Word -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Word -> Word -> Word
forall a. Integral a => a -> a -> a
`rem` Word
l))
where
l :: Word
l = Int -> Word
int2word (Int -> Word) -> Int -> Word
forall a b. (a -> b) -> a -> b
$ v a -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int
G.length v a
vec
memoize :: (Word -> a) -> (Word -> a)
memoize :: forall a. (Word -> a) -> Word -> a
memoize = forall (v :: * -> *) a. Vector v a => Chimera v a -> Word -> a
index @V.Vector (Chimera Vector a -> Word -> a)
-> ((Word -> a) -> Chimera Vector a) -> (Word -> a) -> Word -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Word -> a) -> Chimera Vector a
forall (v :: * -> *) a. Vector v a => (Word -> a) -> Chimera v a
tabulate
memoizeFix :: ((Word -> a) -> Word -> a) -> (Word -> a)
memoizeFix :: forall a. ((Word -> a) -> Word -> a) -> Word -> a
memoizeFix = forall (v :: * -> *) a. Vector v a => Chimera v a -> Word -> a
index @V.Vector (Chimera Vector a -> Word -> a)
-> (((Word -> a) -> Word -> a) -> Chimera Vector a)
-> ((Word -> a) -> Word -> a)
-> Word
-> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Word -> a) -> Word -> a) -> Chimera Vector a
forall (v :: * -> *) a.
Vector v a =>
((Word -> a) -> Word -> a) -> Chimera v a
tabulateFix
mapSubvectors
:: (G.Vector u a, G.Vector v b)
=> (u a -> v b)
-> Chimera u a
-> Chimera v b
mapSubvectors :: forall (u :: * -> *) a (v :: * -> *) b.
(Vector u a, Vector v b) =>
(u a -> v b) -> Chimera u a -> Chimera v b
mapSubvectors u a -> v b
f = Identity (Chimera v b) -> Chimera v b
forall a. Identity a -> a
runIdentity (Identity (Chimera v b) -> Chimera v b)
-> (Chimera u a -> Identity (Chimera v b))
-> Chimera u a
-> Chimera v b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (u a -> Identity (v b)) -> Chimera u a -> Identity (Chimera v b)
forall (u :: * -> *) a (v :: * -> *) b (m :: * -> *).
(Vector u a, Vector v b, Applicative m) =>
(u a -> m (v b)) -> Chimera u a -> m (Chimera v b)
traverseSubvectors (v b -> Identity (v b)
forall a. a -> Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (v b -> Identity (v b)) -> (u a -> v b) -> u a -> Identity (v b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. u a -> v b
f)
traverseSubvectors
:: (G.Vector u a, G.Vector v b, Applicative m)
=> (u a -> m (v b))
-> Chimera u a
-> m (Chimera v b)
traverseSubvectors :: forall (u :: * -> *) a (v :: * -> *) b (m :: * -> *).
(Vector u a, Vector v b, Applicative m) =>
(u a -> m (v b)) -> Chimera u a -> m (Chimera v b)
traverseSubvectors u a -> m (v b)
f (Chimera Array (u a)
bs) = Array (v b) -> Chimera v b
forall (v :: * -> *) a. Array (v a) -> Chimera v a
Chimera (Array (v b) -> Chimera v b) -> m (Array (v b)) -> m (Chimera v b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (u a -> m (v b)) -> Array (u a) -> m (Array (v b))
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Array a -> f (Array b)
traverse u a -> m (v b)
safeF Array (u a)
bs
where
safeF :: u a -> m (v b)
safeF u a
x = (\v b
fx -> if u a -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int
G.length u a
x Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== v b -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int
G.length v b
fx then v b
fx else
[Char] -> v b
forall a. HasCallStack => [Char] -> a
error [Char]
"traverseSubvectors: the function is not length-preserving") (v b -> v b) -> m (v b) -> m (v b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> u a -> m (v b)
f u a
x
{-# SPECIALIZE traverseSubvectors :: (G.Vector u a, G.Vector v b) => (u a -> Identity (v b)) -> Chimera u a -> Identity (Chimera v b) #-}
zipSubvectors :: (G.Vector u a, G.Vector v b, G.Vector w c) => (u a -> v b -> w c) -> Chimera u a -> Chimera v b -> Chimera w c
zipSubvectors :: forall (u :: * -> *) a (v :: * -> *) b (w :: * -> *) c.
(Vector u a, Vector v b, Vector w c) =>
(u a -> v b -> w c) -> Chimera u a -> Chimera v b -> Chimera w c
zipSubvectors = (u a -> v b -> w c) -> Chimera u a -> Chimera v b -> Chimera w c
forall (u :: * -> *) a (v :: * -> *) b (w :: * -> *) c.
(Vector u a, Vector v b, Vector w c) =>
(u a -> v b -> w c) -> Chimera u a -> Chimera v b -> Chimera w c
zipWithSubvectors
{-# DEPRECATED zipSubvectors "Use zipWithSubvectors instead" #-}
zipWithSubvectors
:: (G.Vector u a, G.Vector v b, G.Vector w c)
=> (u a -> v b -> w c)
-> Chimera u a
-> Chimera v b
-> Chimera w c
zipWithSubvectors :: forall (u :: * -> *) a (v :: * -> *) b (w :: * -> *) c.
(Vector u a, Vector v b, Vector w c) =>
(u a -> v b -> w c) -> Chimera u a -> Chimera v b -> Chimera w c
zipWithSubvectors u a -> v b -> w c
f = (Identity (Chimera w c) -> Chimera w c
forall a. Identity a -> a
runIdentity (Identity (Chimera w c) -> Chimera w c)
-> (Chimera v b -> Identity (Chimera w c))
-> Chimera v b
-> Chimera w c
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((Chimera v b -> Identity (Chimera w c))
-> Chimera v b -> Chimera w c)
-> (Chimera u a -> Chimera v b -> Identity (Chimera w c))
-> Chimera u a
-> Chimera v b
-> Chimera w c
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (u a -> v b -> Identity (w c))
-> Chimera u a -> Chimera v b -> Identity (Chimera w c)
forall (u :: * -> *) a (v :: * -> *) b (w :: * -> *) c
(m :: * -> *).
(Vector u a, Vector v b, Vector w c, Applicative m) =>
(u a -> v b -> m (w c))
-> Chimera u a -> Chimera v b -> m (Chimera w c)
zipWithMSubvectors ((w c -> Identity (w c)
forall a. a -> Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (w c -> Identity (w c)) -> (v b -> w c) -> v b -> Identity (w c)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((v b -> w c) -> v b -> Identity (w c))
-> (u a -> v b -> w c) -> u a -> v b -> Identity (w c)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. u a -> v b -> w c
f)
zipWithMSubvectors
:: (G.Vector u a, G.Vector v b, G.Vector w c, Applicative m)
=> (u a -> v b -> m (w c))
-> Chimera u a
-> Chimera v b
-> m (Chimera w c)
zipWithMSubvectors :: forall (u :: * -> *) a (v :: * -> *) b (w :: * -> *) c
(m :: * -> *).
(Vector u a, Vector v b, Vector w c, Applicative m) =>
(u a -> v b -> m (w c))
-> Chimera u a -> Chimera v b -> m (Chimera w c)
zipWithMSubvectors u a -> v b -> m (w c)
f (Chimera Array (u a)
bs1) (Chimera Array (v b)
bs2) = Array (w c) -> Chimera w c
forall (v :: * -> *) a. Array (v a) -> Chimera v a
Chimera (Array (w c) -> Chimera w c) -> m (Array (w c)) -> m (Chimera w c)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Array (m (w c)) -> m (Array (w c))
forall (t :: * -> *) (f :: * -> *) a.
(Traversable t, Applicative f) =>
t (f a) -> f (t a)
forall (f :: * -> *) a. Applicative f => Array (f a) -> f (Array a)
sequenceA ((u a -> v b -> m (w c))
-> Array (u a) -> Array (v b) -> Array (m (w c))
forall a b c. (a -> b -> c) -> Array a -> Array b -> Array c
forall (m :: * -> *) a b c.
MonadZip m =>
(a -> b -> c) -> m a -> m b -> m c
mzipWith u a -> v b -> m (w c)
safeF Array (u a)
bs1 Array (v b)
bs2)
where
safeF :: u a -> v b -> m (w c)
safeF u a
x v b
y = (\w c
fx -> if u a -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int
G.length u a
x Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== w c -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int
G.length w c
fx then w c
fx else
[Char] -> w c
forall a. HasCallStack => [Char] -> a
error [Char]
"traverseSubvectors: the function is not length-preserving") (w c -> w c) -> m (w c) -> m (w c)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> u a -> v b -> m (w c)
f u a
x v b
y
{-# SPECIALIZE zipWithMSubvectors :: (G.Vector u a, G.Vector v b, G.Vector w c) => (u a -> v b -> Identity (w c)) -> Chimera u a -> Chimera v b -> Identity (Chimera w c) #-}
sliceSubvectors
:: G.Vector v a
=> Int
-> Int
-> Chimera v a
-> [v a]
sliceSubvectors :: forall (v :: * -> *) a.
Vector v a =>
Int -> Int -> Chimera v a -> [v a]
sliceSubvectors Int
off Int
len = Int -> [v a] -> [v a]
forall {v :: * -> *} {a}. Vector v a => Int -> [v a] -> [v a]
doTake Int
len ([v a] -> [v a]) -> (Chimera v a -> [v a]) -> Chimera v a -> [v a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [v a] -> [v a]
forall {v :: * -> *} {a}. Vector v a => Int -> [v a] -> [v a]
doDrop Int
off ([v a] -> [v a]) -> (Chimera v a -> [v a]) -> Chimera v a -> [v a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array (v a) -> [v a]
forall a. Array a -> [a]
forall (t :: * -> *) a. Foldable t => t a -> [a]
F.toList (Array (v a) -> [v a])
-> (Chimera v a -> Array (v a)) -> Chimera v a -> [v a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Chimera v a -> Array (v a)
forall (v :: * -> *) a. Chimera v a -> Array (v a)
unChimera
where
doTake :: Int -> [v a] -> [v a]
doTake !Int
_ [] = []
doTake Int
n (v a
x : [v a]
xs)
| Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0 = []
| Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
l = v a
x v a -> [v a] -> [v a]
forall a. a -> [a] -> [a]
: Int -> [v a] -> [v a]
doTake (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
l) [v a]
xs
| Bool
otherwise = [Int -> v a -> v a
forall (v :: * -> *) a. Vector v a => Int -> v a -> v a
G.take Int
n v a
x]
where
l :: Int
l = v a -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int
G.length v a
x
doDrop :: Int -> [v a] -> [v a]
doDrop !Int
_ [] = []
doDrop Int
n (v a
x : [v a]
xs)
| Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0 = v a
x v a -> [v a] -> [v a]
forall a. a -> [a] -> [a]
: [v a]
xs
| Int
l Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
n = Int -> [v a] -> [v a]
doDrop (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
l) [v a]
xs
| Bool
otherwise = Int -> v a -> v a
forall (v :: * -> *) a. Vector v a => Int -> v a -> v a
G.drop Int
n v a
x v a -> [v a] -> [v a]
forall a. a -> [a] -> [a]
: [v a]
xs
where
l :: Int
l = v a -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int
G.length v a
x