-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/
-- | Retrieve RSS/Atom feeds and write one mail per new item in a maildir.
--
-- Cf README
@package imm
@version 0.6.0.2
module Imm.Util
-- | Like </> with first argument in IO to build
-- platform-dependent paths.
(>/>) :: MonadBase IO m => IO FilePath -> FilePath -> m FilePath
-- | Shortcut to liftBase with IO as base monad
io :: MonadBase IO m => IO a -> m a
module Imm.Error
data ImmError
OtherError :: String -> ImmError
HTTPError :: HttpException -> ImmError
TLSError :: TLSException -> ImmError
UnicodeError :: UnicodeException -> ImmError
ParseUriError :: String -> ImmError
ParseTimeError :: String -> ImmError
ParseItemDateError :: Item -> ImmError
ParseFeedError :: String -> ImmError
IOE :: IOError -> ImmError
TimeOut :: ImmError
withError :: (Error e, Show e, MonadBase IO m) => String -> ErrorT e m () -> m ()
localError :: (MonadBase IO m, MonadError ImmError m) => String -> m () -> m ()
-- | Monad-agnostic version of try
try :: (MonadBase IO m, MonadError ImmError m) => IO a -> m a
-- | Monad-agnostic version of timeout
timeout :: (MonadBase IO m, MonadError ImmError m) => Int -> IO a -> m a
-- | Monad-agnostic version of parseURI
parseURI :: MonadError ImmError m => String -> m URI
-- | Monad-agnostic version of parseTime
parseTime :: MonadError ImmError m => String -> m UTCTime
instance Error ImmError
instance Show ImmError
module Imm.Database
type FeedID = URI
class DatabaseReader m
getLastCheck :: DatabaseReader m => FeedID -> m UTCTime
class DatabaseWriter m
storeLastCheck :: DatabaseWriter m => FeedID -> UTCTime -> m ()
forget :: DatabaseWriter m => FeedID -> m ()
type DatabaseState m = (DatabaseReader m, DatabaseWriter m)
data FileDatabase
directory :: Lens' FileDatabase FilePath
getDataFile :: Lens' FileDatabase (FeedID -> FilePath)
instance [overlap ok] (MonadBase IO m, MonadError ImmError m) => DatabaseWriter (ReaderT FileDatabase m)
instance [overlap ok] MonadBase IO m => DatabaseReader (ReaderT FileDatabase m)
instance [overlap ok] Default (IO FileDatabase)
instance [overlap ok] (Error e, DatabaseReader m) => DatabaseReader (ErrorT e m)
module Imm.HTTP
class (Applicative m, Functor m, Monad m) => Decoder m where decode string = return . fromChunks . (: []) =<< toUnicode <$> converter <*> return strictString where strictString = concat $ toChunks string
converter :: Decoder m => m Converter
decode :: Decoder m => ByteString -> m Text
-- | Perform an HTTP GET request and return the response body as raw
-- ByteString
getRaw :: (MonadBase IO m, MonadError ImmError m) => URI -> m ByteString
-- | Same as getRaw with additional decoding
get :: (Decoder m, MonadBase IO m, MonadError ImmError m) => URI -> m Text
-- | Monad-agnostic version of withManager
withManager' :: (MonadError ImmError m, MonadBase IO m) => (Manager -> ResourceT IO b) -> m b
-- | Monad-agnostic version of parseUrl
parseURL :: (MonadBase IO m, MonadError ImmError m) => String -> m Request
-- | Build an HTTP request for given URI
request :: (MonadBase IO m, MonadError ImmError m) => String -> m Request
instance (Error e, Decoder m) => Decoder (ErrorT e m)
module Imm.Feed
data Action
Check :: Action
ShowStatus :: Action
MarkAsRead :: Action
MarkAsUnread :: Action
Update :: Action
type ImmFeed = (FeedID, Feed)
class FeedParser m
parseDate :: FeedParser m => String -> m (Maybe UTCTime)
-- | Provide a String representation of the feed type.
showType :: Feed -> String
describe :: Feed -> String
describeItem :: Item -> String
-- | Monad-agnostic version of parseFeedString
parse :: MonadError ImmError m => String -> m Feed
-- | Retrieve, decode and parse the given resource as a feed.
download :: (Decoder m, MonadBase IO m, MonadError ImmError m) => URI -> m ImmFeed
-- | Count the list of unread items for given feed.
check :: (FeedParser m, DatabaseReader m, MonadBase IO m, MonadError ImmError m) => ImmFeed -> m ()
-- | Simply set the last check time to now.
markAsRead :: (MonadBase IO m, MonadError ImmError m, DatabaseWriter m) => URI -> m ()
-- | Simply remove the state file.
markAsUnread :: (MonadBase IO m, MonadError ImmError m, DatabaseWriter m) => URI -> m ()
-- | Return a String describing the last update for a given feed.
showStatus :: (DatabaseReader m, MonadBase IO m) => URI -> m String
-- | This function is missing from Query, probably because it is
-- difficult to define where the content is located in a generic way for
-- AtomRSS 1.xRSS 2.x feeds.
getItemContent :: Item -> String
getDate :: (FeedParser m, Monad m, MonadError ImmError m) => Item -> m UTCTime
extractHtml :: EntryContent -> String
instance Eq Action
instance Show Action
instance (Monad m, Error e, FeedParser m) => FeedParser (ErrorT e m)
module Imm.Mail
data Mail
Mail :: String -> Maybe ZonedTime -> String -> String -> String -> String -> String -> String -> Mail
_returnPath :: Mail -> String
_date :: Mail -> Maybe ZonedTime
_from :: Mail -> String
_subject :: Mail -> String
_mime :: Mail -> String
_charset :: Mail -> String
_contentDisposition :: Mail -> String
_body :: Mail -> String
subject :: Lens' Mail String
returnPath :: Lens' Mail String
mime :: Lens' Mail String
from :: Lens' Mail String
date :: Lens' Mail (Maybe ZonedTime)
contentDisposition :: Lens' Mail String
charset :: Lens' Mail String
body :: Lens' Mail String
type Format = (Item, Feed) -> String
class MailFormatter m
formatFrom :: MailFormatter m => m Format
formatSubject :: MailFormatter m => m Format
formatBody :: MailFormatter m => m Format
-- | Build mail from a given feed, using builders functions from
-- Settings.
build :: (Applicative m, MailFormatter m, FeedParser m, Monad m) => TimeZone -> (Item, Feed) -> m Mail
instance Show Mail
instance Default Mail
module Imm.Maildir
type Maildir = FilePath
class MaildirWriter m
init :: MaildirWriter m => m ()
write :: MaildirWriter m => Mail -> m ()
-- | Return an allegedly unique filename; useful to add new mail files in a
-- maildir.
getUniqueName :: MonadBase IO m => m String
instance (MonadBase IO m, MonadError ImmError m) => MaildirWriter (ReaderT Maildir m)
module Imm.Config
newtype FromFormat
FromFormat :: Format -> FromFormat
newtype SubjectFormat
SubjectFormat :: Format -> SubjectFormat
newtype BodyFormat
BodyFormat :: Format -> BodyFormat
-- | The only exported constructor is through Default class.
data Config
maildir :: Lens' Config Maildir
fileDatabase :: Lens' Config FileDatabase
dateParsers :: Lens' Config [String -> Maybe UTCTime]
formatFrom :: Lens' Config FromFormat
formatSubject :: Lens' Config SubjectFormat
formatBody :: Lens' Config BodyFormat
decoder :: Lens' Config String
withConfig :: MonadBase IO m => (Config -> Config) -> ReaderT Config m a -> m a
-- | Return the Haskell code to write in the configuration file to add
-- feeds.
addFeeds :: MonadBase IO m => [(String, [String])] -> m ()
instance [overlap ok] Monad m => MailFormatter (ReaderT Config m)
instance [overlap ok] (MonadBase IO m, MonadError ImmError m) => MaildirWriter (ReaderT Config m)
instance [overlap ok] (MonadError ImmError m, MonadBase IO m) => DatabaseWriter (ReaderT Config m)
instance [overlap ok] MonadBase IO m => DatabaseReader (ReaderT Config m)
instance [overlap ok] (Applicative m, MonadBase IO m) => Decoder (ReaderT Config m)
instance [overlap ok] Monad m => FeedParser (ReaderT Config m)
instance [overlap ok] Default (IO Config)
instance [overlap ok] Default BodyFormat
instance [overlap ok] Default SubjectFormat
instance [overlap ok] Default FromFormat
module Imm.Core
type FeedConfig = (Config -> Config, FeedID)
type FeedList = [FeedConfig]
dispatch :: (Config -> Config) -> Action -> FeedList -> IO ()
importOPML :: (MonadBase IO m, MonadPlus m) => String -> m ()
check :: (Config -> Config) -> FeedConfig -> IO ()
showStatus :: (Config -> Config) -> FeedConfig -> IO ()
markAsRead :: (Config -> Config) -> FeedConfig -> IO ()
markAsUnread :: (Config -> Config) -> FeedConfig -> IO ()
-- | Write mails for each new item, and update the last check time in state
-- file.
update :: (Config -> Config) -> FeedConfig -> IO ()
module Imm.Boot
-- | Main function to call in the configuration file.
imm :: [ConfigFeed] -> IO ()
type ConfigFeed = (Config -> Config, String)
module Imm
-- | Parse an OPML string and return a list of tuples (category title, feed
-- URIs).
read :: String -> Maybe [(String, [String])]