module Data.SerDoc.TestUtil
where

import Text.Read
import Data.ByteString (ByteString)
import qualified Data.Text as Text
import Data.Text.Encoding (encodeUtf8, decodeUtf8)
import Data.Maybe

showBS :: Show a => a -> ByteString
showBS :: forall a. Show a => a -> ByteString
showBS = Text -> ByteString
encodeUtf8 (Text -> ByteString) -> (a -> Text) -> a -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
Text.pack (String -> Text) -> (a -> String) -> a -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> String
forall a. Show a => a -> String
show

readMaybeBS_ :: Read a => ByteString -> Maybe a
readMaybeBS_ :: forall a. Read a => ByteString -> Maybe a
readMaybeBS_ = String -> Maybe a
forall a. Read a => String -> Maybe a
readMaybe (String -> Maybe a)
-> (ByteString -> String) -> ByteString -> Maybe a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
Text.unpack (Text -> String) -> (ByteString -> Text) -> ByteString -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Text
decodeUtf8

readMaybeBS :: Read a => ByteString -> Maybe (a, ByteString)
readMaybeBS :: forall a. Read a => ByteString -> Maybe (a, ByteString)
readMaybeBS ByteString
src = do
  (a
x, String
restStr) <- [(a, String)] -> Maybe (a, String)
forall a. [a] -> Maybe a
listToMaybe ([(a, String)] -> Maybe (a, String))
-> (ByteString -> [(a, String)]) -> ByteString -> Maybe (a, String)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ReadS a
forall a. Read a => ReadS a
reads ReadS a -> (ByteString -> String) -> ByteString -> [(a, String)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
Text.unpack (Text -> String) -> (ByteString -> Text) -> ByteString -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Text
decodeUtf8 (ByteString -> Maybe (a, String))
-> ByteString -> Maybe (a, String)
forall a b. (a -> b) -> a -> b
$ ByteString
src
  (a, ByteString) -> Maybe (a, ByteString)
forall a. a -> Maybe a
forall (m :: * -> *) a. Monad m => a -> m a
return (a
x, Text -> ByteString
encodeUtf8 (Text -> ByteString) -> (String -> Text) -> String -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
Text.pack (String -> ByteString) -> String -> ByteString
forall a b. (a -> b) -> a -> b
$ String
restStr)