content: ----------------------------------------------------------------------------
  -- |
  -- Module      :  Emacs.Module.Assert
  -- Copyright   :  (c) Sergey Vinokurov 2018
  -- License     :  Apache-2.0 (see LICENSE)
  -- Maintainer  :  serg.foo@gmail.com
  ----------------------------------------------------------------------------
  
  {-# LANGUAGE CPP #-}
  
  module Emacs.Module.Assert
    ( WithCallStack
    , emacsAssert
    ) where
  
  import Data.Kind (Constraint)
  
  #ifdef CALL_STACKS
  import GHC.Stack (HasCallStack)
  #endif
  
  -- | Call stacks for all emacs-related functions in Haskell.
  -- Will be disabled unless this package was built with 'call-stacks'
  -- flag enabled.
  #ifdef CALL_STACKS
  type WithCallStack = (HasCallStack :: Constraint)
  #else
  type WithCallStack = (() :: Constraint)
  #endif
  
  #ifdef ASSERTIONS
  emacsAssert :: WithCallStack => Bool -> String -> a -> a
  emacsAssert True  _   = id
  emacsAssert False msg = error $ "Assertion failed: " ++ msg
  #else
  {-# INLINE emacsAssert #-}
  emacsAssert :: Bool -> String -> a -> a
  emacsAssert _ _ = id
  #endif
  