{-# LANGUAGE ForeignFunctionInterface, TypeFamilies, MultiParamTypeClasses, 
             FlexibleInstances, TypeSynonymInstances, 
             EmptyDataDecls, ExistentialQuantification, ScopedTypeVariables #-}

-- module HROOT.Class.Interface where

module HROOT.Class.TGraph.Interface where


import Data.Word
import Foreign.ForeignPtr
import HROOT.TypeCast

import HROOT.Class.TGraph.RawType
import HROOT.Class.TF1.RawType
import HROOT.Class.TH1F.RawType
import HROOT.Class.TList.RawType
import HROOT.Class.TAxis.RawType
import HROOT.Class.TF1.Interface
import HROOT.Class.TH1F.Interface
import HROOT.Class.TNamed.Interface
import HROOT.Class.TAttLine.Interface
import HROOT.Class.TAttFill.Interface
import HROOT.Class.TAttMarker.Interface


class (ITNamed a,ITAttLine a,ITAttFill a,ITAttMarker a) => ITGraph a where

    apply :: (ITF1 c0, FPtr c0) => a -> c0 -> IO () 

    chisquare :: (ITF1 c0, FPtr c0) => a -> c0 -> IO Double 

    drawGraph :: a -> Int -> [Double] -> [Double] -> String -> IO () 

    drawPanelTGraph :: a -> IO () 

    expand :: a -> Int -> Int -> IO () 

    fitPanelTGraph :: a -> IO () 

    getCorrelationFactorTGraph :: a -> IO Double 

    getCovarianceTGraph :: a -> IO Double 

    getMeanTGraph :: a -> Int -> IO Double 

    getRMSTGraph :: a -> Int -> IO Double 

    getErrorX :: a -> Int -> IO Double 

    getErrorY :: a -> Int -> IO Double 

    getErrorXhigh :: a -> Int -> IO Double 

    getErrorXlow :: a -> Int -> IO Double 

    getErrorYhigh :: a -> Int -> IO Double 

    getErrorYlow :: a -> Int -> IO Double 

    initExpo :: a -> Double -> Double -> IO () 

    initGaus :: a -> Double -> Double -> IO () 

    initPolynom :: a -> Double -> Double -> IO () 

    insertPoint :: a -> IO Int 

    integralTGraph :: a -> Int -> Int -> IO Double 

    isEditable :: a -> IO Int 

    isInsideTGraph :: a -> Double -> Double -> IO Int 

    leastSquareFit :: a -> Int -> [Double] -> Double -> Double -> IO () 

    paintStats :: (ITF1 c0, FPtr c0) => a -> c0 -> IO () 

    removePoint :: a -> Int -> IO Int 

    setEditable :: a -> Int -> IO () 

    setHistogram :: (ITH1F c0, FPtr c0) => a -> c0 -> IO () 

    setMaximumTGraph :: a -> Double -> IO () 

    setMinimumTGraph :: a -> Double -> IO () 

    set :: a -> Int -> IO () 

    setPoint :: a -> Int -> Double -> Double -> IO () 

instance Existable TGraph where
  data Exist TGraph = forall a. (FPtr a, ITGraph a) => ETGraph a

upcastTGraph :: (FPtr a, ITGraph a) => a -> TGraph
upcastTGraph h = let fh = get_fptr h
                     fh2 :: ForeignPtr RawTGraph = castForeignPtr fh
                 in cast_fptr_to_obj fh2