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

-- module HROOT.Class.Interface where

module HROOT.Class.TF1.Interface where


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

import HROOT.Class.TF1.RawType
import HROOT.Class.TObject.RawType
import HROOT.Class.TH1.RawType
import HROOT.Class.TAxis.RawType
import HROOT.Class.TObject.Interface
import HROOT.Class.TFormula.Interface
import HROOT.Class.TAttLine.Interface
import HROOT.Class.TAttFill.Interface
import HROOT.Class.TAttMarker.Interface


class (ITFormula a,ITAttLine a,ITAttFill a,ITAttMarker a) => ITF1 a where

    derivative :: a -> Double -> [Double] -> Double -> IO Double 

    derivative2 :: a -> Double -> [Double] -> Double -> IO Double 

    derivative3 :: a -> Double -> [Double] -> Double -> IO Double 

    drawCopyTF1 :: a -> String -> IO a 

    drawDerivative :: a -> String -> IO TObject 

    drawIntegral :: a -> String -> IO TObject 

    drawF1 :: a -> String -> Double -> Double -> String -> IO () 

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

    getMaximumTF1 :: a -> Double -> Double -> Double -> Double -> Int -> IO Double 

    getMinimumTF1 :: a -> Double -> Double -> Double -> Double -> Int -> IO Double 

    getMaximumX :: a -> Double -> Double -> Double -> Double -> Int -> IO Double 

    getMinimumX :: a -> Double -> Double -> Double -> Double -> Int -> IO Double 

    getNDF :: a -> IO Int 

    getNpx :: a -> IO Int 

    getNumberFreeParameters :: a -> IO Int 

    getNumberFitPoints :: a -> IO Int 

    getParError :: a -> Int -> IO Double 

    getProb :: a -> IO Double 

    getQuantilesTF1 :: a -> Int -> [Double] -> [Double] -> IO Int 

    getRandomTF1 :: a -> Double -> Double -> IO Double 

    getSave :: a -> [Double] -> IO Double 

    getX :: a -> Double -> Double -> Double -> Double -> Int -> IO Double 

    getXmin :: a -> IO Double 

    getXmax :: a -> IO Double 

    gradientPar :: a -> Int -> [Double] -> Double -> IO Double 

    initArgs :: a -> [Double] -> [Double] -> IO () 

    integralTF1 :: a -> Double -> Double -> [Double] -> Double -> IO Double 

    integralError :: a -> Double -> Double -> [Double] -> [Double] -> Double -> IO Double 

    integralFast :: a -> Int -> [Double] -> [Double] -> Double -> Double -> [Double] -> Double -> IO Double 

    isInside :: a -> [Double] -> IO Int 

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

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

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

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

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

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

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

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

    setParErrors :: a -> [Double] -> IO () 

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

    setParent :: (ITObject c0, FPtr c0) => a -> c0 -> IO () 

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

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

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

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

    moment :: a -> Double -> Double -> Double -> [Double] -> Double -> IO Double 

    centralMoment :: a -> Double -> Double -> Double -> [Double] -> Double -> IO Double 

    mean :: a -> Double -> Double -> [Double] -> Double -> IO Double 

    variance :: a -> Double -> Double -> [Double] -> Double -> IO Double 

instance Existable TF1 where
  data Exist TF1 = forall a. (FPtr a, ITF1 a) => ETF1 a

upcastTF1 :: (FPtr a, ITF1 a) => a -> TF1
upcastTF1 h = let fh = get_fptr h
                  fh2 :: ForeignPtr RawTF1 = castForeignPtr fh
              in cast_fptr_to_obj fh2