{-# OPTIONS_HADDOCK show-extensions #-}
{-# LANGUAGE BangPatterns, FlexibleContexts #-}
module Languages.UniquenessPeriods.Array.Constraints (
unsafeOrderIJ
, filterOrderIJ
, unsafeTriples
, unsafeQuadruples
, unsafeSeveralA
, unsafeSeveralB
) where
import Data.Maybe (fromJust)
import Data.SubG (InsertLeft(..),filterG)
import GHC.Arr
import Data.Foldable (foldl')
unsafeOrderIJ :: Int -> Int -> Array Int Int -> Bool
unsafeOrderIJ :: Int -> Int -> Array Int Int -> Bool
unsafeOrderIJ Int
i Int
j = (\(Int
_,Int
_,Integer
r) -> if Integer
r Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
== Integer
0 then Bool
True else Bool
False) ((Int, Int, Integer) -> Bool)
-> (Array Int Int -> (Int, Int, Integer)) -> Array Int Int -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Int, Int, Integer) -> Int -> (Int, Int, Integer))
-> (Int, Int, Integer) -> Array Int Int -> (Int, Int, Integer)
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (Int, Int, Integer) -> Int -> (Int, Int, Integer)
forall c a. (Num c, Eq a, Eq c) => (a, a, c) -> a -> (a, a, c)
helpG (Int
i,Int
j,Integer
0)
helpG :: (a, a, c) -> a -> (a, a, c)
helpG (a
t,a
u,c
n) a
z
| a
z a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
t = (a
t,a
u,c
1)
| a
z a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
u =
case c
n of
c
0 -> (a
t,a
u,c
2)
c
_ -> (a
t,a
u,c
n c -> c -> c
forall a. Num a => a -> a -> a
- c
1)
| Bool
otherwise = (a
t,a
u,c
n)
{-# INLINE helpG #-}
filterOrderIJ :: (InsertLeft t (Array Int Int), Monoid (t (Array Int Int))) => Int -> Int -> t (Array Int Int) -> t (Array Int Int)
filterOrderIJ :: Int -> Int -> t (Array Int Int) -> t (Array Int Int)
filterOrderIJ Int
i Int
j = (Array Int Int -> Bool) -> t (Array Int Int) -> t (Array Int Int)
forall (t :: * -> *) a.
(InsertLeft t a, Monoid (t a)) =>
(a -> Bool) -> t a -> t a
filterG (Int -> Int -> Array Int Int -> Bool
unsafeOrderIJ Int
i Int
j)
unsafeTriples :: (InsertLeft t (Array Int Int), Monoid (t (Array Int Int))) => Int -> Int -> Int -> t (Array Int Int) -> t (Array Int Int)
unsafeTriples :: Int -> Int -> Int -> t (Array Int Int) -> t (Array Int Int)
unsafeTriples Int
i Int
j Int
k = (Array Int Int -> Bool) -> t (Array Int Int) -> t (Array Int Int)
forall (t :: * -> *) a.
(InsertLeft t a, Monoid (t a)) =>
(a -> Bool) -> t a -> t a
filterG (\Array Int Int
v -> Int -> Int -> Array Int Int -> Bool
unsafeOrderIJ Int
i Int
j Array Int Int
v Bool -> Bool -> Bool
&& Int -> Int -> Array Int Int -> Bool
unsafeOrderIJ Int
j Int
k Array Int Int
v)
unsafeQuadruples :: (InsertLeft t (Array Int Int), Monoid (t (Array Int Int))) => Int -> Int -> Int -> Int -> t (Array Int Int) -> t (Array Int Int)
unsafeQuadruples :: Int -> Int -> Int -> Int -> t (Array Int Int) -> t (Array Int Int)
unsafeQuadruples Int
i Int
j Int
k Int
l = (Array Int Int -> Bool) -> t (Array Int Int) -> t (Array Int Int)
forall (t :: * -> *) a.
(InsertLeft t a, Monoid (t a)) =>
(a -> Bool) -> t a -> t a
filterG (\Array Int Int
v -> Int -> Int -> Array Int Int -> Bool
unsafeOrderIJ Int
i Int
j Array Int Int
v Bool -> Bool -> Bool
&& Int -> Int -> Array Int Int -> Bool
unsafeOrderIJ Int
j Int
k Array Int Int
v Bool -> Bool -> Bool
&& Int -> Int -> Array Int Int -> Bool
unsafeOrderIJ Int
k Int
l Array Int Int
v)
unsafeSeveralA :: (InsertLeft t (Array Int Int), Monoid (t (Array Int Int))) => Int -> Array Int Int -> t (Array Int Int) -> t (Array Int Int)
unsafeSeveralA :: Int -> Array Int Int -> t (Array Int Int) -> t (Array Int Int)
unsafeSeveralA !Int
i0 Array Int Int
arr t (Array Int Int)
x = (Array Int Int -> Bool) -> t (Array Int Int) -> t (Array Int Int)
forall (t :: * -> *) a.
(InsertLeft t a, Monoid (t a)) =>
(a -> Bool) -> t a -> t a
filterG (Int -> Array Int Int -> Array Int Int -> Bool
forall i. Int -> Array i Int -> Array Int Int -> Bool
g Int
i0 Array Int Int
arr) t (Array Int Int)
x
where g :: Int -> Array i Int -> Array Int Int -> Bool
g !Int
i0 !Array i Int
arr1 Array Int Int
arr2 = (Bool -> Bool) -> Array i Bool -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all Bool -> Bool
forall a. a -> a
id (Array i Bool -> Bool)
-> (Array i Int -> Array i Bool) -> Array i Int -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Bool) -> Array i Int -> Array i Bool
forall a b i. (a -> b) -> Array i a -> Array i b
amap (\Int
k -> Int -> Int -> Array Int Int -> Bool
unsafeOrderIJ Int
i0 Int
k Array Int Int
arr2) (Array i Int -> Bool) -> Array i Int -> Bool
forall a b. (a -> b) -> a -> b
$ Array i Int
arr1
unsafeSeveralB :: (InsertLeft t (Array Int Int), Monoid (t (Array Int Int))) => Int -> Array Int Int -> t (Array Int Int) -> t (Array Int Int)
unsafeSeveralB :: Int -> Array Int Int -> t (Array Int Int) -> t (Array Int Int)
unsafeSeveralB !Int
i0 Array Int Int
arr t (Array Int Int)
x = (Array Int Int -> Bool) -> t (Array Int Int) -> t (Array Int Int)
forall (t :: * -> *) a.
(InsertLeft t a, Monoid (t a)) =>
(a -> Bool) -> t a -> t a
filterG (Int -> Array Int Int -> Array Int Int -> Bool
forall i. Int -> Array i Int -> Array Int Int -> Bool
g Int
i0 Array Int Int
arr) t (Array Int Int)
x
where g :: Int -> Array i Int -> Array Int Int -> Bool
g !Int
i0 !Array i Int
arr1 Array Int Int
arr2 = (Bool -> Bool) -> Array i Bool -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all Bool -> Bool
forall a. a -> a
id (Array i Bool -> Bool)
-> (Array i Int -> Array i Bool) -> Array i Int -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Bool) -> Array i Int -> Array i Bool
forall a b i. (a -> b) -> Array i a -> Array i b
amap (\Int
k -> Int -> Int -> Array Int Int -> Bool
unsafeOrderIJ Int
k Int
i0 Array Int Int
arr2) (Array i Int -> Bool) -> Array i Int -> Bool
forall a b. (a -> b) -> a -> b
$ Array i Int
arr1