{-# LANGUAGE OverloadedStrings #-}

-- | @futhark datacmp@
module Futhark.CLI.Datacmp (main) where

import qualified Data.ByteString.Lazy.Char8 as BS
import Futhark.Test.Values
import Futhark.Util.Options
import System.Exit

-- | 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