{-# LANGUAGE BangPatterns, FlexibleContexts #-}
module Languages.UniquenessPeriods.Vector.Constraints (
unsafeOrderIJ
, filterOrderIJ
, unsafeTriples
, unsafeQuadruples
, unsafeSeveralA
, unsafeSeveralB
) where
import qualified Data.Vector as VB
import Data.Maybe (fromJust)
import Data.SubG (InsertLeft(..),filterG)
import Data.SubG.InstancesPlus
unsafeOrderIJ :: Int -> Int -> VB.Vector Int -> Bool
unsafeOrderIJ :: Int -> Int -> Vector Int -> Bool
unsafeOrderIJ Int
i Int
j Vector Int
v = Maybe Int -> Int
forall a. HasCallStack => Maybe a -> a
fromJust ((Int -> Bool) -> Vector Int -> Maybe Int
forall a. (a -> Bool) -> Vector a -> Maybe Int
VB.findIndex (Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
i) Vector Int
v) Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Maybe Int -> Int
forall a. HasCallStack => Maybe a -> a
fromJust ((Int -> Bool) -> Vector Int -> Maybe Int
forall a. (a -> Bool) -> Vector a -> Maybe Int
VB.findIndex (Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
j) Vector Int
v)
filterOrderIJ :: (InsertLeft t (VB.Vector Int), Monoid (t (VB.Vector Int))) => Int -> Int -> t (VB.Vector Int) -> t (VB.Vector Int)
filterOrderIJ :: Int -> Int -> t (Vector Int) -> t (Vector Int)
filterOrderIJ Int
i Int
j = (Vector Int -> Bool) -> t (Vector Int) -> t (Vector Int)
forall (t :: * -> *) a.
(InsertLeft t a, Monoid (t a)) =>
(a -> Bool) -> t a -> t a
filterG (Int -> Int -> Vector Int -> Bool
unsafeOrderIJ Int
i Int
j)
unsafeTriples :: (InsertLeft t (VB.Vector Int), Monoid (t (VB.Vector Int))) => Int -> Int -> Int -> t (VB.Vector Int) -> t (VB.Vector Int)
unsafeTriples :: Int -> Int -> Int -> t (Vector Int) -> t (Vector Int)
unsafeTriples Int
i Int
j Int
k = (Vector Int -> Bool) -> t (Vector Int) -> t (Vector Int)
forall (t :: * -> *) a.
(InsertLeft t a, Monoid (t a)) =>
(a -> Bool) -> t a -> t a
filterG (\Vector Int
v -> Int -> Int -> Vector Int -> Bool
unsafeOrderIJ Int
i Int
j Vector Int
v Bool -> Bool -> Bool
&& Int -> Int -> Vector Int -> Bool
unsafeOrderIJ Int
j Int
k Vector Int
v)
unsafeQuadruples :: (InsertLeft t (VB.Vector Int), Monoid (t (VB.Vector Int))) => Int -> Int -> Int -> Int -> t (VB.Vector Int) -> t (VB.Vector Int)
unsafeQuadruples :: Int -> Int -> Int -> Int -> t (Vector Int) -> t (Vector Int)
unsafeQuadruples Int
i Int
j Int
k Int
l = (Vector Int -> Bool) -> t (Vector Int) -> t (Vector Int)
forall (t :: * -> *) a.
(InsertLeft t a, Monoid (t a)) =>
(a -> Bool) -> t a -> t a
filterG (\Vector Int
v -> Int -> Int -> Vector Int -> Bool
unsafeOrderIJ Int
i Int
j Vector Int
v Bool -> Bool -> Bool
&& Int -> Int -> Vector Int -> Bool
unsafeOrderIJ Int
j Int
k Vector Int
v Bool -> Bool -> Bool
&& Int -> Int -> Vector Int -> Bool
unsafeOrderIJ Int
k Int
l Vector Int
v)
unsafeSeveralA :: (InsertLeft t (VB.Vector Int), Monoid (t (VB.Vector Int))) => Int -> VB.Vector Int -> t (VB.Vector Int) -> t (VB.Vector Int)
unsafeSeveralA :: Int -> Vector Int -> t (Vector Int) -> t (Vector Int)
unsafeSeveralA !Int
i0 Vector Int
v1 t (Vector Int)
v2 =
let j :: a -> Vector a -> Int
j !a
i !Vector a
v = Maybe Int -> Int
forall a. HasCallStack => Maybe a -> a
fromJust ((a -> Bool) -> Vector a -> Maybe Int
forall a. (a -> Bool) -> Vector a -> Maybe Int
VB.findIndex (a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
i) Vector a
v) in
(Vector Int -> Bool) -> t (Vector Int) -> t (Vector Int)
forall (t :: * -> *) a.
(InsertLeft t a, Monoid (t a)) =>
(a -> Bool) -> t a -> t a
filterG (\Vector Int
v -> Int
-> (Int -> Vector Int -> Int) -> Vector Int -> Vector Int -> Bool
forall a t.
Eq a =>
t -> (t -> Vector a -> Int) -> Vector a -> Vector a -> Bool
g Int
i0 Int -> Vector Int -> Int
forall a. Eq a => a -> Vector a -> Int
j Vector Int
v Vector Int
v1) t (Vector Int)
v2
where g :: t -> (t -> Vector a -> Int) -> Vector a -> Vector a -> Bool
g !t
i t -> Vector a -> Int
j !Vector a
v Vector a
v3 = (Int -> Bool) -> Vector Int -> Bool
forall a. (a -> Bool) -> Vector a -> Bool
VB.all (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> t -> Vector a -> Int
j t
i Vector a
v) (Vector Int -> Bool)
-> (Vector a -> Vector Int) -> Vector a -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> Bool) -> Vector a -> Vector Int
forall a. (a -> Bool) -> Vector a -> Vector Int
VB.findIndices (a -> Vector a -> Bool
forall a. Eq a => a -> Vector a -> Bool
`VB.elem` Vector a
v3) (Vector a -> Bool) -> Vector a -> Bool
forall a b. (a -> b) -> a -> b
$ Vector a
v
unsafeSeveralB :: (InsertLeft t (VB.Vector Int), Monoid (t (VB.Vector Int))) => Int -> VB.Vector Int -> t (VB.Vector Int) -> t (VB.Vector Int)
unsafeSeveralB :: Int -> Vector Int -> t (Vector Int) -> t (Vector Int)
unsafeSeveralB !Int
i0 Vector Int
v1 t (Vector Int)
v2 =
let j :: a -> Vector a -> Int
j !a
i !Vector a
v = Maybe Int -> Int
forall a. HasCallStack => Maybe a -> a
fromJust ((a -> Bool) -> Vector a -> Maybe Int
forall a. (a -> Bool) -> Vector a -> Maybe Int
VB.findIndex (a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
i) Vector a
v) in
(Vector Int -> Bool) -> t (Vector Int) -> t (Vector Int)
forall (t :: * -> *) a.
(InsertLeft t a, Monoid (t a)) =>
(a -> Bool) -> t a -> t a
filterG (\Vector Int
v -> Int
-> (Int -> Vector Int -> Int) -> Vector Int -> Vector Int -> Bool
forall a t.
Eq a =>
t -> (t -> Vector a -> Int) -> Vector a -> Vector a -> Bool
g Int
i0 Int -> Vector Int -> Int
forall a. Eq a => a -> Vector a -> Int
j Vector Int
v Vector Int
v1) t (Vector Int)
v2
where g :: t -> (t -> Vector a -> Int) -> Vector a -> Vector a -> Bool
g !t
i t -> Vector a -> Int
j !Vector a
v Vector a
v3 = (Int -> Bool) -> Vector Int -> Bool
forall a. (a -> Bool) -> Vector a -> Bool
VB.all (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< t -> Vector a -> Int
j t
i Vector a
v) (Vector Int -> Bool)
-> (Vector a -> Vector Int) -> Vector a -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> Bool) -> Vector a -> Vector Int
forall a. (a -> Bool) -> Vector a -> Vector Int
VB.findIndices (a -> Vector a -> Bool
forall a. Eq a => a -> Vector a -> Bool
`VB.elem` Vector a
v3) (Vector a -> Bool) -> Vector a -> Bool
forall a b. (a -> b) -> a -> b
$ Vector a
v