content: -- This file is part of purebred
  -- Copyright (C) 2019 Róman Joost
  --
  -- purebred is free software: you can redistribute it and/or modify
  -- it under the terms of the GNU Affero General Public License as published by
  -- the Free Software Foundation, either version 3 of the License, or
  -- (at your option) any later version.
  --
  -- This program is distributed in the hope that it will be useful,
  -- but WITHOUT ANY WARRANTY; without even the implied warranty of
  -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  -- GNU Affero General Public License for more details.
  --
  -- You should have received a copy of the GNU Affero General Public License
  -- along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  module Purebred.System
    ( tryIO
    ) where
  
  import Control.Exception (IOException, try)
  import Control.Monad.Except (MonadError, throwError)
  import Control.Monad.IO.Class (MonadIO, liftIO)
  
  import Purebred.Types.Error
  
  -- | "Try" a computation but return a Purebred error in the exception case
  tryIO :: (MonadError Error m, MonadIO m) => IO a -> m a
  tryIO m = liftIO (try m) >>= either (throwError . exceptionToError) pure
  
  exceptionToError :: IOException -> Error
  exceptionToError = ProcessError . show
  