content: {-# LANGUAGE ScopedTypeVariables #-}
  {-# LANGUAGE DataKinds, GADTs, RankNTypes, KindSignatures #-}
  {-# LANGUAGE FlexibleInstances #-}
  {-# LANGUAGE PatternSynonyms #-}
  
  module GHC.Wasm.ControlFlow
    ( WasmControl(..), (<>), pattern WasmIf
    , BrTableInterval(..), inclusiveInterval
  
    , WasmType, WasmTypeTag(..)
    , TypeList(..)
    , WasmFunctionType(..)
    )
  where
  
  import GHC.Prelude
  
  import GHC.CmmToAsm.Wasm.Types
  import GHC.Utils.Panic
  
  {-|
  Module      : GHC.Wasm.ControlFlow
  Description : Representation of control-flow portion of the WebAssembly instruction set
  -}
  
  inclusiveInterval :: Integer -> Integer -> BrTableInterval
  inclusiveInterval lo hi
      | lo <= hi = let count = hi - lo + 1
                   in  BrTableInterval lo count
      | otherwise = panic "GHC.Wasm.ControlFlow: empty interval"
  
  (<>) :: forall s e pre mid post
        . WasmControl s e pre mid
       -> WasmControl s e mid post
       -> WasmControl s e pre post
  (<>) = WasmSeq
  -- N.B. Fallthrough can't be optimized away because of type checking.
  
  
  
  -- Syntactic sugar.
  pattern WasmIf :: WasmFunctionType pre post
                 -> e
                 -> WasmControl s e pre post
                 -> WasmControl s e pre post
                 -> WasmControl s e pre post
  
  pattern WasmIf ty e t f =
      WasmPush TagI32 e `WasmSeq` WasmIfTop ty t f
  