{-# LANGUAGE ImportQualifiedPost #-} {-# LANGUAGE TupleSections #-} {-# LANGUAGE DataKinds, PolyKinds #-} {-# LANGUAGE KindSignatures #-} {-# OPTIONS_GHC -Wall -fno-warn-tabs #-} module Data.Text.ToolsYj (cstrToText) where import Foreign.Ptr import Foreign.Storable import Foreign.C.String import Data.Text qualified as Txt import Data.Text.Foreign qualified as Txt cstrToText :: CString -> IO Txt.Text cstrToText :: CString -> IO Text cstrToText CString cs = CStringLen -> IO Text Txt.peekCStringLen (CStringLen -> IO Text) -> IO CStringLen -> IO Text forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b =<< CString -> IO CStringLen cstringToCStringLen CString cs cstringLength :: CString -> IO Int cstringLength :: CString -> IO Int cstringLength CString pc = do c <- CString -> IO CChar forall a. Storable a => Ptr a -> IO a peek CString pc case c of CChar 0 -> Int -> IO Int forall a. a -> IO a forall (f :: * -> *) a. Applicative f => a -> f a pure Int 0 CChar _ -> (Int -> Int -> Int forall a. Num a => a -> a -> a + Int 1) (Int -> Int) -> IO Int -> IO Int forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> CString -> IO Int cstringLength (CString pc CString -> Int -> CString forall a b. Ptr a -> Int -> Ptr b `plusPtr` Int 1) cstringToCStringLen :: CString -> IO CStringLen cstringToCStringLen :: CString -> IO CStringLen cstringToCStringLen CString cs = (CString cs ,) (Int -> CStringLen) -> IO Int -> IO CStringLen forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> CString -> IO Int cstringLength CString cs