packages feed

macos-corelibs-0.0.1.0: src/MacSdk/Framework/CoreGraphics/Error.hsc

module MacSdk.Framework.CoreGraphics.Error
  ( intToCGError
  , CGError(..)
  , ForeignCGError
  , AsCGError(..)
  , MonadError
  , except
  ) where

#include <Carbon/Carbon.h>

import Foreign.C.Types (CInt(..))
import Control.Exception (Exception)
import Data.Typeable (Typeable)

import MacSdk.Prism
import Control.Monad.Error.Class (MonadError(..))
import Control.Monad (join)

data CGError
  = CGErrorCannotComplete
  | CGErrorFailure
  | CGErrorIllegalArgument
  | CGErrorInvalidConnection
  | CGErrorInvalidContext
  | CGErrorInvalidOperation
  | CGErrorNoneAvailable
  | CGErrorNotImplemented
  | CGErrorRangeCheck
  | CGErrorTypeCheck
  | CGErrorUnknown Int
  deriving (Show, Typeable)

instance Exception CGError

type ForeignCGError = CInt

intToCGError :: CInt -> Either CGError ()
intToCGError x
  | x == (#const kCGErrorCannotComplete) = Left CGErrorCannotComplete
  | x == (#const kCGErrorFailure) = Left CGErrorFailure
  | x == (#const kCGErrorIllegalArgument) = Left CGErrorIllegalArgument
  | x == (#const kCGErrorInvalidConnection) = Left CGErrorInvalidConnection
  | x == (#const kCGErrorInvalidContext) = Left CGErrorInvalidContext
  | x == (#const kCGErrorInvalidOperation) = Left CGErrorInvalidOperation
  | x == (#const kCGErrorNoneAvailable) = Left CGErrorNoneAvailable
  | x == (#const kCGErrorNotImplemented) = Left CGErrorNotImplemented
  | x == (#const kCGErrorRangeCheck) = Left CGErrorRangeCheck
  | x == (#const kCGErrorSuccess) = Right ()
  | x == (#const kCGErrorTypeCheck) = Left CGErrorTypeCheck
  | otherwise = Left (CGErrorUnknown (fromIntegral x))

class AsCGError e where
  _CGError :: Prism' e CGError

instance AsCGError CGError where
  _CGError = id

except :: (MonadError e m, AsCGError e) => m (Either CGError a) -> m a
except = join . fmap (either (throwing _CGError) pure)