{-
	Low, Medium, High Datatype
	HGamer3D Library (A project to enable 3D game development in Haskell)
	Copyright 2011-2017 Peter Althainz
	
	Distributed under the Apache License, Version 2.0
	(See attached file LICENSE or copy at 
	http://www.apache.org/licenses/LICENSE-2.0)
 
	file: HGamer3D/Data/LMH.hs
-}

-- | Data type to specify a 3 choice volume of anything: Low, Medium, High
module HGamer3D.Data.LMH
where 

import Fresco
import Data.Binary.Serialise.CBOR
import Data.Binary.Serialise.CBOR.Encoding
import Data.Binary.Serialise.CBOR.Decoding

import Data.Text
import Data.Monoid
import Control.Applicative


type Switch = Bool

ctSwitch :: ComponentType Switch
ctSwitch = ComponentType 0x30b235f8b63df8b0

data LMH = Low
    | Medium
    | High
    deriving (Eq, Read, Show)

type QualityLMH = LMH

ctQualityLMH :: ComponentType QualityLMH
ctQualityLMH = ComponentType 0xd632bb5447a6c93c

instance Serialise LMH where
    encode (Low) = encodeListLen 1 <>  encode (0::Int) 
    encode (Medium) = encodeListLen 1 <>  encode (1::Int) 
    encode (High) = encodeListLen 1 <>  encode (2::Int) 
    decode = do
        decodeListLen
        i <- decode :: Decoder s Int
        case i of
            0 -> (pure Low)
            1 -> (pure Medium)
            2 -> (pure High)