File ‹src/Main.hs›

{-
Author:  Christian Sternagel <c.sternagel@gmail.com> (2017)
License: LGPL
-}
module Main (main) where

import HLDE -- for solve: computing solutions to homogeneous linear diophantine equations
import System.Environment -- for getArgs
import System.IO -- for file reading
import System.Exit -- for error codes
import System.Directory -- for doesFileExist

main = getArgs >>= parse

parse [] = do
  input <- getContents
  start input
parse ["--help"] =  do
  hPutStrLn stdout usage
  exitWith ExitSuccess
parse [s] = do
  b <- doesFileExist s
  if b then do
    input <- readFile s
    start input
  else
    start s
parse _ = do
  hPutStrLn stderr usage
  exitWith (ExitFailure 1)

start input = do
  let (a, b) = read input :: ([Integer], [Integer])
  if 0 `elem` a || 0 `elem` b then do
    hPutStrLn stderr "0-coefficients are not allowed"
    exitWith (ExitFailure 2)
  else if null a || null b then do
    hPutStrLn stderr "empty lists of coefficients are not allowed"
    exitWith (ExitFailure 3)
  else
    mapM_ (putStrLn . show . (\(x, y) -> (map integer_of_nat x, map integer_of_nat y))) $
      solve (map nat_of_integer a) (map nat_of_integer b)

usage = "usage: hlde [string]\n\
        \  \n\
        \  If a string argument is given and a file of the same name exists\n\
        \  then read from this file, if no such file exists read directly from\n\
        \  the given string, and otherwise read from stdin.\n\
        \  \n\
        \  As input a pair of lists of coefficients is expected (representing a\n\
        \  homogeneous linear Diophantine equation, or HLDE for short). E.g.\n\
        \  \n\
        \    ([1,1],[2])\n\
        \  \n\
        \  corresponds to the HLDE\n\
        \  \n\
        \    x1 + x2 = 2*y1"