aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosh Rahm <joshuarahm@gmail.com>2024-02-08 22:04:31 -0700
committerJosh Rahm <joshuarahm@gmail.com>2024-02-08 22:04:31 -0700
commit7adbf480555e803bded190b013b1d1f70ae471db (patch)
tree3ac9c4d18ef477110e5d42ac0549c5391e3b8f68
parent0b1e24b85f527a36673836ccea68b4db3750cdf9 (diff)
downloadwetterhorn-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.hs16
-rw-r--r--src/Wetterhorn/Core.hs11
-rw-r--r--src/harness/main.c5
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();
}