{-# OPTIONS_HADDOCK showe-extensions #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE UnboxedTuples #-}
{-# OPTIONS_GHC -funbox-strict-fields #-}
module CaseBi.Unboxed (
getBFst', getBFst, getBFstV,
sortFst, sortFstV,
filterP
) where
import qualified Data.Vector.Unboxed as V (Vector,unsafeIndex,unsafeSlice,length,fromList,map)
import qualified Data.List as L (groupBy,nubBy)
import Data.Vector.Unboxed.Base
import GHC.Exts
getBFst'
:: (Ord a, Unbox a, Unbox b)
=> (b, V.Vector (a, b))
-> a
-> b
getBFst' :: (b, Vector (a, b)) -> a -> b
getBFst' (b
def, Vector (a, b)
vec) = (# Int, (a, b) #)
-> (# Int, (a, b) #) -> Vector (a, b) -> b -> a -> b
forall a b.
(Ord a, Unbox a, Unbox b) =>
(# Int, (a, b) #)
-> (# Int, (a, b) #) -> Vector (a, b) -> b -> a -> b
getBFst'' (# Int
0, (a, b)
k #) (# Int
j, (a, b)
m #) Vector (a, b)
vec b
def
where !j :: Int
j = Vector (a, b) -> Int
forall a. Unbox a => Vector a -> Int
V.length Vector (a, b)
vec Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1
!k :: (a, b)
k = Vector (a, b) -> Int -> (a, b)
forall a. Unbox a => Vector a -> Int -> a
V.unsafeIndex Vector (a, b)
vec Int
0
!m :: (a, b)
m = Vector (a, b) -> Int -> (a, b)
forall a. Unbox a => Vector a -> Int -> a
V.unsafeIndex Vector (a, b)
vec Int
j
{-# INLINE getBFst' #-}
getBFstV :: (Ord a, Unbox a, Unbox b) => V.Vector (a, b)
-> b
-> V.Vector a
-> V.Vector b
getBFstV :: Vector (a, b) -> b -> Vector a -> Vector b
getBFstV Vector (a, b)
c b
y = (a -> b) -> Vector a -> Vector b
forall a b. (Unbox a, Unbox b) => (a -> b) -> Vector a -> Vector b
V.map ((b, Vector (a, b)) -> a -> b
forall a b.
(Ord a, Unbox a, Unbox b) =>
(b, Vector (a, b)) -> a -> b
getBFst' (b
y, Vector (a, b)
c))
{-# INLINE getBFstV #-}
getBFst :: (Ord a, Unbox a, Unbox b) => V.Vector (a, b)
-> b
-> [a]
-> [b]
getBFst :: Vector (a, b) -> b -> [a] -> [b]
getBFst Vector (a, b)
c b
y = (a -> b) -> [a] -> [b]
forall a b. (a -> b) -> [a] -> [b]
map ((b, Vector (a, b)) -> a -> b
forall a b.
(Ord a, Unbox a, Unbox b) =>
(b, Vector (a, b)) -> a -> b
getBFst' (b
y, Vector (a, b)
c))
{-# INLINE getBFst #-}
sortFst :: (Ord a, Unbox a, Unbox b) => [(a, b)] -> [(a, b)]
sortFst :: [(a, b)] -> [(a, b)]
sortFst [(a, b)]
xs
| [(a, b)] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [(a, b)]
xs = []
| Bool
otherwise = [(a, b)] -> [(a, b)]
forall a b. (Ord a, Unbox a, Unbox b) => [(a, b)] -> [(a, b)]
sortFst (((a, b) -> Bool) -> [(a, b)] -> [(a, b)]
forall a. (a -> Bool) -> [a] -> [a]
filter (\(a
x, b
_) -> a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< (a, b) -> a
forall a b. (a, b) -> a
fst ([(a, b)] -> (a, b)
forall a. [a] -> a
head [(a, b)]
xs)) [(a, b)]
xs) [(a, b)] -> [(a, b)] -> [(a, b)]
forall a. [a] -> [a] -> [a]
++ ((a, b) -> Bool) -> [(a, b)] -> [(a, b)]
forall a. (a -> Bool) -> [a] -> [a]
filter (\(a
x, b
_) -> a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== ((a, b) -> a
forall a b. (a, b) -> a
fst ([(a, b)] -> (a, b)
forall a. [a] -> a
head [(a, b)]
xs))) [(a, b)]
xs [(a, b)] -> [(a, b)] -> [(a, b)]
forall a. [a] -> [a] -> [a]
++
[(a, b)] -> [(a, b)]
forall a b. (Ord a, Unbox a, Unbox b) => [(a, b)] -> [(a, b)]
sortFst (((a, b) -> Bool) -> [(a, b)] -> [(a, b)]
forall a. (a -> Bool) -> [a] -> [a]
filter (\(a
x, b
_) -> a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
> (a, b) -> a
forall a b. (a, b) -> a
fst ([(a, b)] -> (a, b)
forall a. [a] -> a
head [(a, b)]
xs)) [(a, b)]
xs)
{-# INLINABLE sortFst #-}
sortFstV
:: (Ord a, Unbox a, Unbox b) => [(a, b)]
-> V.Vector (a, b)
sortFstV :: [(a, b)] -> Vector (a, b)
sortFstV = [(a, b)] -> Vector (a, b)
forall a. Unbox a => [a] -> Vector a
V.fromList ([(a, b)] -> Vector (a, b))
-> ([(a, b)] -> [(a, b)]) -> [(a, b)] -> Vector (a, b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((a, b) -> (a, b) -> Bool) -> [(a, b)] -> [(a, b)]
forall a. (a -> a -> Bool) -> [a] -> [a]
L.nubBy (\(a
x, b
_) (a
y, b
_) -> a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
y) ([(a, b)] -> [(a, b)])
-> ([(a, b)] -> [(a, b)]) -> [(a, b)] -> [(a, b)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(a, b)] -> [(a, b)]
forall a b. (Ord a, Unbox a, Unbox b) => [(a, b)] -> [(a, b)]
sortFst
{-# INLINE sortFstV #-}
filterP
:: (Ord a, Unbox a, Unbox b) => ((a, b) -> Bool)
-> [(a, b)]
-> V.Vector (a, b)
filterP :: ((a, b) -> Bool) -> [(a, b)] -> Vector (a, b)
filterP (a, b) -> Bool
p [(a, b)]
xs = [(a, b)] -> Vector (a, b)
forall a. Unbox a => [a] -> Vector a
V.fromList ([(a, b)] -> Vector (a, b))
-> ([(a, b)] -> [(a, b)]) -> [(a, b)] -> Vector (a, b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([(a, b)] -> [(a, b)]) -> [[(a, b)]] -> [(a, b)]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (\[(a, b)]
x -> Int -> [(a, b)] -> [(a, b)]
forall a. Int -> [a] -> [a]
take Int
1 ([(a, b)] -> [(a, b)])
-> ([(a, b)] -> [(a, b)]) -> [(a, b)] -> [(a, b)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((a, b) -> Bool) -> [(a, b)] -> [(a, b)]
forall a. (a -> Bool) -> [a] -> [a]
dropWhile (Bool -> Bool
not (Bool -> Bool) -> ((a, b) -> Bool) -> (a, b) -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a, b) -> Bool
p) ([(a, b)] -> [(a, b)]) -> [(a, b)] -> [(a, b)]
forall a b. (a -> b) -> a -> b
$ [(a, b)]
x) ([[(a, b)]] -> [(a, b)])
-> ([(a, b)] -> [[(a, b)]]) -> [(a, b)] -> [(a, b)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((a, b) -> (a, b) -> Bool) -> [(a, b)] -> [[(a, b)]]
forall a. (a -> a -> Bool) -> [a] -> [[a]]
L.groupBy (\(a
x1,b
_) (a
x2,b
_) -> a
x1 a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
x2) ([(a, b)] -> Vector (a, b)) -> [(a, b)] -> Vector (a, b)
forall a b. (a -> b) -> a -> b
$ [(a, b)]
xs
{-# INLINE filterP #-}
getBFst''
:: (Ord a, Unbox a, Unbox b) => (# Int, (a, b) #)
-> (# Int, (a, b) #)
-> V.Vector (a, b)
-> b
-> a
-> b
getBFst'' :: (# Int, (a, b) #)
-> (# Int, (a, b) #) -> Vector (a, b) -> b -> a -> b
getBFst'' (# (I# Int#
i#), (a, b)
k #) (# (I# Int#
j#), (a, b)
m #) Vector (a, b)
vec b
def a
x
| if a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< (a, b) -> a
forall a b. (a, b) -> a
fst (a, b)
k then Bool
True else a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
> (a, b) -> a
forall a b. (a, b) -> a
fst (a, b)
m = b
def
| Bool
otherwise = (# Int#, (a, b) #)
-> (# Int#, (a, b) #) -> Vector (a, b) -> b -> a -> b
forall a b.
(Ord a, Unbox a, Unbox b) =>
(# Int#, (a, b) #)
-> (# Int#, (a, b) #) -> Vector (a, b) -> b -> a -> b
gBF3 (# Int#
i# , (a, b)
k #) (# Int#
j# , (a, b)
m #) Vector (a, b)
vec b
def a
x
{-# INLINE getBFst'' #-}
gBF3 :: (Ord a, Unbox a, Unbox b) => (# Int#, (a, b) #) -> (# Int#, (a, b) #) -> V.Vector (a, b) -> b -> a -> b
gBF3 :: (# Int#, (a, b) #)
-> (# Int#, (a, b) #) -> Vector (a, b) -> b -> a -> b
gBF3 (# !Int#
i#, (a, b)
k #) (# !Int#
j#, (a, b)
m #) Vector (a, b)
vec b
def a
x
| Int# -> Bool
isTrue# ((Int#
j# Int# -> Int# -> Int#
-# Int#
i#) Int# -> Int# -> Int#
># Int#
1# ) =
case a -> a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare a
x ((a, b) -> a
forall a b. (a, b) -> a
fst (a, b)
p) of
Ordering
GT -> (# Int#, (a, b) #)
-> (# Int#, (a, b) #) -> Vector (a, b) -> b -> a -> b
forall a b.
(Ord a, Unbox a, Unbox b) =>
(# Int#, (a, b) #)
-> (# Int#, (a, b) #) -> Vector (a, b) -> b -> a -> b
gBF3 (# Int#
n#, (a, b)
p #) (# Int#
j#, (a, b)
m #) Vector (a, b)
vec b
def a
x
Ordering
LT -> (# Int#, (a, b) #)
-> (# Int#, (a, b) #) -> Vector (a, b) -> b -> a -> b
forall a b.
(Ord a, Unbox a, Unbox b) =>
(# Int#, (a, b) #)
-> (# Int#, (a, b) #) -> Vector (a, b) -> b -> a -> b
gBF3 (# Int#
i#, (a, b)
k #) (# Int#
n#, (a, b)
p #) Vector (a, b)
vec b
def a
x
Ordering
_ -> (a, b) -> b
forall a b. (a, b) -> b
snd (a, b)
p
| a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== (a, b) -> a
forall a b. (a, b) -> a
fst (a, b)
m = (a, b) -> b
forall a b. (a, b) -> b
snd (a, b)
m
| a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== (a, b) -> a
forall a b. (a, b) -> a
fst (a, b)
k = (a, b) -> b
forall a b. (a, b) -> b
snd (a, b)
k
| Bool
otherwise = b
def
where !n# :: Int#
n# = (Int#
i# Int# -> Int# -> Int#
+# Int#
j#) Int# -> Int# -> Int#
`quotInt#` Int#
2#
!p :: (a, b)
p = Vector (a, b) -> Int -> (a, b)
forall a. Unbox a => Vector a -> Int -> a
V.unsafeIndex Vector (a, b)
vec (Int# -> Int
I# Int#
n#)
{-# INLINABLE gBF3 #-}