module Termbox.Internal.Mouse
  ( Mouse (..),
    MouseButton
      ( MouseButton,
        LeftClick,
        MiddleClick,
        RightClick,
        ReleaseClick,
        WheelDown,
        WheelUp
      ),
  )
where

import GHC.Generics (Generic)
import qualified Termbox.Bindings.Hs
import Termbox.Internal.Pos (Pos)

-- | A mouse event.
data Mouse = Mouse
  { Mouse -> MouseButton
button :: !MouseButton,
    Mouse -> Pos
pos :: !Pos
  }
  deriving stock (Mouse -> Mouse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Mouse -> Mouse -> Bool
$c/= :: Mouse -> Mouse -> Bool
== :: Mouse -> Mouse -> Bool
$c== :: Mouse -> Mouse -> Bool
Eq, forall x. Rep Mouse x -> Mouse
forall x. Mouse -> Rep Mouse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Mouse x -> Mouse
$cfrom :: forall x. Mouse -> Rep Mouse x
Generic, Eq Mouse
Mouse -> Mouse -> Bool
Mouse -> Mouse -> Ordering
Mouse -> Mouse -> Mouse
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Mouse -> Mouse -> Mouse
$cmin :: Mouse -> Mouse -> Mouse
max :: Mouse -> Mouse -> Mouse
$cmax :: Mouse -> Mouse -> Mouse
>= :: Mouse -> Mouse -> Bool
$c>= :: Mouse -> Mouse -> Bool
> :: Mouse -> Mouse -> Bool
$c> :: Mouse -> Mouse -> Bool
<= :: Mouse -> Mouse -> Bool
$c<= :: Mouse -> Mouse -> Bool
< :: Mouse -> Mouse -> Bool
$c< :: Mouse -> Mouse -> Bool
compare :: Mouse -> Mouse -> Ordering
$ccompare :: Mouse -> Mouse -> Ordering
Ord, Int -> Mouse -> ShowS
[Mouse] -> ShowS
Mouse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Mouse] -> ShowS
$cshowList :: [Mouse] -> ShowS
show :: Mouse -> String
$cshow :: Mouse -> String
showsPrec :: Int -> Mouse -> ShowS
$cshowsPrec :: Int -> Mouse -> ShowS
Show)

-- | A mouse button.
newtype MouseButton
  = MouseButton Termbox.Bindings.Hs.Tb_key
  deriving stock (MouseButton -> MouseButton -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MouseButton -> MouseButton -> Bool
$c/= :: MouseButton -> MouseButton -> Bool
== :: MouseButton -> MouseButton -> Bool
$c== :: MouseButton -> MouseButton -> Bool
Eq, Eq MouseButton
MouseButton -> MouseButton -> Bool
MouseButton -> MouseButton -> Ordering
MouseButton -> MouseButton -> MouseButton
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: MouseButton -> MouseButton -> MouseButton
$cmin :: MouseButton -> MouseButton -> MouseButton
max :: MouseButton -> MouseButton -> MouseButton
$cmax :: MouseButton -> MouseButton -> MouseButton
>= :: MouseButton -> MouseButton -> Bool
$c>= :: MouseButton -> MouseButton -> Bool
> :: MouseButton -> MouseButton -> Bool
$c> :: MouseButton -> MouseButton -> Bool
<= :: MouseButton -> MouseButton -> Bool
$c<= :: MouseButton -> MouseButton -> Bool
< :: MouseButton -> MouseButton -> Bool
$c< :: MouseButton -> MouseButton -> Bool
compare :: MouseButton -> MouseButton -> Ordering
$ccompare :: MouseButton -> MouseButton -> Ordering
Ord)

instance Show MouseButton where
  show :: MouseButton -> String
show = \case
    MouseButton
LeftClick -> String
"LeftClick"
    MouseButton
MiddleClick -> String
"MiddleClick"
    MouseButton
ReleaseClick -> String
"ReleaseClick"
    MouseButton
RightClick -> String
"RightClick"
    MouseButton
WheelDown -> String
"WheelDown"
    MouseButton
WheelUp -> String
"WheelUp"

pattern LeftClick :: MouseButton
pattern $bLeftClick :: MouseButton
$mLeftClick :: forall {r}. MouseButton -> ((# #) -> r) -> ((# #) -> r) -> r
LeftClick = MouseButton Termbox.Bindings.Hs.TB_KEY_MOUSE_LEFT

pattern MiddleClick :: MouseButton
pattern $bMiddleClick :: MouseButton
$mMiddleClick :: forall {r}. MouseButton -> ((# #) -> r) -> ((# #) -> r) -> r
MiddleClick = MouseButton Termbox.Bindings.Hs.TB_KEY_MOUSE_MIDDLE

pattern RightClick :: MouseButton
pattern $bRightClick :: MouseButton
$mRightClick :: forall {r}. MouseButton -> ((# #) -> r) -> ((# #) -> r) -> r
RightClick = MouseButton Termbox.Bindings.Hs.TB_KEY_MOUSE_RIGHT

pattern ReleaseClick :: MouseButton
pattern $bReleaseClick :: MouseButton
$mReleaseClick :: forall {r}. MouseButton -> ((# #) -> r) -> ((# #) -> r) -> r
ReleaseClick = MouseButton Termbox.Bindings.Hs.TB_KEY_MOUSE_RELEASE

pattern WheelDown :: MouseButton
pattern $bWheelDown :: MouseButton
$mWheelDown :: forall {r}. MouseButton -> ((# #) -> r) -> ((# #) -> r) -> r
WheelDown = MouseButton Termbox.Bindings.Hs.TB_KEY_MOUSE_WHEEL_DOWN

pattern WheelUp :: MouseButton
pattern $bWheelUp :: MouseButton
$mWheelUp :: forall {r}. MouseButton -> ((# #) -> r) -> ((# #) -> r) -> r
WheelUp = MouseButton Termbox.Bindings.Hs.TB_KEY_MOUSE_WHEEL_UP

{-# COMPLETE LeftClick, MiddleClick, ReleaseClick, RightClick, WheelDown, WheelUp #-}