 -- foreign import ccall "mpi_replace" replaceOp :: MPIOperation
 -- TODO: support for those requires better support for pair datatypes
 
-maxOp, minOp, sumOp, prodOp, landOp, bandOp, lorOp, borOp, lxorOp, bxorOp :: Operation
+-- | Predefined reduction operation: maximum
+maxOp :: Operation
 maxOp = MkOperation <$> unsafePerformIO $ peek maxOp_
+
+-- | Predefined reduction operation: minimum
+minOp :: Operation
 minOp = MkOperation <$> unsafePerformIO $ peek minOp_
+
+-- | Predefined reduction operation: (+)
+sumOp :: Operation
 sumOp = MkOperation <$> unsafePerformIO $ peek sumOp_
+
+-- | Predefined reduction operation: (*)
+prodOp :: Operation
 prodOp = MkOperation <$> unsafePerformIO $ peek prodOp_
+
+-- | Predefined reduction operation: logical \"and\"
+landOp :: Operation
 landOp = MkOperation <$> unsafePerformIO $ peek landOp_
+
+-- | Predefined reduction operation: bit-wise \"and\"
+bandOp :: Operation
 bandOp = MkOperation <$> unsafePerformIO $ peek bandOp_
+
+-- | Predefined reduction operation: logical \"or\"
+lorOp :: Operation
 lorOp = MkOperation <$> unsafePerformIO $ peek lorOp_
+
+-- | Predefined reduction operation: bit-wise \"or\"
+borOp :: Operation
 borOp = MkOperation <$> unsafePerformIO $ peek borOp_
+
+-- | Predefined reduction operation: logical \"xor\"
+lxorOp :: Operation
 lxorOp = MkOperation <$> unsafePerformIO $ peek lxorOp_
+
+-- | Predefined reduction operation: bit-wise \"xor\"
+bxorOp :: Operation
 bxorOp = MkOperation <$> unsafePerformIO $ peek bxorOp_
 
 

groupEmpty = MkGroup <$> unsafePerformIO $ peek groupEmpty_


{-
This module provides Haskell type that represents values of @MPI_Op@
type (reduction operations), and predefined reduction operations
defined in the MPI Report.
-}

-- | Actual Haskell type used depends on the MPI implementation.
type MPIOperation = {# type MPI_Op #}
newtype Operation = MkOperation { fromOperation :: MPIOperation } deriving Storable
peekOperation ptr = MkOperation <$> peek ptr
withOperation op f = alloca $ \ptr -> do poke ptr (fromOperation op)

{# fun Irecv as irecvPtr
           { id `BufferPtr', id `Count', fromDatatype `Datatype', fromRank `Rank', fromTag `Tag', fromComm `Comm', castPtr `Ptr Request'} -> `()' checkError*- #}

-- | Broadcast data from one member to all members of the communicator.
{# fun unsafe Bcast as ^
           { id `BufferPtr', id `Count', fromDatatype `Datatype', fromRank `Rank', fromComm `Comm'} -> `()' checkError*- #}

