module Sound.OpenAL.FFI.Utils
  ( Dynamic
  , peekCStrings
  ) where

import Foreign (FunPtr, lengthArray0, plusPtr)
import Foreign.C.String (CString, peekCAString)

type Dynamic a = FunPtr a -> a

peekCStrings :: CString -> IO [String]
peekCStrings :: CString -> IO [String]
peekCStrings = [String] -> CString -> IO [String]
go []
  where
    go :: [String] -> CString -> IO [String]
go [String]
acc CString
ptr = do
      String
str <- CString -> IO String
peekCAString CString
ptr
      if String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
str then
        [String] -> IO [String]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([String] -> IO [String]) -> [String] -> IO [String]
forall a b. (a -> b) -> a -> b
$ [String] -> [String]
forall a. [a] -> [a]
reverse [String]
acc
      else do
        Int
len <- CChar -> CString -> IO Int
forall a. (Storable a, Eq a) => a -> Ptr a -> IO Int
lengthArray0 CChar
0 CString
ptr
        [String] -> CString -> IO [String]
go (String
str String -> [String] -> [String]
forall a. a -> [a] -> [a]
: [String]
acc) (CString -> IO [String]) -> CString -> IO [String]
forall a b. (a -> b) -> a -> b
$ CString -> Int -> CString
forall a b. Ptr a -> Int -> Ptr b
plusPtr CString
ptr (Int
len Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)