{-# LANGUAGE ParallelArrays #-}
{-# OPTIONS_GHC -fvectorise #-}
-- VectroseMe.hs
module VectoriseMe where

import qualified Data.Array.Parallel  as P
import Data.Array.Parallel.PArray
import qualified Data.Array.Parallel.Prelude.Int as I
import qualified Data.Array.Parallel.Prelude.Double as D
import qualified Data.Array.Parallel.Prelude as Pre


bSearch :: ( I.Int , I.Int , D.Double ) -> [: ( I.Int , I.Int , D.Double ) :] -> I.Int -> I.Int
bSearch elem@( i , j , val ) ys  len = ret where
  ret = helpBsearch 0  len  where
  helpBsearch :: I.Int -> I.Int -> I.Int
  helpBsearch lo hi
   | lo I.>= hi = if lo I.== len then ( lo I.- 1 ) else lo
   | cond  = helpBsearch ( mid I.+ 1 ) hi
   | otherwise = helpBsearch lo mid
	 where mid = I.div ( lo I.+ hi ) 2
	       ( i' , j' , val' ) = ys P.!: mid
	       cond = case () of
			_| j' I.< j Pre.|| ( j I.== j' Pre.&& i' I.< i )  -> True
			 | otherwise ->  False



interfaceSearch ::  ( Int , Int , Double ) -> PArray ( Int , Int , Double ) -> Int
{-# NOINLINE interfaceSearch #-} 
interfaceSearch x ys  =  bSearch  x ( P.fromPArrayP ys )  ( Data.Array.Parallel.PArray.length ys ) 


