-- | Control flow graph / relooper.
--
-- See <https://github.com/WebAssembly/binaryen/blob/master/src/binaryen-c.h>
-- for API documentation.
--
-- This module is intended to be imported qualified.

{-# LANGUAGE GeneralizedNewtypeDeriving #-}

module Binaryen.Relooper where

import Binaryen.Expression
import Binaryen.Index
import Binaryen.Module
import Foreign (Ptr, Storable)

newtype Relooper = Relooper (Ptr Relooper)
  deriving (Relooper -> Relooper -> Bool
(Relooper -> Relooper -> Bool)
-> (Relooper -> Relooper -> Bool) -> Eq Relooper
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Relooper -> Relooper -> Bool
$c/= :: Relooper -> Relooper -> Bool
== :: Relooper -> Relooper -> Bool
$c== :: Relooper -> Relooper -> Bool
Eq, Int -> Relooper -> ShowS
[Relooper] -> ShowS
Relooper -> String
(Int -> Relooper -> ShowS)
-> (Relooper -> String) -> ([Relooper] -> ShowS) -> Show Relooper
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Relooper] -> ShowS
$cshowList :: [Relooper] -> ShowS
show :: Relooper -> String
$cshow :: Relooper -> String
showsPrec :: Int -> Relooper -> ShowS
$cshowsPrec :: Int -> Relooper -> ShowS
Show, Ptr b -> Int -> IO Relooper
Ptr b -> Int -> Relooper -> IO ()
Ptr Relooper -> IO Relooper
Ptr Relooper -> Int -> IO Relooper
Ptr Relooper -> Int -> Relooper -> IO ()
Ptr Relooper -> Relooper -> IO ()
Relooper -> Int
(Relooper -> Int)
-> (Relooper -> Int)
-> (Ptr Relooper -> Int -> IO Relooper)
-> (Ptr Relooper -> Int -> Relooper -> IO ())
-> (forall b. Ptr b -> Int -> IO Relooper)
-> (forall b. Ptr b -> Int -> Relooper -> IO ())
-> (Ptr Relooper -> IO Relooper)
-> (Ptr Relooper -> Relooper -> IO ())
-> Storable Relooper
forall b. Ptr b -> Int -> IO Relooper
forall b. Ptr b -> Int -> Relooper -> IO ()
forall a.
(a -> Int)
-> (a -> Int)
-> (Ptr a -> Int -> IO a)
-> (Ptr a -> Int -> a -> IO ())
-> (forall b. Ptr b -> Int -> IO a)
-> (forall b. Ptr b -> Int -> a -> IO ())
-> (Ptr a -> IO a)
-> (Ptr a -> a -> IO ())
-> Storable a
poke :: Ptr Relooper -> Relooper -> IO ()
$cpoke :: Ptr Relooper -> Relooper -> IO ()
peek :: Ptr Relooper -> IO Relooper
$cpeek :: Ptr Relooper -> IO Relooper
pokeByteOff :: Ptr b -> Int -> Relooper -> IO ()
$cpokeByteOff :: forall b. Ptr b -> Int -> Relooper -> IO ()
peekByteOff :: Ptr b -> Int -> IO Relooper
$cpeekByteOff :: forall b. Ptr b -> Int -> IO Relooper
pokeElemOff :: Ptr Relooper -> Int -> Relooper -> IO ()
$cpokeElemOff :: Ptr Relooper -> Int -> Relooper -> IO ()
peekElemOff :: Ptr Relooper -> Int -> IO Relooper
$cpeekElemOff :: Ptr Relooper -> Int -> IO Relooper
alignment :: Relooper -> Int
$calignment :: Relooper -> Int
sizeOf :: Relooper -> Int
$csizeOf :: Relooper -> Int
Storable)

newtype RelooperBlock = RelooperBlock (Ptr RelooperBlock)
  deriving (RelooperBlock -> RelooperBlock -> Bool
(RelooperBlock -> RelooperBlock -> Bool)
-> (RelooperBlock -> RelooperBlock -> Bool) -> Eq RelooperBlock
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: RelooperBlock -> RelooperBlock -> Bool
$c/= :: RelooperBlock -> RelooperBlock -> Bool
== :: RelooperBlock -> RelooperBlock -> Bool
$c== :: RelooperBlock -> RelooperBlock -> Bool
Eq, Int -> RelooperBlock -> ShowS
[RelooperBlock] -> ShowS
RelooperBlock -> String
(Int -> RelooperBlock -> ShowS)
-> (RelooperBlock -> String)
-> ([RelooperBlock] -> ShowS)
-> Show RelooperBlock
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [RelooperBlock] -> ShowS
$cshowList :: [RelooperBlock] -> ShowS
show :: RelooperBlock -> String
$cshow :: RelooperBlock -> String
showsPrec :: Int -> RelooperBlock -> ShowS
$cshowsPrec :: Int -> RelooperBlock -> ShowS
Show)

foreign import ccall unsafe "RelooperCreate"
  create ::
    Module -> IO Relooper

foreign import ccall unsafe "RelooperAddBlock"
  addBlock ::
    Relooper -> Expression -> IO RelooperBlock

foreign import ccall unsafe "RelooperAddBranch"
  addBranch ::
    RelooperBlock ->
    RelooperBlock ->
    Expression ->
    Expression ->
    IO ()

foreign import ccall unsafe "RelooperAddBlockWithSwitch"
  addBlockWithSwitch ::
    Relooper ->
    Expression ->
    Expression ->
    IO RelooperBlock

foreign import ccall unsafe "RelooperAddBranchForSwitch"
  addBranchForSwitch ::
    RelooperBlock ->
    RelooperBlock ->
    Ptr Index ->
    Index ->
    Expression ->
    IO ()

foreign import ccall unsafe "RelooperRenderAndDispose"
  renderAndDispose ::
    Relooper ->
    RelooperBlock ->
    Index ->
    IO Expression