{-# LANGUAGE OverloadedStrings #-}
-- | @futhark datacmp@
module Futhark.CLI.Datacmp (main) where

import qualified Data.ByteString.Lazy.Char8 as BS
import System.Exit

import Futhark.Test.Values
import Futhark.Util.Options

-- | Run @futhark datacmp@
main :: String -> [String] -> IO ()
main :: String -> [String] -> IO ()
main = ()
-> [FunOptDescr ()]
-> String
-> ([String] -> () -> Maybe (IO ()))
-> String
-> [String]
-> IO ()
forall cfg.
cfg
-> [FunOptDescr cfg]
-> String
-> ([String] -> cfg -> Maybe (IO ()))
-> String
-> [String]
-> IO ()
mainWithOptions () [] String
"<file> <file>" [String] -> () -> Maybe (IO ())
f
  where f :: [String] -> () -> Maybe (IO ())
f [String
file_a, String
file_b] () = IO () -> Maybe (IO ())
forall a. a -> Maybe a
Just (IO () -> Maybe (IO ())) -> IO () -> Maybe (IO ())
forall a b. (a -> b) -> a -> b
$ do
          Maybe [Value]
vs_a_maybe <- ByteString -> Maybe [Value]
readValues (ByteString -> Maybe [Value])
-> IO ByteString -> IO (Maybe [Value])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> IO ByteString
BS.readFile String
file_a
          Maybe [Value]
vs_b_maybe <- ByteString -> Maybe [Value]
readValues (ByteString -> Maybe [Value])
-> IO ByteString -> IO (Maybe [Value])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> IO ByteString
BS.readFile String
file_b
          case (Maybe [Value]
vs_a_maybe, Maybe [Value]
vs_b_maybe) of
            (Maybe [Value]
Nothing, Maybe [Value]
_) ->
              String -> IO ()
forall a. HasCallStack => String -> a
error (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"Error reading values from " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
file_a
            (Maybe [Value]
_, Maybe [Value]
Nothing) ->
              String -> IO ()
forall a. HasCallStack => String -> a
error (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"Error reading values from " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
file_b
            (Just [Value]
vs_a, Just [Value]
vs_b) ->
              case [Value] -> [Value] -> [Mismatch]
compareValues [Value]
vs_a [Value]
vs_b of
                [] -> () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
                [Mismatch]
es -> do (Mismatch -> IO ()) -> [Mismatch] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ Mismatch -> IO ()
forall a. Show a => a -> IO ()
print [Mismatch]
es
                         ExitCode -> IO ()
forall a. ExitCode -> IO a
exitWith (ExitCode -> IO ()) -> ExitCode -> IO ()
forall a b. (a -> b) -> a -> b
$ Int -> ExitCode
ExitFailure Int
2

        f [String]
_ ()
_ =
          Maybe (IO ())
forall a. Maybe a
Nothing