    module Bench.Vector.Algo.Rootfix where

    import Data.Vector.Unboxed as V

    rootfix :: (V.Vector Int, V.Vector Int) -> V.Vector Int
    {-# NOINLINE rootfix #-}
    rootfix :: (Vector Int, Vector Int) -> Vector Int
    rootfix (Vector Int
    ls, Vector Int
    rs) = Vector Int -> Vector Int -> Vector Int -> Vector Int
    forall {a}.
    (Unbox a, Num a) =>
    Vector a -> Vector Int -> Vector Int -> Vector a
    rootfix (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
          rootfix :: Vector a -> Vector Int -> Vector Int -> Vector a
    rootfix Vector a
    xs Vector Int
    ls Vector Int
    rs
            = let zs :: Vector a
    zs   = Int -> a -> Vector a
    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) a
    0
                  vs :: Vector a
    vs   = Vector a -> Vector Int -> Vector a -> Vector a
    forall a. Unbox a => Vector a -> Vector Int -> Vector a -> Vector a
    V.update_ (Vector a -> Vector Int -> Vector a -> Vector a
    forall a. Unbox a => Vector a -> Vector Int -> Vector a -> Vector a
    V.update_ Vector a
    zs Vector Int
    ls Vector a
    xs) Vector Int
    rs ((a -> a) -> Vector a -> Vector a
    forall a b. (Unbox a, Unbox b) => (a -> b) -> Vector a -> Vector b
    V.map a -> a
    forall a. Num a => a -> a
    negate Vector a
    xs)
                  sums :: Vector a
    sums = (a -> a -> a) -> a -> Vector a -> Vector a
    forall a b.
    (Unbox a, Unbox b) =>
    (a -> b -> a) -> a -> Vector b -> Vector a
    V.prescanl' a -> a -> a
    forall a. Num a => a -> a -> a
    (+) a
    0 Vector a
    vs
              in
              Vector a -> Vector Int -> Vector a
    forall a. Unbox a => Vector a -> Vector Int -> Vector a
    V.backpermute Vector a
    sums Vector Int
    ls