{-# OPTIONS_HADDOCK show-extensions #-}
{-# LANGUAGE UnboxedTuples #-}
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE FlexibleContexts #-}
module CaseBi.Arr (
getBFst''
, getBFst'
, listArrSortedByFst
, getBFstLSorted'
, getBFstL'
) where
import qualified Data.List as L (sortBy)
import GHC.Arr
import Data.Ord (comparing)
getBFst''
:: Ord a => (# Int, (a, b) #)
-> (# Int, (a, b) #)
-> Array i (a, b)
-> b
-> a
-> b
getBFst'' :: (# Int, (a, b) #)
-> (# Int, (a, b) #) -> Array i (a, b) -> b -> a -> b
getBFst'' (# Int
i, (a, b)
k #) (# Int
j, (a, b)
m #) Array i (a, b)
arr b
def a
x
| 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 Bool -> Bool -> Bool
&& 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 = (# Int, (a, b) #)
-> (# Int, (a, b) #) -> Array i (a, b) -> b -> a -> b
forall a b i.
Ord a =>
(# Int, (a, b) #)
-> (# Int, (a, b) #) -> Array i (a, b) -> b -> a -> b
gBF3 (# Int
i, (a, b)
k #) (# Int
j, (a, b)
m #) Array i (a, b)
arr b
def a
x
| Bool
otherwise = b
def
{-# INLINE getBFst'' #-}
gBF3 :: Ord a => (# Int, (a, b) #) -> (# Int, (a, b) #) -> Array i (a, b) -> b -> a -> b
gBF3 :: (# Int, (a, b) #)
-> (# Int, (a, b) #) -> Array i (a, b) -> b -> a -> b
gBF3 (# Int
i, (a, b)
k #) (# Int
j, (a, b)
m #) Array i (a, b)
arr b
def a
x
| Int
j Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
1 = let !n :: Int
n = (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
j) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`quot` Int
2 in let !p :: (a, b)
p = Array i (a, b) -> Int -> (a, b)
forall i e. Array i e -> Int -> e
unsafeAt Array i (a, b)
arr Int
n in
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) #) -> Array i (a, b) -> b -> a -> b
forall a b i.
Ord a =>
(# Int, (a, b) #)
-> (# Int, (a, b) #) -> Array i (a, b) -> b -> a -> b
gBF3 (# Int
n, (a, b)
p #) (# Int
j, (a, b)
m #) Array i (a, b)
arr b
def a
x
Ordering
EQ -> (a, b) -> b
forall a b. (a, b) -> b
snd (a, b)
p
Ordering
_ -> (# Int, (a, b) #)
-> (# Int, (a, b) #) -> Array i (a, b) -> b -> a -> b
forall a b i.
Ord a =>
(# Int, (a, b) #)
-> (# Int, (a, b) #) -> Array i (a, b) -> b -> a -> b
gBF3 (# Int
i, (a, b)
k #) (# Int
n, (a, b)
p #) Array i (a, b)
arr b
def a
x
| 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
{-# INLINABLE gBF3 #-}
getBFst' :: Ord a => (b, Array Int (a, b)) -> a -> b
getBFst' :: (b, Array Int (a, b)) -> a -> b
getBFst' (b
def, Array Int (a, b)
arr) = (# Int, (a, b) #)
-> (# Int, (a, b) #) -> Array Int (a, b) -> b -> a -> b
forall a b i.
Ord a =>
(# Int, (a, b) #)
-> (# Int, (a, b) #) -> Array i (a, b) -> b -> a -> b
getBFst'' (# Int
i, (a, b)
k #) (# Int
j, (a, b)
m #) Array Int (a, b)
arr b
def
where (!Int
i,!Int
j) = Array Int (a, b) -> (Int, Int)
forall i e. Array i e -> (i, i)
bounds Array Int (a, b)
arr
!k :: (a, b)
k = Array Int (a, b) -> Int -> (a, b)
forall i e. Array i e -> Int -> e
unsafeAt Array Int (a, b)
arr Int
i
!m :: (a, b)
m = Array Int (a, b) -> Int -> (a, b)
forall i e. Array i e -> Int -> e
unsafeAt Array Int (a, b)
arr Int
j
{-# INLINE getBFst' #-}
getBFstLSorted'
:: Ord a => b
-> [(a, b)]
-> a
-> b
getBFstLSorted' :: b -> [(a, b)] -> a -> b
getBFstLSorted' b
def [(a, b)]
xs = (# Int, (a, b) #)
-> (# Int, (a, b) #) -> Array Int (a, b) -> b -> a -> b
forall a b i.
Ord a =>
(# Int, (a, b) #)
-> (# Int, (a, b) #) -> Array i (a, b) -> b -> a -> b
getBFst'' (# Int
0, (a, b)
k #) (# Int
l, (a, b)
m #) Array Int (a, b)
arr b
def
where !l :: Int
l = [(a, b)] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [(a, b)]
xs Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1
!arr :: Array Int (a, b)
arr = (Int, Int) -> [(a, b)] -> Array Int (a, b)
forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (Int
0,Int
l) [(a, b)]
xs
!k :: (a, b)
k = Array Int (a, b) -> Int -> (a, b)
forall i e. Array i e -> Int -> e
unsafeAt Array Int (a, b)
arr Int
0
!m :: (a, b)
m = Array Int (a, b) -> Int -> (a, b)
forall i e. Array i e -> Int -> e
unsafeAt Array Int (a, b)
arr Int
l
{-# INLINE getBFstLSorted' #-}
getBFstL'
:: Ord a => b
-> [(a, b)]
-> a
-> b
getBFstL' :: b -> [(a, b)] -> a -> b
getBFstL' b
def [(a, b)]
xs = (# Int, (a, b) #)
-> (# Int, (a, b) #) -> Array Int (a, b) -> b -> a -> b
forall a b i.
Ord a =>
(# Int, (a, b) #)
-> (# Int, (a, b) #) -> Array i (a, b) -> b -> a -> b
getBFst'' (# Int
0, (a, b)
k #) (# Int
l, (a, b)
m #) Array Int (a, b)
arr b
def
where !l :: Int
l = [(a, b)] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [(a, b)]
xs Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1
!arr :: Array Int (a, b)
arr = (Int, Int) -> [(a, b)] -> Array Int (a, b)
forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (Int
0,Int
l) ([(a, b)] -> Array Int (a, b))
-> ([(a, b)] -> [(a, b)]) -> [(a, b)] -> Array Int (a, b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((a, b) -> (a, b) -> Ordering) -> [(a, b)] -> [(a, b)]
forall a. (a -> a -> Ordering) -> [a] -> [a]
L.sortBy (((a, b) -> a) -> (a, b) -> (a, b) -> Ordering
forall a b. Ord a => (b -> a) -> b -> b -> Ordering
comparing (a, b) -> a
forall a b. (a, b) -> a
fst) ([(a, b)] -> Array Int (a, b)) -> [(a, b)] -> Array Int (a, b)
forall a b. (a -> b) -> a -> b
$ [(a, b)]
xs
!k :: (a, b)
k = Array Int (a, b) -> Int -> (a, b)
forall i e. Array i e -> Int -> e
unsafeAt Array Int (a, b)
arr Int
0
!m :: (a, b)
m = Array Int (a, b) -> Int -> (a, b)
forall i e. Array i e -> Int -> e
unsafeAt Array Int (a, b)
arr Int
l
{-# INLINE getBFstL' #-}
listArrSortedByFst :: Ord a => [(a,b)] -> Array Int (a,b)
listArrSortedByFst :: [(a, b)] -> Array Int (a, b)
listArrSortedByFst [(a, b)]
xs = (Int, Int) -> [(a, b)] -> Array Int (a, b)
forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (Int
0,Int
l Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) [(a, b)]
ys
where !ys :: [(a, b)]
ys = ((a, b) -> (a, b) -> Ordering) -> [(a, b)] -> [(a, b)]
forall a. (a -> a -> Ordering) -> [a] -> [a]
L.sortBy (((a, b) -> a) -> (a, b) -> (a, b) -> Ordering
forall a b. Ord a => (b -> a) -> b -> b -> Ordering
comparing (a, b) -> a
forall a b. (a, b) -> a
fst) [(a, b)]
xs
!l :: Int
l = [(a, b)] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [(a, b)]
ys
{-# INLINE listArrSortedByFst #-}