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"