{-# LANGUAGE NoImplicitPrelude, UnicodeSyntax #-}

module Prelude.Unicode
    ( (¬), (∧), (∨)
    , (≡), (≢), (≠)
    , (≤), (≥), (≮), (≯)
    , (−)
    , π
    , (÷), (×), (⋅)
    , (∘)
    , (⧺)
    , (∈), (∉)
    , (‼)
    , (⊥)
    , (∣), (∤)
    , ℤ, ℚ
    , 𝜀
    ) where

-------------------------------------------------------------------------------
-- Imports
-------------------------------------------------------------------------------

-- from base:
import Data.Bool ( Bool )
import Data.Eq ( (==) )
import Data.Ratio ( Ratio )
import Prelude    ( Num, Floating, Fractional, Integer, Integral
                  , (-), (/), (*), pi, undefined, mod
                  )

-- from base-unicode-symbols:
import Data.Bool.Unicode     ( (∧), (∨), (¬) )
import Data.Eq.Unicode       ( (≡), (≢), (≠) )
import Data.Function.Unicode ( (∘) )
import Data.List.Unicode     ( (⧺), (∈), (∉), (‼), 𝜀 )
import Data.Ord.Unicode      ( (≤), (≥), (≮), (≯) )


-------------------------------------------------------------------------------
-- Fixities
-------------------------------------------------------------------------------

infixl 7 ÷
infixl 7 ×, ⋅
infixl 6 −
infix 4 ∣
infix 4 ∤


-------------------------------------------------------------------------------
-- Symbols
-------------------------------------------------------------------------------

{-|
π = 'pi'

U+03C0, GREEK SMALL LETTER PI
-}
π ∷ Floating α ⇒ α
π :: forall α. Floating α => α
π = α
forall α. Floating α => α
pi
{-# INLINE π #-}

{-|
(÷) = ('/')

U+00F7, DIVISION SIGN
-}
(÷) ∷ Fractional α ⇒ α → α → α
÷ :: forall α. Fractional α => α -> α -> α
(÷) = α -> α -> α
forall α. Fractional α => α -> α -> α
(/)
{-# INLINE (÷) #-}

{-|
(×) = ('*')

U+00D7, MULTIPLICATION SIGN
-}
(×) ∷ Num α ⇒ α → α → α
× :: forall α. Num α => α -> α -> α
(×) = α -> α -> α
forall α. Num α => α -> α -> α
(*)
{-# INLINE (×) #-}

{-|
(⋅) = ('*')

U+22C5, DOT OPERATOR
-}
(⋅) ∷ Num α ⇒ α → α → α
⋅ :: forall α. Num α => α -> α -> α
(⋅) = α -> α -> α
forall α. Num α => α -> α -> α
(*)
{-# INLINE (⋅) #-}

{-|
(⊥) = 'undefined'

U+22A5, UP TACK
-}
(⊥) ∷ α
⊥ :: forall α. α
(⊥) = α
forall a. HasCallStack => a
undefined
{-# INLINE (⊥) #-}

{-|
a ∣ b = mod a b == 0

U+2223, DIVIDES
-}
(∣) ∷ Integral a ⇒ a → a → Bool
a
a ∣ :: forall a. Integral a => a -> a -> Bool
∣ a
b = a -> a -> a
forall a. Integral a => a -> a -> a
mod a
a a
b a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
0
{-# INLINE (∣) #-}

{-|
a ∤ b = not (a ∣ b)

U+2224, DOES NOT DIVIDE
-}
(∤) ∷ Integral a ⇒ a → a → Bool
a
a ∤ :: forall a. Integral a => a -> a -> Bool
∤ a
b = Bool -> Bool
(¬)(a
a a -> a -> Bool
forall a. Integral a => a -> a -> Bool
∣ a
b)
{-# INLINE (∤) #-}

{-|
a − b = a - b

U+2212, MINUS SIGN
-}
(−) ∷ Num a ⇒ a → a → a
− :: forall α. Num α => α -> α -> α
(−) = (-)
{-# INLINE (−) #-}

-------------------------------------------------------------------------------
-- Types
-------------------------------------------------------------------------------

{-|
U+2124, DOUBLE-STRUCK CAPITAL Z
-}
type ℤ = Integer

{-|
U+2124, DOUBLE-STRUCK CAPITAL Q
-}
type ℚ = Ratio ℤ