{-# OPTIONS_HADDOCK show-extensions #-}
{-# OPTIONS_GHC -funbox-strict-fields #-}
{-# LANGUAGE UnboxedTuples #-}
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE NoImplicitPrelude #-}
module CaseBi.Arr (
getBFst''
, getBFst'
, listArrSortedByFst
, getBFstLSorted'
, getBFstL'
) where
import GHC.Base
import GHC.Num
import GHC.List (length)
import Data.Tuple
import qualified Data.List as L (sortOn)
import GHC.Arr
import GHC.Exts
getBFst''
:: (Ord a, Ix i) => (# Int, (a, b) #)
-> (# Int, (a, b) #)
-> Array i (a, b)
-> b
-> a
-> b
getBFst'' :: forall a i b.
(Ord a, Ix i) =>
(# Int, (a, b) #)
-> (# Int, (a, b) #) -> Array i (a, b) -> b -> a -> b
getBFst'' (# (I# Int#
i#), (a, b)
k #) (# (I# Int#
j#), (a, b)
m #) Array i (a, b)
arr b
def a
x
| if a
x forall a. Ord a => a -> a -> Bool
< forall a b. (a, b) -> a
fst (a, b)
k then Bool
True else a
x forall a. Ord a => a -> a -> Bool
> forall a b. (a, b) -> a
fst (a, b)
m = b
def
| Bool
otherwise = forall a i b.
(Ord a, Ix i) =>
(# 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
{-# INLINE getBFst'' #-}
gBF3 :: (Ord a, Ix i) => (# Int#, (a, b) #) -> (# Int#, (a, b) #) -> Array i (a, b) -> b -> a -> b
gBF3 :: forall a i b.
(Ord a, Ix i) =>
(# 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# -> Bool
isTrue# ((Int#
j# Int# -> Int# -> Int#
-# Int#
i#) Int# -> Int# -> Int#
># Int#
1# ) =
case forall a. Ord a => a -> a -> Ordering
compare a
x (forall a b. (a, b) -> a
fst (a, b)
p) of
Ordering
GT -> forall a i b.
(Ord a, Ix i) =>
(# 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
LT -> forall a i b.
(Ord a, Ix i) =>
(# 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
Ordering
_ -> forall a b. (a, b) -> b
snd (a, b)
p
| a
x forall a. Eq a => a -> a -> Bool
== forall a b. (a, b) -> a
fst (a, b)
m = forall a b. (a, b) -> b
snd (a, b)
m
| a
x forall a. Eq a => a -> a -> Bool
== forall a b. (a, b) -> a
fst (a, b)
k = 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 = forall i e. Array i e -> Int -> e
unsafeAt Array i (a, b)
arr (Int# -> Int
I# Int#
n#)
{-# INLINABLE gBF3 #-}
getBFst' :: Ord a => (b, Array Int (a, b)) -> a -> b
getBFst' :: forall a b. Ord a => (b, Array Int (a, b)) -> a -> b
getBFst' (b
def, Array Int (a, b)
arr) = forall a i b.
(Ord a, Ix i) =>
(# 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) = forall i e. Array i e -> (i, i)
bounds Array Int (a, b)
arr
!k :: (a, b)
k = forall i e. Array i e -> Int -> e
unsafeAt Array Int (a, b)
arr Int
i
!m :: (a, b)
m = 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' :: forall a b. Ord a => b -> [(a, b)] -> a -> b
getBFstLSorted' b
def [(a, b)]
xs = forall a i b.
(Ord a, Ix i) =>
(# 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 = forall a. [a] -> Int
length [(a, b)]
xs forall a. Num a => a -> a -> a
- Int
1
!arr :: Array Int (a, b)
arr = forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (Int
0,Int
l) [(a, b)]
xs
!k :: (a, b)
k = forall i e. Array i e -> Int -> e
unsafeAt Array Int (a, b)
arr Int
0
!m :: (a, b)
m = 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' :: forall a b. Ord a => b -> [(a, b)] -> a -> b
getBFstL' b
def [(a, b)]
xs = forall a i b.
(Ord a, Ix i) =>
(# 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 = forall a. [a] -> Int
length [(a, b)]
xs forall a. Num a => a -> a -> a
- Int
1
!arr :: Array Int (a, b)
arr = forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (Int
0,Int
l) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall b a. Ord b => (a -> b) -> [a] -> [a]
L.sortOn forall a b. (a, b) -> a
fst forall a b. (a -> b) -> a -> b
$ [(a, b)]
xs
!k :: (a, b)
k = forall i e. Array i e -> Int -> e
unsafeAt Array Int (a, b)
arr Int
0
!m :: (a, b)
m = 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 :: forall a b. Ord a => [(a, b)] -> Array Int (a, b)
listArrSortedByFst [(a, b)]
xs = forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (Int
0,Int
l forall a. Num a => a -> a -> a
- Int
1) [(a, b)]
ys
where !ys :: [(a, b)]
ys = forall b a. Ord b => (a -> b) -> [a] -> [a]
L.sortOn forall a b. (a, b) -> a
fst [(a, b)]
xs
!l :: Int
l = forall a. [a] -> Int
length [(a, b)]
ys
{-# INLINE listArrSortedByFst #-}