-----------------------------------------------------------------------------

-- |

-- Module      :  Device.Nintendo.Switch

-- Copyright   :  (c) Michael Szvetits, 2021

-- License     :  BSD3 (see the file LICENSE)

-- Maintainer  :  typedbyte@qualified.name

-- Stability   :  stable

-- Portability :  portable

--

-- Types and functions for connecting to Nintendo Switch controllers, reading

-- input (e.g., buttons, sensors) and sending commands (e.g., rumble).

-----------------------------------------------------------------------------

module Device.Nintendo.Switch
  ( -- * Connection

    -- ** Switch Console

    Console
  , init
  , exit
  , withConsole
    -- ** Switch Controllers

  , ControllerType(..)
  , ControllerInfo
  , Controller
  , getControllerInfos
  , connect
  , disconnect
  , withController
    -- * Controller Input

    -- ** Input Mode

  , InputMode(..)
  , setInputMode
  , setInertialMeasurement
    -- ** Getting Input

  , getInput
  , getTimeoutInput
    -- ** Input Types

  , Input
  , ControllerInput(..)
  , StickDirection(..)
  , Direction(..)
  , BatteryInfo(..)
  , BatteryStatus(..)
  , ExtraInput(..)
  , Accelerometer
  , Gyroscope
  , ReplyData(SetHomeLight, SetInertialMeasurement, SetInputMode, SetPlayerLights, SetVibration)
  , Acknowledgement(..)
    -- ** Convenience

  , noInput
  , coordinates
  , mergeInputs
  , withCommandReply
    -- * Controller Output

    -- ** Home Light

  , setHomeLight
  , HomeLightConfig(..)
  , CycleConfig
  , BaseDuration
  , Intensity
  , FadeFactor
  , LightFactor
  , RepeatBehaviour
  , endlessPulse
    -- ** Player Lights

  , setPlayerLights
  , PlayerLightsConfig(..)
  , LightMode(..)
  , noPlayerLights
  , playerOne
  , playerTwo
  , playerThree
  , playerFour
  , flashAll
    -- ** Rumble

  , setVibration
  , setLeftRumble
  , setRightRumble
  , setRumble
  , RumbleConfig(..)
  , normalRumble
  , noRumble
    -- * Exceptions

  , ConnectionException(..)
  , InputException(..)
  , OutputException(..)
    -- * Type Classes

  , IsController
  , HasCalibration
  , HasInputMode
  , HasInput
  , HasHomeLight
  , HasPlayerLights
  , HasLeftRumble
  , HasRightRumble
  ) where

-- base

import Prelude hiding (init)

-- switch

import Device.Nintendo.Switch.Connection
import Device.Nintendo.Switch.Controller
import Device.Nintendo.Switch.Input
import Device.Nintendo.Switch.Output