{-# OPTIONS_GHC -fno-warn-orphans #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE QuasiQuotes #-}

module Area where

import Ivory.Language
import Ivory.Compile.C.CmdlineFrontend

[ivory|

struct val {
  field :: Stored Uint32
}

|]

val :: MemArea ('Struct "val")
val  = area "value" (Just (istruct [field .= ival 0]))

cval :: ConstMemArea ('Struct "val")
cval  = constArea "cval" (istruct [field .= ival 10])

getVal :: Def ('[] ':-> Uint32)
getVal = proc "getVal" $ body $ do
  ret =<< deref (addrOf val ~> field)

setVal :: Def ('[Uint32] ':-> ())
setVal = proc "setVal" $ \ n -> body $ do
  store (addrOf val ~> field) n
  retVoid

cmodule :: Module
cmodule = package "Area" $ do
  incl getVal
  incl setVal
  defMemArea val
  defConstMemArea cval
  defStruct (Proxy :: Proxy "val")

main :: IO ()
main = runCompiler [cmodule] [] initialOpts { outDir = Nothing, constFold = True }
