basic enum example

This commit is contained in:
George Thomas 2026-04-14 00:42:17 +01:00
parent d3cb3a837c
commit 5dd82fabc3
4 changed files with 26 additions and 0 deletions

View File

@ -9,6 +9,8 @@ main = do
hello "Haskell" hello "Haskell"
helloStruct T{a = True, b = 42} helloStruct T{a = True, b = 42}
helloStruct T{a = False, b = maxBound} helloStruct T{a = False, b = maxBound}
helloEnum E1
helloEnum E3
helloShape $ Circle 3.14 helloShape $ Circle 3.14
helloShape $ Rectangle 10.0 5.0 helloShape $ Rectangle 10.0 5.0
putStrLn $ "3 + 4 = " <> show (add 3 4) putStrLn $ "3 + 4 = " <> show (add 3 4)

View File

@ -22,6 +22,7 @@ common common
NoMonomorphismRestriction NoMonomorphismRestriction
OverloadedRecordDot OverloadedRecordDot
OverloadedStrings OverloadedStrings
PatternSynonyms
RecordWildCards RecordWildCards
ViewPatterns ViewPatterns
ghc-options: ghc-options:

View File

@ -2,10 +2,17 @@
-- or look at upstream plans: https://github.com/well-typed/hs-bindgen/issues?q=state%3Aopen%20label%3A%22highlevel%22 -- or look at upstream plans: https://github.com/well-typed/hs-bindgen/issues?q=state%3Aopen%20label%3A%22highlevel%22
module GarnetRs.Wrapped ( module GarnetRs.Wrapped (
T (..), T (..),
Raw.E (..),
-- TODO hmm, we don't really want to have to list all of these...
-- is there an option to make them not be patterns at all?
pattern Raw.E1,
pattern Raw.E2,
pattern Raw.E3,
Shape (..), Shape (..),
BTree (..), BTree (..),
hello, hello,
helloStruct, helloStruct,
helloEnum,
helloShape, helloShape,
add, add,
sumTree, sumTree,
@ -62,6 +69,9 @@ hello bs = useAsCString bs \ptr -> Raw.hello $ unsafeFromPtr ptr
helloStruct :: T -> IO () helloStruct :: T -> IO ()
helloStruct t = with (convertT t) \ptr -> Raw.hello_struct $ unsafeFromPtr ptr helloStruct t = with (convertT t) \ptr -> Raw.hello_struct $ unsafeFromPtr ptr
helloEnum :: Raw.E -> IO ()
helloEnum e = with e \ptr -> Raw.hello_enum $ unsafeFromPtr ptr
helloShape :: Shape -> IO () helloShape :: Shape -> IO ()
helloShape s = with (convertShape s) \ptr -> Raw.hello_shape $ unsafeFromPtr ptr helloShape s = with (convertShape s) \ptr -> Raw.hello_shape $ unsafeFromPtr ptr

View File

@ -27,6 +27,19 @@ extern "C" fn hello_struct(t: &T) {
say_hello(&format!("{:?}", t)) say_hello(&format!("{:?}", t))
} }
#[repr(C)]
#[derive(Debug)]
enum E {
E1,
E2,
E3,
}
#[unsafe(no_mangle)]
extern "C" fn hello_enum(e: &E) {
say_hello(&format!("{:?}", e))
}
#[repr(C)] #[repr(C)]
#[derive(Debug)] #[derive(Debug)]
enum Shape { enum Shape {