packages feed

hs-bindgen-1.0.0.0: src-internal/HsBindgen/Macro/Empty.hs

-- | The 'Empty' macro language does not recognize any macro.
--
-- Then, @hs-bindgen@ does not reparse anything, and uses the macro expansions
-- provided by Clang.
--
-- Intended for unqualified import.
module HsBindgen.Macro.Empty (
    Empty -- opaque
  , empty -- opaque
  ) where

import Data.Map qualified as Map

import HsBindgen.Macro.Error
import HsBindgen.Macro.Interface qualified as Macro
import HsBindgen.Macro.Type qualified as Macro

data Empty

data VoidMacro a
  deriving stock (Functor, Foldable, Traversable, Show, Eq)

absurdMacro :: VoidMacro a -> b
absurdMacro m = case m of {}

instance Macro.HasTypes Empty where
  type Parsed           Empty = VoidMacro
  type TypecheckedType  Empty = VoidMacro
  type TypecheckedValue Empty = VoidMacro

empty :: Macro.Lang Empty
empty = Macro.Lang
  { parse          = \_ -> Left MacroParseError {
                       macroParseError = "Empty does not parse any macros"
                     }
  , resolve        = \_ -> absurdMacro . (.unwrap)
  , typecheck      = \case
                       []    -> Map.empty
                       (x:_) -> absurdMacro x.macro
  , translateType  = absurdMacro
  , translateValue = \_ -> absurdMacro
  }