From fc24366512e0549d82e5f311dcfe97c29a02207e Mon Sep 17 00:00:00 2001 From: Ziyao Date: Fri, 1 Mar 2024 19:20:14 +0800 Subject: [PATCH] Add haskell binding (#63) --- README.md | 27 +++++++++++++++++++++++++++ haskell/Ruapu.hs | 21 +++++++++++++++++++++ haskell/ruapu.c | 2 ++ 3 files changed, 50 insertions(+) create mode 100644 haskell/Ruapu.hs create mode 100644 haskell/ruapu.c diff --git a/README.md b/README.md index be36c1a..4ad5a52 100644 --- a/README.md +++ b/README.md @@ -304,6 +304,33 @@ func main() { +### ruapu with Haskell + + + + +
+ +Add ruapu library to your project + +`haskell/Ruapu.hs`, `haskell/ruapu.c` and `ruapu.h` should be copied in your +project. + + + +Use ruapu in Haskell + +```haskell +import Ruapu +-- Ruapu.rua :: IO [String] +-- Ruapu.supports :: String -> IO Bool +main = do + Ruapu.init + Ruapu.supports "mmx" >>= putStrLn . show + Ruapu.rua >>= foldl (\m x -> m >> putStrLn x) (return ()) +``` +
+
Github-hosted runner result (Linux) diff --git a/haskell/Ruapu.hs b/haskell/Ruapu.hs new file mode 100644 index 0000000..075c4fc --- /dev/null +++ b/haskell/Ruapu.hs @@ -0,0 +1,21 @@ +{-# Language ForeignFunctionInterface #-} + +module Ruapu where + +import Foreign +import Foreign.C.String (CString, newCAString, peekCAString) + +foreign import ccall "ruapu.c ruapu_init" + init :: IO () + +foreign import ccall "ruapu.c ruapu_supports" + cSupports :: CString -> IO Bool + +foreign import ccall "ruapu.c ruapu_rua" + cRua :: IO (Ptr CString) + +supports :: String -> IO Bool +supports xs = (newCAString xs) >>= cSupports + +rua :: IO [String] +rua = cRua >>= peekArray0 nullPtr >>= mapM peekCAString diff --git a/haskell/ruapu.c b/haskell/ruapu.c new file mode 100644 index 0000000..a4a466f --- /dev/null +++ b/haskell/ruapu.c @@ -0,0 +1,2 @@ +#define RUAPU_IMPLEMENTATION +#include"ruapu.h"