Add haskell binding (#63)

This commit is contained in:
Ziyao 2024-03-01 19:20:14 +08:00 committed by GitHub
parent f40a34c04b
commit fc24366512
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 50 additions and 0 deletions

View File

@ -304,6 +304,33 @@ func main() {
</td></tr>
</table>
### ruapu with Haskell
<table>
<tr><td>
Add ruapu library to your project
`haskell/Ruapu.hs`, `haskell/ruapu.c` and `ruapu.h` should be copied in your
project.
</td>
<td>
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 ())
```
</td></tr>
</table>
<details>
<summary>Github-hosted runner result (Linux)</summary>

21
haskell/Ruapu.hs Normal file
View File

@ -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

2
haskell/ruapu.c Normal file
View File

@ -0,0 +1,2 @@
#define RUAPU_IMPLEMENTATION
#include"ruapu.h"