%foreign "C:mkThing, libmkalloc" prim__mkThing : PrimIO AnyPtr %foreign "C:getStr, libmkalloc" prim__getStr : GCAnyPtr -> PrimIO String %foreign "C:freeThing, libmkalloc" prim__freeThing : AnyPtr -> PrimIO () mkThing : IO AnyPtr mkThing = primIO prim__mkThing getThingStr : GCAnyPtr -> IO String getThingStr t = primIO (prim__getStr t) freeThing : AnyPtr -> IO () freeThing t = primIO (prim__freeThing t) doThings : IO () doThings = do xp <- mkThing yp <- mkThing x <- onCollectAny xp (\p => do putStrLn "Free X" freeThing p) y <- onCollectAny yp (\p => do putStrLn "Free Y" freeThing p) putStrLn !(getThingStr x) putStrLn !(getThingStr y) main : IO () main = do doThings putStrLn "Done"