{-|
 -Module      : MeasurementPerformer
 -Description : Definition of qubit measure function
 -Copyright   : (c) Mihai Sebastian Ardelean, 2018
 -License     : BSD3
 -Maintainer  : ardeleanasm@gmail.com
 -Portability : POSIX
 -}
module Quantum.MeasurementPerformer
    (
      MeasurementPerformer(..)
    )
    where

import Numeric.LinearAlgebra --hiding ( (|>) )
import Prelude --hiding ((<*>),(<+>))
import System.Random
import Data.List

import Quantum.Qubits
import Quantum.Gates
import Core.MeasureProcessInternal(startMeasurementProcess)

-- | Class MeasurementPerformer used to define measure operation that can be made with 'Quantum.Qubits.Qubit'
class MeasurementPerformer a where
  {-|
  - measure function is used to perform qubit measurement
  
  >>>measure circuit
  Qubit {qubitState = (4><1)
    [ 0.0 :+ 0.0
    , 1.0 :+ 0.0
    , 0.0 :+ 0.0
    , 0.0 :+ 0.0 ]}
 -}
  measure::a->a

-- | MeasurementPerformer instance for 'Quantum.Qubits.Qubit'
instance MeasurementPerformer Qubit where
  measure=startMeasurementProcess