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)