{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
module Text.RSS.Extensions where
import Control.Exception.Safe as Exception
import Data.Conduit
import Data.Maybe
import Data.Proxy
import Data.Singletons
import Data.Singletons.Prelude.Bool
import Data.Singletons.Prelude.Eq
import Data.Singletons.Prelude.List
import Data.Text
import Data.Vinyl.Core
import Data.Vinyl.TypeLevel
import Data.XML.Types
import GHC.Generics
import Text.Atom.Conduit.Parse
import Text.Atom.Types
import Text.Read (readMaybe)
import Text.RSS.Types
import Text.XML.Stream.Parse
import URI.ByteString
class ParseRssExtension a where
parseRssChannelExtension :: MonadThrow m => ConduitT Event o m (RssChannelExtension a)
parseRssItemExtension :: MonadThrow m => ConduitT Event o m (RssItemExtension a)
type ParseRssExtensions (e :: [*]) = (AllConstrained ParseRssExtension e, SingI e)
parseRssChannelExtensions :: ParseRssExtensions e => MonadThrow m => ConduitT Event o m (RssChannelExtensions e)
parseRssChannelExtensions = f sing where
f :: AllConstrained ParseRssExtension e => MonadThrow m
=> Sing e -> ConduitT Event o m (RssChannelExtensions e)
f SNil = return $ RssChannelExtensions RNil
f (SCons _ es) = fmap RssChannelExtensions $ getZipConduit $ (:&)
<$> ZipConduit parseRssChannelExtension
<*> ZipConduit (rssChannelExtension <$> f es)
parseRssItemExtensions :: ParseRssExtensions e => MonadThrow m => ConduitT Event o m (RssItemExtensions e)
parseRssItemExtensions = f sing where
f :: AllConstrained ParseRssExtension e => MonadThrow m
=> Sing e -> ConduitT Event o m (RssItemExtensions e)
f SNil = return $ RssItemExtensions RNil
f (SCons _ es) = fmap RssItemExtensions $ getZipConduit $ (:&)
<$> ZipConduit parseRssItemExtension
<*> ZipConduit (rssItemExtension <$> f es)
class RenderRssExtension e where
renderRssChannelExtension :: Monad m => RssChannelExtension e -> ConduitT () Event m ()
renderRssItemExtension :: Monad m => RssItemExtension e -> ConduitT () Event m ()
type RenderRssExtensions (e :: [*]) = (AllConstrained RenderRssExtension e)
renderRssChannelExtensions :: Monad m => RenderRssExtensions e => RssChannelExtensions e -> ConduitT () Event m ()
renderRssChannelExtensions (RssChannelExtensions RNil) = pure ()
renderRssChannelExtensions (RssChannelExtensions (a :& t)) = do
renderRssChannelExtension a
renderRssChannelExtensions (RssChannelExtensions t)
renderRssItemExtensions :: Monad m => RenderRssExtensions e => RssItemExtensions e -> ConduitT () Event m ()
renderRssItemExtensions (RssItemExtensions RNil) = pure ()
renderRssItemExtensions (RssItemExtensions (a :& t)) = do
renderRssItemExtension a
renderRssItemExtensions (RssItemExtensions t)