{-|
module      :  Data.Number.Flint.Fmpz
copyright   :  (c) 2022 Hartmut Monien
license     :  GNU GPL, version 2 or above (see LICENSE)
maintainer  :  hmonien@uni-bonn.de

An `Fmpz` represents an integer.
This module implements operations on integers.

== Example

__Warning__: Instances like `Show` and `Num` are only
avaible for some types without context.

@
import Data.Number.Flint

main = do 
  let x, y :: Fmpz
      x = 7
      y = 8
      z = x * y
  print z
  print $ factor z
@

Running main yields:

>>> main 
56
[(2,3),(7,1)]

== Using the @Flint@ library directly

@
import Data.Number.Flint

main = do 
  x <- newFmpz
  y <- newFmpz
  z <- newFmpz
  withFmpz x $ \\x -> do
    withFmpz y $ \\y -> do
      withFmpz z $ \\z -> do
        fmpz_set_ui x 7
        fmpz_set_ui y 8
        fmpz_mul z x y
        fmpz_print z
        fac <- newFmpzFactor
        putStr "\\n"
        withFmpzFactor fac $ \\fac -> do
           fmpz_factor fac z
           fmpz_factor_print fac
           putStr "\\n"
@

Running main yields:

>>> main 
56
2^3 * 7

-}

module Data.Number.Flint.Fmpz (
    module Data.Number.Flint.Fmpz.FFI
) where

import Data.Number.Flint.Fmpz.FFI