{-# LANGUAGE TypeFamilies #-}
--------------------------------------------------------------------------------
-- |
-- Module      :  Network.MQTT.Message
-- Copyright   :  (c) Lars Petersen 2016
-- License     :  MIT
--
-- Maintainer  :  info@lars-petersen.net
-- Stability   :  experimental
--------------------------------------------------------------------------------
module Network.MQTT.Message.QoS where

import Network.MQTT.Trie

-- | The quality of service defines the guarantees given wrt to message reception.
data QoS
  = QoS0 -- ^ Message delivery is not guaranteed.
  | QoS1 -- ^ Message is guaranteed to be delivered at least once.
  | QoS2 -- ^ Message is guaranteed to be delivered exactly once.
  deriving (Eq, Ord, Show, Enum, Bounded)

instance TrieValue QoS where
  data TrieNode QoS = QosNode {-# UNPACK #-} !Int !(Trie QoS)
  node t (Just QoS0)           = QosNode 0 t
  node t (Just QoS1)           = QosNode 1 t
  node t (Just QoS2)           = QosNode 2 t
  node t Nothing               = QosNode 3 t
  nodeNull                     = const False
  nodeTree  (QosNode _ t)      = t
  nodeValue (QosNode 0 _)      = Just QoS0
  nodeValue (QosNode 1 _)      = Just QoS1
  nodeValue (QosNode 2 _)      = Just QoS2
  nodeValue (QosNode _ _)      = Nothing