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

    import Prelude.Compat

    import Data.Text
    import Data.Text.Read

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

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

    renderFeed :: (a -> XT.Element) -> a -> Maybe TL.Text
    renderFeed :: forall a. (a -> Element) -> a -> Maybe Text
    renderFeed = RenderSettings -> (a -> Element) -> a -> Maybe Text
    forall a. RenderSettings -> (a -> Element) -> a -> Maybe Text
    renderFeedWith RenderSettings
    forall a. Default a => a
    XC.def

    renderFeedWith :: XC.RenderSettings -> (a -> XT.Element) -> a -> Maybe TL.Text
    renderFeedWith :: forall a. RenderSettings -> (a -> Element) -> a -> Maybe Text
    renderFeedWith RenderSettings
    opts a -> Element
    cf 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
    opts (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 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