module Bench.Vector.Algo.Leaffix where import Data.Vector.Unboxed as V leaffix :: (Vector Int, Vector Int) -> Vector Int {-# NOINLINE leaffix #-} leaffix :: (Vector Int, Vector Int) -> Vector Int leaffix (Vector Int ls,Vector Int rs) = Vector Int -> Vector Int -> Vector Int -> Vector Int forall {c}. (Unbox c, Num c) => Vector c -> Vector Int -> Vector Int -> Vector c leaffix (Int -> Int -> Vector Int forall a. Unbox a => Int -> a -> Vector a V.replicate (Vector Int -> Int forall a. Unbox a => Vector a -> Int V.length Vector Int ls) Int 1) Vector Int ls Vector Int rs where leaffix :: Vector c -> Vector Int -> Vector Int -> Vector c leaffix Vector c xs Vector Int ls Vector Int rs = let zs :: Vector c zs = Int -> c -> Vector c forall a. Unbox a => Int -> a -> Vector a V.replicate (Vector Int -> Int forall a. Unbox a => Vector a -> Int V.length Vector Int ls Int -> Int -> Int forall a. Num a => a -> a -> a * Int 2) c 0 vs :: Vector c vs = Vector c -> Vector Int -> Vector c -> Vector c forall a. Unbox a => Vector a -> Vector Int -> Vector a -> Vector a V.update_ Vector c zs Vector Int ls Vector c xs sums :: Vector c sums = (c -> c -> c) -> c -> Vector c -> Vector c forall a b. (Unbox a, Unbox b) => (a -> b -> a) -> a -> Vector b -> Vector a V.prescanl' c -> c -> c forall a. Num a => a -> a -> a (+) c 0 Vector c vs in (c -> c -> c) -> Vector c -> Vector c -> Vector c forall a b c. (Unbox a, Unbox b, Unbox c) => (a -> b -> c) -> Vector a -> Vector b -> Vector c V.zipWith (-) (Vector c -> Vector Int -> Vector c forall a. Unbox a => Vector a -> Vector Int -> Vector a V.backpermute Vector c sums Vector Int ls) (Vector c -> Vector Int -> Vector c forall a. Unbox a => Vector a -> Vector Int -> Vector a V.backpermute Vector c sums Vector Int rs)