{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE FlexibleContexts #-}
{-# OPTIONS -Wall #-}

module Data.ZoomCache.PCM.Types (
    -- * PCM Type
      PCM(..)

    -- * Classes
    , ZoomPCM(..)
) where

import Blaze.ByteString.Builder
import Data.Typeable
import Data.ZoomCache.Codec

----------------------------------------------------------------------
-- PCM

data PCM a = PCM { unPCM :: !a }
    deriving (Typeable)

----------------------------------------------------------------------
-- ZoomPCM

class (Ord a, Real a, ZoomReadable (PCM a), ZoomWritable (PCM a)) => ZoomPCM a where
    pcmFromRaw :: a -> Builder

    pcmMin :: SummaryData (PCM a) -> a
    pcmMax :: SummaryData (PCM a) -> a
    pcmAvg :: SummaryData (PCM a) -> Double
    pcmRMS :: SummaryData (PCM a) -> Double

    pcmWorkSO    :: SummaryWork (PCM a) -> SampleOffset
    pcmWorkLast  :: SummaryWork (PCM a) -> a
    pcmWorkMin   :: SummaryWork (PCM a) -> a
    pcmWorkMax   :: SummaryWork (PCM a) -> a
    pcmWorkSum   :: SummaryWork (PCM a) -> Double
    pcmWorkSumSq :: SummaryWork (PCM a) -> Double

    pcmMkSummary :: a -> a -> Double -> Double -> SummaryData (PCM a)
    pcmMkSummaryWork :: SampleOffset -> a -> a -> a -> Double -> Double
                     -> SummaryWork (PCM a)