content: {-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-}
  
  -- | This module contains the definition of a Type Class that represents a Heap.
  -- In the context of QIO, a Heap is the type used to represent a classical 
  -- basis state. An instance of a Heap is also defined, that makes use of a Map.
  module QIO.Heap where
  
  import qualified Data.Map as Map
  import Data.Maybe as Maybe
  import QIO.QioSyn
  
  -- | The Heap Type Class
  class Eq h => Heap h where
        -- | define an 'initial' (i.e. empty) Heap
        initial :: h
        -- | 'update' the value of a Qubit within the Heap to the given Boolen value
        update :: h -> Qbit -> Bool -> h
        -- | Lookup the value of the given Qubit in the Heap (if it exists)
        (?) :: h -> Qbit -> Maybe Bool
        -- | remove the given Qubit from the Heap
        forget :: h -> Qbit -> h
        -- | Swap the values associated with two Qubits within the Heap
        hswap :: h -> Qbit -> Qbit -> h
        hswap h x y = update (update h y (fromJust (h ? x))) x (fromJust (h ? y)) 
  
  -- | HeapMap is simply a type synonym for a Map from Qubits to Boolean values
  type HeapMap = Map.Map Qbit Bool
  
  -- | A HeapMap is an instance of the Heap type class, where the Heap functions
  -- can make use of the underlying Map functions.
  instance Heap HeapMap where
         initial = Map.empty
         update h q b = Map.insert q b h
         h ? q = Map.lookup q h
         forget h q = Map.delete q h
  
  
      
  
  
  