module Data.Text.Util
  ( readInt
  , renderFeed
  ) where

import Prelude.Compat

import Data.Text
import Data.Text.Read

import qualified Data.XML.Types as XT -- from xml-types
import qualified Text.XML as XC -- from xml-conduit
import qualified Data.Text.Lazy as TL

readInt :: Text -> Maybe Integer
readInt :: Text -> Maybe Integer
readInt s :: Text
s =
  case Reader Integer
forall a. Integral a => Reader a
decimal Text
s of
    Right (x :: Integer
x, _) -> Integer -> Maybe Integer
forall a. a -> Maybe a
Just Integer
x
    _ -> Maybe Integer
forall a. Maybe a
Nothing

renderFeed :: (a -> XT.Element) -> a -> Maybe TL.Text
renderFeed :: (a -> Element) -> a -> Maybe Text
renderFeed cf :: a -> Element
cf f :: a
f = let e :: Element
e = a -> Element
cf a
f
                      d :: Maybe Document
d = Element -> Maybe Document
elToDoc Element
e
                  in RenderSettings -> Document -> Text
XC.renderText RenderSettings
forall a. Default a => a
XC.def (Document -> Text) -> Maybe Document -> Maybe Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Document
d


-- Ancillaries --

elToDoc :: XT.Element -> Maybe XC.Document
elToDoc :: Element -> Maybe Document
elToDoc el :: Element
el = let txd :: Document
txd = Prologue -> Element -> [Miscellaneous] -> Document
XT.Document ([Miscellaneous] -> Maybe Doctype -> [Miscellaneous] -> Prologue
XC.Prologue [] Maybe Doctype
forall a. Maybe a
Nothing []) Element
el []
                 cxd :: Either (Set Text) Document
cxd = Document -> Either (Set Text) Document
XC.fromXMLDocument Document
txd
             in (Set Text -> Maybe Document)
-> (Document -> Maybe Document)
-> Either (Set Text) Document
-> Maybe Document
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (Maybe Document -> Set Text -> Maybe Document
forall a b. a -> b -> a
const Maybe Document
forall a. Maybe a
Nothing) Document -> Maybe Document
forall a. a -> Maybe a
Just Either (Set Text) Document
cxd