{-# Language BlockArguments #-}
{-# Language DerivingStrategies #-}
{-# Language GeneralisedNewtypeDeriving #-}
module System.OS
(
OS, os
) where
import Foreign.C.String (CWString, peekCWString)
import Foreign.Marshal.Alloc (free)
import Foreign.Ptr (nullPtr)
import System.IO.Unsafe (unsafePerformIO)
newtype OS = OS String
deriving newtype Show
os :: Maybe OS
os = unsafePerformIO do
osptr <- c_getOS
if osptr == nullPtr
then pure Nothing
else do
res <- peekCWString osptr
free osptr
pure $ Just $ OS res
{-# NOINLINE os #-}
foreign import ccall safe "getOS"
c_getOS :: IO CWString