ivory-examples-0.1.0.3: examples/PublicPrivate.hs
{-# OPTIONS_GHC -fno-warn-orphans #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
-- | Example of a private struct, defined as a global memory area, with a public
-- access function.
module PublicPrivate where
import Ivory.Language
import Ivory.Compile.C.CmdlineFrontend
[ivory|
struct Foo { foo_i :: Stored Sint32
; foo_cnt :: Stored Uint32
}
|]
privateFoo :: MemArea ('Struct "Foo")
privateFoo = area "private_foo" $
Just (istruct [foo_i .= ival 0, foo_cnt .= ival 0])
privUpdate :: Def ('[Sint32] ':-> ())
privUpdate = proc "privUpdate" $ \v -> body $ do
let foo = addrOf privateFoo
curr <- deref (foo ~> foo_cnt)
store (foo ~> foo_i) v
store (foo~> foo_cnt) (curr+1)
pubUpdate :: Def ('[Sint32] ':-> ())
pubUpdate = proc "pubUpdate" $ \v -> body $ do
call_ privUpdate v
cmodule :: Module
cmodule = package "PublicPrivate" $ do
private $ do
defStruct (Proxy :: Proxy "Foo")
defMemArea privateFoo
incl privUpdate
public $ do
incl pubUpdate
runPublicPrivate :: IO ()
runPublicPrivate = runCompiler [cmodule] []
initialOpts { outDir = Nothing, constFold = True }