{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeFamilies #-}
module Text.RSS.Extensions.Atom where
import Text.RSS.Extensions
import Text.RSS.Types
import Conduit (ZipConduit (..), headC, (.|))
import GHC.Generics
import Text.Atom.Conduit.Parse
import Text.Atom.Conduit.Render
import Text.Atom.Types
import Text.XML.Stream.Parse
newtype AtomModule a = AtomModule a
instance ParseRssExtension a => ParseRssExtension (AtomModule a) where
parseRssChannelExtension = getZipConduit $ AtomChannel
<$> ZipConduit (manyYield' atomLink .| headC)
<*> ZipConduit parseRssChannelExtension
parseRssItemExtension = getZipConduit $ AtomItem
<$> ZipConduit (manyYield' atomLink .| headC)
<*> ZipConduit parseRssItemExtension
instance RenderRssExtension a => RenderRssExtension (AtomModule a) where
renderRssChannelExtension AtomChannel{..} = do
mapM_ renderAtomLink channelAtomLink
renderRssChannelExtension channelAtomOther
renderRssItemExtension AtomItem{..} = do
mapM_ renderAtomLink itemAtomLink
renderRssItemExtension itemAtomOther
data instance RssChannelExtension (AtomModule a) = AtomChannel
{ channelAtomLink :: Maybe AtomLink
, channelAtomOther :: RssChannelExtension a
}
deriving instance Eq (RssChannelExtension a) => Eq (RssChannelExtension (AtomModule a))
deriving instance Ord (RssChannelExtension a) => Ord (RssChannelExtension (AtomModule a))
deriving instance Show (RssChannelExtension a) => Show (RssChannelExtension (AtomModule a))
deriving instance Generic (RssChannelExtension a) => Generic (RssChannelExtension (AtomModule a))
data instance RssItemExtension (AtomModule a) = AtomItem
{ itemAtomLink :: Maybe AtomLink
, itemAtomOther :: RssItemExtension a
}
deriving instance Eq (RssItemExtension a) => Eq (RssItemExtension (AtomModule a))
deriving instance Ord (RssItemExtension a) => Ord (RssItemExtension (AtomModule a))
deriving instance Show (RssItemExtension a) => Show (RssItemExtension (AtomModule a))
deriving instance Generic (RssItemExtension a) => Generic (RssItemExtension (AtomModule a))