module Bench.Vector.Algo.ListRank
where

import Data.Vector.Unboxed as V

listRank :: Int -> Vector Int
{-# NOINLINE listRank #-}
listRank :: Int -> Vector Int
listRank Int
n = Vector Int -> Vector Int -> Vector Int
forall {c}. (Unbox c, Num c) => Vector Int -> Vector c -> Vector c
pointer_jump Vector Int
xs Vector Int
val
  where
    xs :: Vector Int
xs = Int
0 Int -> Vector Int -> Vector Int
forall a. Unbox a => a -> Vector a -> Vector a
`V.cons` Int -> Int -> Vector Int
forall a. (Unbox a, Enum a) => a -> a -> Vector a
V.enumFromTo Int
0 (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
2)

    val :: Vector Int
val = (Int -> Int -> Int) -> Vector Int -> Vector Int -> Vector Int
forall a b c.
(Unbox a, Unbox b, Unbox c) =>
(a -> b -> c) -> Vector a -> Vector b -> Vector c
V.zipWith (\Int
i Int
j -> if Int
i Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
j then Int
0 else Int
1)
                    Vector Int
xs (Int -> Int -> Vector Int
forall a. (Unbox a, Enum a) => a -> a -> Vector a
V.enumFromTo Int
0 (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1))

    pointer_jump :: Vector Int -> Vector c -> Vector c
pointer_jump Vector Int
pt Vector c
val
      | Vector Int
npt Vector Int -> Vector Int -> Bool
forall a. Eq a => a -> a -> Bool
== Vector Int
pt = Vector c
val
      | Bool
otherwise = Vector Int -> Vector c -> Vector c
pointer_jump Vector Int
npt Vector c
nval
      where
        npt :: Vector Int
npt  = Vector Int -> Vector Int -> Vector Int
forall a. Unbox a => Vector a -> Vector Int -> Vector a
V.backpermute Vector Int
pt Vector Int
pt
        nval :: Vector c
nval = (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 c -> c -> c
forall a. Num a => a -> a -> a
(+) Vector c
val (Vector c -> Vector Int -> Vector c
forall a. Unbox a => Vector a -> Vector Int -> Vector a
V.backpermute Vector c
val Vector Int
pt)