module Main (main) where import Interop.Shared (Summary (..)) import RustClient (callRustMessage, callRustSummary) import System.Environment (getArgs) import Text.Read (readMaybe) main :: IO () main = do args <- getArgs let (name, left, right) = parseArgs args summary <- callRustSummary left right message <- callRustMessage name left right putStrLn "Haskell -> Rust demo" putStrLn $ "Inputs: name=" ++ name ++ ", left=" ++ show left ++ ", right=" ++ show right putStrLn $ "Stats from Rust: " ++ renderSummary summary putStrLn $ "Message from Rust: " ++ message parseArgs :: [String] -> (String, Int, Int) parseArgs args = let name = case args of value : _ -> value [] -> "Ada" left = maybe 7 id (pickNumber 1 args) right = maybe 5 id (pickNumber 2 args) in (name, left, right) pickNumber :: Int -> [String] -> Maybe Int pickNumber index values = do value <- safeIndex index values readMaybe value safeIndex :: Int -> [a] -> Maybe a safeIndex index values | index < 0 = Nothing | otherwise = case drop index values of value : _ -> Just value [] -> Nothing renderSummary :: Summary -> String renderSummary summary = "total=" ++ show (total summary) ++ ", product=" ++ show (combinedProduct summary) ++ ", gap=" ++ show (gap summary)