import Options.Applicative import Control.Monad import Control.Monad.State import Foreign.C.Types import Foreign.Ptr import Data.Number.Flint main = run =<< customExecParser (prefs showHelpOnEmpty) opts where desc = "Compute nth coefficient of the q-expansion of the weight \ \12 cusp form." opts = info (parameters <**> helper) ( fullDesc <> progDesc desc <> header desc) run params@(Parameters n) = do withNewFmpz $ \k -> do fmpz_set_si k n withNewFmpz $ \c -> do arith_ramanujan_tau c k putStr $ "Coefficient of q^" ++ show n ++ " is " fmpz_print c putStr "\n" data Parameters = Parameters { n :: CLong } deriving Show parameters :: Parser Parameters parameters = Parameters <$> argument pos ( help "positive integer n" <> metavar "n") pos :: (Read a, Integral a) => ReadM a pos = eitherReader $ \s -> do let result = read s if result >= 0 then Right result else Left "expected positive number"