{-# OPTIONS_HADDOCK hide #-}
module Data.Array.Repa.IO.Internals.Text
        ( hWriteValues
        , readValues)
where
import System.IO
import Data.Char

-- Stuff shared with Matrix module -------------------------------------------------------------
-- | Write out values to a file.
hWriteValues
        :: Show a
        => Handle 
        -> [a]                          -- ^ Data values.
        -> IO ()

hWriteValues :: forall a. Show a => Handle -> [a] -> IO ()
hWriteValues Handle
handle [a]
xx
 = [a] -> IO ()
forall {a}. Show a => [a] -> IO ()
go [a]
xx
 where  go :: [a] -> IO ()
go []           = () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
        go (a
x:[a]
xs)
         = do   Handle -> String -> IO ()
hPutStr Handle
handle (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ a -> String
forall a. Show a => a -> String
show a
x
                Handle -> String -> IO ()
hPutStr Handle
handle (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"\n"
                [a] -> IO ()
go [a]
xs


-- | Read a string containing ints separated by whitespace.     
readValues :: (Num a, Read a) => String -> [a]
readValues :: forall a. (Num a, Read a) => String -> [a]
readValues String
cs   = String -> String -> [a]
forall {a}. Read a => String -> String -> [a]
readValues' [] String
cs
 where  readValues' :: String -> String -> [a]
readValues' String
_ []        = []
        readValues' String
acc (Char
c : String
rest)
                | Char -> Bool
isSpace Char
c
                = if String -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
acc 
                        then String -> String -> [a]
readValues' [] String
rest
                        else String -> a
forall a. Read a => String -> a
read (String -> String
forall a. [a] -> [a]
reverse String
acc) a -> [a] -> [a]
forall a. a -> [a] -> [a]
: String -> String -> [a]
readValues' [] String
rest

                | Char -> Bool
isDigit Char
c Bool -> Bool -> Bool
|| Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'.' Bool -> Bool -> Bool
|| Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'e' Bool -> Bool -> Bool
|| Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'-'
                = String -> String -> [a]
readValues' (Char
c Char -> String -> String
forall a. a -> [a] -> [a]
: String
acc) String
rest

                | Bool
otherwise
                = String -> [a]
forall a. HasCallStack => String -> a
error (String -> [a]) -> String -> [a]
forall a b. (a -> b) -> a -> b
$ String
"unexpected char in Matrix file " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show (Char -> Int
ord Char
c)