module Data.Yarr.Utils.FixedVector (
module Data.Vector.Fixed,
arity,
zipWith3, zipWithM_, apply, zero,
iifoldl, iifoldM,
N7, N8,
n1, n2, n3, n4, n5, n6, n7, n8,
vl_1, vl_2, vl_3, vl_4,
VecTuple(..),
module Data.Yarr.Utils.FixedVector.VecTupleInstances,
makeVecTupleInstance,
InlinableArity(..), makeInlinableArityInstance,
) where
import Prelude hiding (
foldl, zipWith, zipWith3,
all, any, sequence_, replicate)
import Control.DeepSeq
import Data.Vector.Fixed
import Data.Vector.Fixed.Cont ( accum, arity )
import Data.Yarr.Utils.FixedVector.Arity
import Data.Yarr.Utils.FixedVector.VecTuple
import Data.Yarr.Utils.FixedVector.VecTupleInstances
import Data.Yarr.Utils.FixedVector.InlinableArity
vl_1 :: a -> VecList N1 a
vl_1 a = a `Cons` Nil
vl_2 :: a -> a -> VecList N2 a
vl_2 a b = a `Cons` (b `Cons` Nil)
vl_3 :: a -> a -> a -> VecList N3 a
vl_3 a b c = a `Cons` (b `Cons` (c `Cons` Nil))
vl_4 :: a -> a -> a -> a -> VecList N4 a
vl_4 a b c d = a `Cons` (b `Cons` (c `Cons` (d `Cons` Nil)))
instance (Arity n, NFData e) => NFData (VecList n e) where
rnf = Data.Vector.Fixed.foldl (\r e -> r `seq` rnf e) ()
zipWith3
:: (Vector v a, Vector v b, Vector v c, Vector v d, Vector v (b, c))
=> (a -> b -> c -> d)
-> v a -> v b -> v c
-> v d
zipWith3 f v1 v2 v3 = zipWith (\a (b, c) -> f a b c) v1 (zipWith (,) v2 v3)
zipWithM_
:: (Vector v a, Vector v b, Vector v c, Monad m, Vector v (m c))
=> (a -> b -> m c) -> v a -> v b -> m ()
zipWithM_ f xs ys = sequence_ (zipWith f xs ys)
apply :: (Vector v a, Vector v (a -> b), Vector v b)
=> v (a -> b) -> v a -> v b
apply = zipWith ($)
zero :: (Vector v a, Num a) => v a
zero = replicate 0
iifoldl
:: Vector v a
=> ix -> (ix -> ix)
-> (b -> ix -> a -> b) -> b -> v a -> b
iifoldl st sc f z v = inspect v $ gifoldlF st sc f z
iifoldM
:: (Vector v a, Monad m)
=> ix -> (ix -> ix)
-> (b -> ix -> a -> m b) -> b -> v a -> m b
iifoldM st sc f x v =
let go m i a = do
b <- m
f b i a
in iifoldl st sc go (return x) v
data T_ifoldl ix b n = T_ifoldl ix b
gifoldlF
:: forall n ix a b. Arity n
=> ix -> (ix -> ix)
-> (b -> ix -> a -> b) -> b -> Fun n a b
gifoldlF st sc f b = Fun $
accum (\(T_ifoldl i r) a -> T_ifoldl (sc i) (f r i a))
(\(T_ifoldl _ r) -> r)
(T_ifoldl st b :: T_ifoldl ix b n)