-- | Runtime assertion utility.
--
-- ==== __Example__
-- >>> let !_ = runtimeAssert False "errorMessage"
-- *** Exception: errorMessage
-- ...
--
-- >>> let !_ = checkIndex "AtCoder.Internal.Assert.doctest" 0 3
-- >>> let !_ = checkIndex "AtCoder.Internal.Assert.doctest" (-1) 3
-- *** Exception: AtCoder.Internal.Assert.doctest: given invalid index `-1` over length `3`
-- ...
--
-- >>> let !_ = checkIndexBounded "AtCoder.Internal.Assert.doctest" 2 1 3
-- >>> let !_ = checkIndexBounded "AtCoder.Internal.Assert.doctest" (-1) 1 3
-- *** Exception: AtCoder.Internal.Assert.doctest: given invalid index `-1` over bounds `[1, 3)`
-- ...
--
-- >>> let !_ = checkVertex "AtCoder.Internal.Assert.doctest" 0 3
-- >>> let !_ = checkVertex "AtCoder.Internal.Assert.doctest" (-1) 3
-- *** Exception: AtCoder.Internal.Assert.doctest: given invalid vertex `-1` over the number of vertices `3`
-- ...
--
-- >>> let !_ = checkEdge "AtCoder.Internal.Assert.doctest" 0 3
-- >>> let !_ = checkEdge "AtCoder.Internal.Assert.doctest" (-1) 3
-- *** Exception: AtCoder.Internal.Assert.doctest: given invalid edge index `-1` over the number of edges `3`
-- ...
--
-- >>> let !_ = checkCustom "AtCoder.Internal.Assert.doctest" "index" 0 "set" 3
-- >>> let !_ = checkCustom "AtCoder.Internal.Assert.doctest" "index" (-1) "set" 3
-- *** Exception: AtCoder.Internal.Assert.doctest: given invalid index `-1` over set `3`
-- ...
--
-- >>> let !_ = checkInterval "AtCoder.Internal.Assert.doctest" 0 3 3
-- >>> let !_ = checkInterval "AtCoder.Internal.Assert.doctest" 0 4 3
-- *** Exception: AtCoder.Internal.Assert.doctest: given invalid interval `[0, 4)` over length `3`
-- ...
--
-- >>> let !_ = checkIntervalBounded "AtCoder.Internal.Assert.doctest"  2 4 0 5
-- >>> let !_ = checkIntervalBounded "AtCoder.Internal.Assert.doctest" (-1) 0 0 5
-- *** Exception: AtCoder.Internal.Assert.doctest: given invalid interval `[-1, 0)` over bounds `[0, 5)`
-- ...
--
-- >>> let !_ = checkPoint2d "AtCoder.Internal.Assert.doctest"  1 1 2 2
-- >>> let !_ = checkPoint2d "AtCoder.Internal.Assert.doctest" 4 4 2 2
-- *** Exception: AtCoder.Internal.Assert.doctest: given invalid point `(4, 4)` for rectangle `[0, 2) x [0, 2)`
-- ...
--
-- >>> let !_ = checkRect "AtCoder.Internal.Assert.doctest"  1 2 1 2 3 3
-- >>> let !_ = checkRect "AtCoder.Internal.Assert.doctest" 1 2 1 2 1 1
-- *** Exception: AtCoder.Internal.Assert.doctest: given invalid rectangle `[1, 2) x [1, 2)` for rectangle `[0, 1) x [0, 1)`
-- ...
--
-- @since 1.0.0.0
module AtCoder.Internal.Assert
  ( -- * Runtime assertion
    runtimeAssert,

    -- * Tests
    testIndex,
    testInterval,
    testIntervalBounded,
    testPoint2d,
    testRect,
    testRectShape,

    -- * Index assertions
    checkIndex,
    errorIndex,
    checkIndexBounded,
    errorIndexBounded,
    checkVertex,
    errorVertex,
    checkEdge,
    errorEdge,
    checkCustom,
    errorCustom,

    -- * Interval assertions
    checkInterval,
    errorInterval,
    checkIntervalBounded,
    errorIntervalBounded,

    -- * Two-dimensional index assertions
    checkPoint2d,
    errorPoint2d,
    checkRect,
    errorRect,
    checkRectShape,
    errorRectShape,
  )
where

import GHC.Stack (HasCallStack)

-- | \(O(1)\) Assertion that is never erased at compile time.
--
-- @since 1.0.0.0
{-# INLINE runtimeAssert #-}
runtimeAssert :: (HasCallStack) => Bool -> String -> ()
runtimeAssert :: HasCallStack => Bool -> String -> ()
runtimeAssert Bool
p String
s
  | Bool
p = ()
  | Bool
otherwise = String -> ()
forall a. HasCallStack => String -> a
error String
s

-- | \(O(1)\) Tests \(i \in [0, n)\).
--
-- @since 1.0.0.0
{-# INLINE testIndex #-}
testIndex :: (HasCallStack) => Int -> Int -> Bool
testIndex :: HasCallStack => Int -> Int -> Bool
testIndex Int
i Int
n = Int
0 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
i Bool -> Bool -> Bool
&& Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
n

-- | \(O(1)\) Tests whether \([l, r)\) is a valid interval in \([0, n)\).
--
-- @since 1.0.0.0
{-# INLINE testInterval #-}
testInterval :: Int -> Int -> Int -> Bool
testInterval :: Int -> Int -> Int -> Bool
testInterval Int
l Int
r Int
n = Int
0 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
l Bool -> Bool -> Bool
&& Int
l Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
r Bool -> Bool -> Bool
&& Int
r Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
n

-- | \(O(1)\) Tests whether \([l, r)\) is a valid interval in \([l_0, r_0)\).
--
-- @since 1.2.1.0
{-# INLINE testIntervalBounded #-}
testIntervalBounded :: Int -> Int -> Int -> Int -> Bool
testIntervalBounded :: Int -> Int -> Int -> Int -> Bool
testIntervalBounded Int
l Int
r Int
l0 Int
r0 = Int
l0 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
l Bool -> Bool -> Bool
&& Int
l Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
r Bool -> Bool -> Bool
&& Int
r Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
r0

-- | \(O(1)\) Tests \((x, y) \in [0, w) \times [0, h)\).
--
-- @since 1.2.3.0
{-# INLINE testPoint2d #-}
testPoint2d :: (HasCallStack) => Int -> Int -> Int -> Int -> Bool
testPoint2d :: HasCallStack => Int -> Int -> Int -> Int -> Bool
testPoint2d Int
x Int
y Int
w Int
h = Int
0 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
x Bool -> Bool -> Bool
&& Int
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
w Bool -> Bool -> Bool
&& Int
0 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
y Bool -> Bool -> Bool
&& Int
y Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
h

-- | \(O(1)\) Tests \([x_1, x_2) \times [y_1 y_2) \in [0, w) \times [0, h)\).
--
-- @since 1.2.3.0
{-# INLINE testRect #-}
testRect :: (HasCallStack) => Int -> Int -> Int -> Int -> Int -> Int -> Bool
testRect :: HasCallStack => Int -> Int -> Int -> Int -> Int -> Int -> Bool
testRect Int
x1 Int
x2 Int
y1 Int
y2 Int
w Int
h = Int
0 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
x1 Bool -> Bool -> Bool
&& Int
x1 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
x2 Bool -> Bool -> Bool
&& Int
x2 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
w Bool -> Bool -> Bool
&& Int
0 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
y1 Bool -> Bool -> Bool
&& Int
y1 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
y2 Bool -> Bool -> Bool
&& Int
y2 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
h

-- | \(O(1)\) Tests \(x_1 \le x_2\) and \(y_1 \le \y_2\).
--
-- @since 1.2.3.0
{-# INLINE testRectShape #-}
testRectShape :: (HasCallStack) => Int -> Int -> Int -> Int -> Bool
testRectShape :: HasCallStack => Int -> Int -> Int -> Int -> Bool
testRectShape Int
x1 Int
x2 Int
y1 Int
y2 = Int
x1 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
x2 Bool -> Bool -> Bool
&& Int
y1 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
y2

-- | \(O(1)\) Asserts \(0 \leq i \lt n\) for an array index \(i\).
--
-- @since 1.0.0.0
{-# INLINE checkIndex #-}
checkIndex :: (HasCallStack) => String -> Int -> Int -> ()
checkIndex :: HasCallStack => String -> Int -> Int -> ()
checkIndex String
funcName Int
i Int
n
  | Int
0 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
i Bool -> Bool -> Bool
&& Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
n = ()
  | Bool
otherwise = String -> Int -> Int -> ()
forall a. HasCallStack => String -> Int -> Int -> a
errorIndex String
funcName Int
i Int
n

-- | \(O(1)\) Emits index boundary error.
--
-- @since 1.0.0.0
{-# INLINE errorIndex #-}
errorIndex :: (HasCallStack) => String -> Int -> Int -> a
errorIndex :: forall a. HasCallStack => String -> Int -> Int -> a
errorIndex String
funcName Int
i Int
n =
  String -> a
forall a. HasCallStack => String -> a
error (String -> a) -> String -> a
forall a b. (a -> b) -> a -> b
$ String
funcName String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
": given invalid index `" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
i String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"` over length `" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
n String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"`"

-- | \(O(1)\) Asserts \(l_0 \leq i \lt r_0\) for an array index \(i\).
--
-- @since 1.2.1.0
{-# INLINE checkIndexBounded #-}
checkIndexBounded :: (HasCallStack) => String -> Int -> Int -> Int -> ()
checkIndexBounded :: HasCallStack => String -> Int -> Int -> Int -> ()
checkIndexBounded String
funcName Int
i Int
l Int
r
  | Int
l Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
i Bool -> Bool -> Bool
&& Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
r = ()
  | Bool
otherwise = String -> Int -> Int -> Int -> ()
forall a. HasCallStack => String -> Int -> Int -> Int -> a
errorIndexBounded String
funcName Int
i Int
l Int
r

-- | \(O(1)\) Emits index boundary error.
--
-- @since 1.2.1.0
{-# INLINE errorIndexBounded #-}
errorIndexBounded :: (HasCallStack) => String -> Int -> Int -> Int -> a
errorIndexBounded :: forall a. HasCallStack => String -> Int -> Int -> Int -> a
errorIndexBounded String
funcName Int
i Int
l Int
r =
  String -> a
forall a. HasCallStack => String -> a
error (String -> a) -> String -> a
forall a b. (a -> b) -> a -> b
$ String
funcName String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
": given invalid index `" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
i String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"` over bounds `[" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
l String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
", " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
r String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
")`"

-- | \(O(1)\) Asserts \(0 \leq i \lt n\) for a graph vertex \(i\).
--
-- @since 1.0.0.0
{-# INLINE checkVertex #-}
checkVertex :: (HasCallStack) => String -> Int -> Int -> ()
checkVertex :: HasCallStack => String -> Int -> Int -> ()
checkVertex String
funcName Int
i Int
n
  | Int
0 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
i Bool -> Bool -> Bool
&& Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
n = ()
  | Bool
otherwise = String -> Int -> Int -> ()
forall a. HasCallStack => String -> Int -> Int -> a
errorVertex String
funcName Int
i Int
n

-- | \(O(1)\) Emits vertex boundary error.
--
-- @since 1.0.0.0
{-# INLINE errorVertex #-}
errorVertex :: (HasCallStack) => String -> Int -> Int -> a
errorVertex :: forall a. HasCallStack => String -> Int -> Int -> a
errorVertex String
funcName Int
i Int
n =
  String -> a
forall a. HasCallStack => String -> a
error (String -> a) -> String -> a
forall a b. (a -> b) -> a -> b
$ String
funcName String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
": given invalid vertex `" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
i String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"` over the number of vertices `" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
n String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"`"

-- | \(O(1)\) Asserts \(0 \leq i \lt m\) for an edge index \(i\).
--
-- @since 1.0.0.0
{-# INLINE checkEdge #-}
checkEdge :: (HasCallStack) => String -> Int -> Int -> ()
checkEdge :: HasCallStack => String -> Int -> Int -> ()
checkEdge String
funcName Int
i Int
n
  | Int
0 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
i Bool -> Bool -> Bool
&& Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
n = ()
  | Bool
otherwise = String -> Int -> Int -> ()
forall a. HasCallStack => String -> Int -> Int -> a
errorEdge String
funcName Int
i Int
n

-- | \(O(1)\) Emits edge index boundary error.
--
-- @since 1.0.0.0
{-# INLINE errorEdge #-}
errorEdge :: (HasCallStack) => String -> Int -> Int -> a
errorEdge :: forall a. HasCallStack => String -> Int -> Int -> a
errorEdge String
funcName Int
i Int
n =
  String -> a
forall a. HasCallStack => String -> a
error (String -> a) -> String -> a
forall a b. (a -> b) -> a -> b
$ String
funcName String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
": given invalid edge index `" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
i String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"` over the number of edges `" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
n String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"`"

-- | \(O(1)\) Asserts index boundary with custom message.
--
-- @since 1.0.0.0
{-# INLINE checkCustom #-}
checkCustom :: (HasCallStack) => String -> String -> Int -> String -> Int -> ()
checkCustom :: HasCallStack => String -> String -> Int -> String -> Int -> ()
checkCustom String
funcName String
indexName Int
i String
setName Int
n
  | HasCallStack => Int -> Int -> Bool
Int -> Int -> Bool
testIndex Int
i Int
n = ()
  | Bool
otherwise = String -> String -> Int -> String -> Int -> ()
forall a.
HasCallStack =>
String -> String -> Int -> String -> Int -> a
errorCustom String
funcName String
indexName Int
i String
setName Int
n

-- | \(O(1)\) Emis custom index error.
--
-- @since 1.0.0.0
{-# INLINE errorCustom #-}
errorCustom :: (HasCallStack) => String -> String -> Int -> String -> Int -> a
errorCustom :: forall a.
HasCallStack =>
String -> String -> Int -> String -> Int -> a
errorCustom String
funcName String
indexName Int
i String
setName Int
n = String -> a
forall a. HasCallStack => String -> a
error (String -> a) -> String -> a
forall a b. (a -> b) -> a -> b
$ String
funcName String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
": given invalid " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
indexName String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" `" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
i String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"` over " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
setName String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" `" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
n String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"`"

-- | \(O(1)\) Asserts \(0 \leq l \leq r \leq n\) for a half-open interval \([l, r)\).
--
-- @since 1.0.0.0
{-# INLINE checkInterval #-}
checkInterval :: (HasCallStack) => String -> Int -> Int -> Int -> ()
checkInterval :: HasCallStack => String -> Int -> Int -> Int -> ()
checkInterval String
funcName Int
l Int
r Int
n
  | Int -> Int -> Int -> Bool
testInterval Int
l Int
r Int
n = ()
  | Bool
otherwise = String -> Int -> Int -> Int -> ()
forall a. HasCallStack => String -> Int -> Int -> Int -> a
errorInterval String
funcName Int
l Int
r Int
n

-- | \(O(1)\) Emits interval boundary error.
--
-- @since 1.0.0.0
{-# INLINE errorInterval #-}
errorInterval :: (HasCallStack) => String -> Int -> Int -> Int -> a
errorInterval :: forall a. HasCallStack => String -> Int -> Int -> Int -> a
errorInterval String
funcName Int
l Int
r Int
n = String -> a
forall a. HasCallStack => String -> a
error (String -> a) -> String -> a
forall a b. (a -> b) -> a -> b
$ String
funcName String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
": given invalid interval `[" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
l String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
", " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
r String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
")` over length `" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
n String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"`"

-- | \(O(1)\) Asserts \(0 \leq l \leq r \leq n\) for a half-open interval \([l, r)\).
--
-- @since 1.2.1.0
{-# INLINE checkIntervalBounded #-}
checkIntervalBounded :: (HasCallStack) => String -> Int -> Int -> Int -> Int -> ()
checkIntervalBounded :: HasCallStack => String -> Int -> Int -> Int -> Int -> ()
checkIntervalBounded String
funcName Int
l Int
r Int
l0 Int
r0
  | Int -> Int -> Int -> Int -> Bool
testIntervalBounded Int
l Int
r Int
l0 Int
r0 = ()
  | Bool
otherwise = String -> Int -> Int -> Int -> Int -> ()
forall a. HasCallStack => String -> Int -> Int -> Int -> Int -> a
errorIntervalBounded String
funcName Int
l Int
r Int
l0 Int
r0

-- | \(O(1)\) Emits interval boundary error.
--
-- @since 1.2.1.0
{-# INLINE errorIntervalBounded #-}
errorIntervalBounded :: (HasCallStack) => String -> Int -> Int -> Int -> Int -> a
errorIntervalBounded :: forall a. HasCallStack => String -> Int -> Int -> Int -> Int -> a
errorIntervalBounded String
funcName Int
l Int
r Int
l0 Int
r0 = String -> a
forall a. HasCallStack => String -> a
error (String -> a) -> String -> a
forall a b. (a -> b) -> a -> b
$ String
funcName String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
": given invalid interval `[" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
l String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
", " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
r String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
")` over bounds `[" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
l0 String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
", " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
r0 String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
")`"

-- | \(O(1)\) Asserts \(0 \leq i \lt n\) for a graph vertex \(i\).
--
-- @since 1.2.3.0
{-# INLINE checkPoint2d #-}
checkPoint2d :: (HasCallStack) => String -> Int -> Int -> Int -> Int -> ()
checkPoint2d :: HasCallStack => String -> Int -> Int -> Int -> Int -> ()
checkPoint2d String
funcName Int
x Int
y Int
w Int
h
  | HasCallStack => Int -> Int -> Int -> Int -> Bool
Int -> Int -> Int -> Int -> Bool
testPoint2d Int
x Int
y Int
w Int
h = ()
  | Bool
otherwise = String -> Int -> Int -> Int -> Int -> ()
forall a. HasCallStack => String -> Int -> Int -> Int -> Int -> a
errorPoint2d String
funcName Int
x Int
y Int
w Int
h

-- | \(O(1)\) Emits point boundary error.
--
-- @since 1.2.3.0
{-# INLINE errorPoint2d #-}
errorPoint2d :: (HasCallStack) => String -> Int -> Int -> Int -> Int -> a
errorPoint2d :: forall a. HasCallStack => String -> Int -> Int -> Int -> Int -> a
errorPoint2d String
funcName Int
x Int
y Int
w Int
h =
  String -> a
forall a. HasCallStack => String -> a
error (String -> a) -> String -> a
forall a b. (a -> b) -> a -> b
$ String
funcName String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
": given invalid point `(" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
x String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
", " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
y String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
")` for rectangle `[0, " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
w String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
") x [0, " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
h String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
")`"

-- | \(O(1)\) Asserts \([x_1, x_2) \times [y_1 y_2) \in [0, w) \times [0, h)\).
--
-- @since 1.2.3.0
{-# INLINE checkRect #-}
checkRect :: (HasCallStack) => String -> Int -> Int -> Int -> Int -> Int -> Int -> ()
checkRect :: HasCallStack =>
String -> Int -> Int -> Int -> Int -> Int -> Int -> ()
checkRect String
funcName Int
x1 Int
x2 Int
y1 Int
y2 Int
w Int
h
  | HasCallStack => Int -> Int -> Int -> Int -> Int -> Int -> Bool
Int -> Int -> Int -> Int -> Int -> Int -> Bool
testRect Int
x1 Int
x2 Int
y1 Int
y2 Int
w Int
h = ()
  | Bool
otherwise = String -> Int -> Int -> Int -> Int -> Int -> Int -> ()
forall a.
HasCallStack =>
String -> Int -> Int -> Int -> Int -> Int -> Int -> a
errorRect String
funcName Int
x1 Int
x2 Int
y1 Int
y2 Int
w Int
h

-- | \(O(1)\) Asserts rectangle boundary error.
--
-- @since 1.2.3.0
{-# INLINE errorRect #-}
errorRect :: (HasCallStack) => String -> Int -> Int -> Int -> Int -> Int -> Int -> a
errorRect :: forall a.
HasCallStack =>
String -> Int -> Int -> Int -> Int -> Int -> Int -> a
errorRect String
funcName Int
x1 Int
x2 Int
y1 Int
y2 Int
w Int
h =
  String -> a
forall a. HasCallStack => String -> a
error (String -> a) -> String -> a
forall a b. (a -> b) -> a -> b
$ String
funcName String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
": given invalid rectangle `[" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
x1 String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
", " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
x2 String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
") x [" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
y1 String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
", " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
y2 String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
")` for rectangle `[0, " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
w String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
") x [0, " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
h String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
")`"

-- | \(O(1)\) Asserts \(x_1 \le x_2\) and \(y_1 \le \y_2\).
--
-- @since 1.2.3.0
{-# INLINE checkRectShape #-}
checkRectShape :: (HasCallStack) => String -> Int -> Int -> Int -> Int -> ()
checkRectShape :: HasCallStack => String -> Int -> Int -> Int -> Int -> ()
checkRectShape String
funcName Int
x1 Int
x2 Int
y1 Int
y2
  | HasCallStack => Int -> Int -> Int -> Int -> Bool
Int -> Int -> Int -> Int -> Bool
testRectShape Int
x1 Int
x2 Int
y1 Int
y2 = ()
  | Bool
otherwise = String -> Int -> Int -> Int -> Int -> ()
forall a. HasCallStack => String -> Int -> Int -> Int -> Int -> a
errorRectShape String
funcName Int
x1 Int
x2 Int
y1 Int
y2

-- | \(O(1)\) Asserts rectangle boundary error.
--
-- @since 1.2.3.0
{-# INLINE errorRectShape #-}
errorRectShape :: (HasCallStack) => String -> Int -> Int -> Int -> Int -> a
errorRectShape :: forall a. HasCallStack => String -> Int -> Int -> Int -> Int -> a
errorRectShape String
funcName Int
x1 Int
x2 Int
y1 Int
y2 =
  String -> a
forall a. HasCallStack => String -> a
error (String -> a) -> String -> a
forall a b. (a -> b) -> a -> b
$ String
funcName String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
": given invalid rectangle `[" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
x1 String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
", " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
x2 String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
") x [" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
y1 String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
", " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
y2 String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
")`"