diff options
author | Josh Rahm <joshuarahm@gmail.com> | 2024-02-08 22:04:31 -0700 |
---|---|---|
committer | Josh Rahm <joshuarahm@gmail.com> | 2024-02-08 22:04:31 -0700 |
commit | 7adbf480555e803bded190b013b1d1f70ae471db (patch) | |
tree | 3ac9c4d18ef477110e5d42ac0549c5391e3b8f68 | |
parent | 0b1e24b85f527a36673836ccea68b4db3750cdf9 (diff) | |
download | wetterhorn-7adbf480555e803bded190b013b1d1f70ae471db.tar.gz wetterhorn-7adbf480555e803bded190b013b1d1f70ae471db.tar.bz2 wetterhorn-7adbf480555e803bded190b013b1d1f70ae471db.zip |
Just some minor changes. Proof of concept for state change.
-rw-r--r-- | src/Main.hs | 16 | ||||
-rw-r--r-- | src/Wetterhorn/Core.hs | 11 | ||||
-rw-r--r-- | src/harness/main.c | 5 |
3 files changed, 22 insertions, 10 deletions
diff --git a/src/Main.hs b/src/Main.hs index 2d15fce..bdffd6f 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -1,18 +1,22 @@ {-# HLINT ignore "Use camelCase" #-} module Main (main) where -import Control.Monad.Writer (execWriter, MonadWriter (tell)) +import Control.Monad.Writer (MonadWriter (tell), execWriter) import Wetterhorn.Core foreign export ccall wetterhorn :: IO Wetterhorn + wetterhorn :: IO Wetterhorn wetterhorn = - initWetterhorn $ - WConfig "This is a string" - (do - (WState str _) <- getWState - wio $ putStrLn $ "Handle something!!! :) " ++ str) + initWetterhorn $ + WConfig + "This is a string" + ( do + (WState str i) <- getWState + wio $ putStrLn $ "Handle something!!! :) " ++ str ++ " " ++ show i + incrementState + ) main :: IO () main = putStrLn "This should be dynamically linked!\n" diff --git a/src/Wetterhorn/Core.hs b/src/Wetterhorn/Core.hs index a6064a0..5ce93f0 100644 --- a/src/Wetterhorn/Core.hs +++ b/src/Wetterhorn/Core.hs @@ -10,9 +10,11 @@ module Wetterhorn.Core Wetterhorn, initWetterhorn, wio, + incrementState, ) where +import Control.Applicative import Control.Arrow (first) import Foreign (StablePtr, deRefStablePtr, freeStablePtr, newStablePtr) @@ -20,11 +22,11 @@ type Wetterhorn = (StablePtr (WConfig, WState)) initWetterhorn :: WConfig -> IO Wetterhorn initWetterhorn conf = do - newStablePtr (conf, WState "this is a string" "this is another string") + newStablePtr (conf, WState "this is a string" 0) data WState = WState { someString :: String, - someOtherString :: String + integer :: Int } data WConfig = WConfig @@ -37,9 +39,9 @@ foreign export ccall handle_thing :: StablePtr (WConfig, WState) -> IO (StablePt handle_thing :: StablePtr (WConfig, WState) -> IO (StablePtr (WConfig, WState)) handle_thing ptr = do (conf, st) <- deRefStablePtr ptr - freeStablePtr ptr (_, st') <- runW (handleSomething conf) (conf, st) newStablePtr (conf, st') + <* freeStablePtr ptr newtype W a = W ((WConfig, WState) -> IO (a, WState)) @@ -67,5 +69,8 @@ getWState = W $ \(_, s) -> pure (s, s) runW :: W a -> (WConfig, WState) -> IO (a, WState) runW (W fn) = fn +incrementState :: W () +incrementState = W $ \(conf, WState s i) -> return ((), WState s (i + 1)) + wio :: IO a -> W a wio fn = W $ \(_, b) -> fn >>= \a -> return (a, b) diff --git a/src/harness/main.c b/src/harness/main.c index fd70e5f..1580bd6 100644 --- a/src/harness/main.c +++ b/src/harness/main.c @@ -43,7 +43,10 @@ void use_library(int argc, char** argv, dllib_t lib, int* err) } opqst_t st = init(&argc, &argv); - st = sym(st); + for (int i = 0; i < 100000; ++ i) { + st = sym(st); + printf("stable_ptr: %p\n", st); + } teardown(); } |