-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Execute arbitrary actions for each unread element of RSS/Atom feeds -- -- Cf README file @package imm @version 1.2.0.0 module Imm.Prelude -- | Right-associative tuple type-constructor type (:::) a b = (a, b) -- | Right-associative tuple data-constructor (+:) :: a -> b -> (a, b) infixr 0 +: (*:) :: (Functor f, Functor g) => (a -> f a) -> (b -> g b) -> (a, b) -> Product f g (a, b) infixr 0 *: data HLeft data HRight data HId data HNo class Sub i sub sup inj' :: Sub i sub sup => Tagged i (sub a -> sup a) -- | A constraint f :<: g expresses that f is subsumed -- by g, i.e. f can be used to construct elements in -- g. class (Functor sub, Functor sup) => (:<:) sub sup inj :: (:<:) sub sup => sub a -> sup a class (Monad m, Functor f, Functor g) => PairingM f g m | f -> g pairM :: PairingM f g m => (a -> b -> m r) -> f a -> g b -> m r interpret :: (PairingM f g m) => (a -> b -> m r) -> Cofree f a -> FreeT g m b -> m r type LByteString = ByteString type ByteString = ByteString type LText = Text type Text = Text -- | Generic show show :: (Show a, IsString b) => a -> b -- | Shortcut to liftIO io :: MonadIO m => IO a -> m a -- | Infix operator for line (<++>) :: Doc -> Doc -> Doc instance Imm.Prelude.Sub Imm.Prelude.HId a a instance Imm.Prelude.Sub Imm.Prelude.HLeft a (Data.Functor.Sum.Sum a b) instance Imm.Prelude.Sub x f g => Imm.Prelude.Sub (Imm.Prelude.HRight, x) f (Data.Functor.Sum.Sum h g) instance (GHC.Base.Functor f, GHC.Base.Functor g, Imm.Prelude.Sub (Imm.Prelude.Contains f g) f g) => f Imm.Prelude.:<: g instance GHC.Base.Monad m => Imm.Prelude.PairingM Data.Functor.Identity.Identity Data.Functor.Identity.Identity m instance (Imm.Prelude.PairingM f f' m, Imm.Prelude.PairingM g g' m) => Imm.Prelude.PairingM (Data.Functor.Sum.Sum f g) (Data.Functor.Product.Product f' g') m instance (Imm.Prelude.PairingM f f' m, Imm.Prelude.PairingM g g' m) => Imm.Prelude.PairingM (Data.Functor.Product.Product f g) (Data.Functor.Sum.Sum f' g') m -- | DSL/interpreter model for the logger module Imm.Logger data LogLevel Debug :: LogLevel Info :: LogLevel Warning :: LogLevel Error :: LogLevel -- | Logger DSL data LoggerF next Log :: LogLevel -> Doc -> next -> LoggerF next GetLevel :: (LogLevel -> next) -> LoggerF next SetLevel :: LogLevel -> next -> LoggerF next SetColorize :: Bool -> next -> LoggerF next Flush :: next -> LoggerF next -- | Logger interpreter data CoLoggerF m a CoLoggerF :: (LogLevel -> Doc -> m a) -> m (LogLevel, a) -> (LogLevel -> m a) -> (Bool -> m a) -> m a -> CoLoggerF m a [logH] :: CoLoggerF m a -> LogLevel -> Doc -> m a [getLevelH] :: CoLoggerF m a -> m (LogLevel, a) [setLevelH] :: CoLoggerF m a -> LogLevel -> m a [setColorizeH] :: CoLoggerF m a -> Bool -> m a [flushH] :: CoLoggerF m a -> m a log :: (MonadFree f m, LoggerF :<: f) => LogLevel -> Doc -> m () getLogLevel :: (MonadFree f m, LoggerF :<: f) => m LogLevel setLogLevel :: (MonadFree f m, LoggerF :<: f) => LogLevel -> m () setColorizeLogs :: (MonadFree f m, LoggerF :<: f) => Bool -> m () flushLogs :: (MonadFree f m, LoggerF :<: f) => m () logDebug :: (MonadFree f m, LoggerF :<: f) => Doc -> m () logInfo :: (MonadFree f m, LoggerF :<: f) => Doc -> m () logWarning :: (MonadFree f m, LoggerF :<: f) => Doc -> m () logError :: (MonadFree f m, LoggerF :<: f) => Doc -> m () instance GHC.Base.Functor m => GHC.Base.Functor (Imm.Logger.CoLoggerF m) instance GHC.Base.Functor Imm.Logger.LoggerF instance GHC.Show.Show Imm.Logger.LogLevel instance GHC.Read.Read Imm.Logger.LogLevel instance GHC.Classes.Ord Imm.Logger.LogLevel instance GHC.Classes.Eq Imm.Logger.LogLevel instance Text.PrettyPrint.ANSI.Leijen.Pretty Imm.Logger.LogLevel instance GHC.Base.Monad m => Imm.Prelude.PairingM (Imm.Logger.CoLoggerF m) Imm.Logger.LoggerF m -- | Simple logger interpreter. For further information, please consult -- System.Log.FastLogger. module Imm.Logger.Simple data LoggerSettings LoggerSettings :: LoggerSet -> LoggerSet -> LogLevel -> Bool -> LoggerSettings -- | LoggerSet used for Debug, Info and Warning -- logs [loggerSet] :: LoggerSettings -> LoggerSet -- | LoggerSet used for Error logs [errorLoggerSet] :: LoggerSettings -> LoggerSet -- | Discard logs that are strictly less serious than this level [logLevel] :: LoggerSettings -> LogLevel -- | Enable log colorisation [colorizeLogs] :: LoggerSettings -> Bool -- | Default logger forwards error messages to stderr, and other messages -- to stdout. defaultLogger :: MonadIO m => m LoggerSettings -- | Interpreter for LoggerF mkCoLogger :: (MonadIO m) => LoggerSettings -> CoLoggerF m LoggerSettings -- | Helpers to manipulate feeds module Imm.Feed -- | Feed reference: either its URI, or its UID from database data FeedRef ByUID :: Int -> FeedRef ByURI :: URI -> FeedRef data Feed Rss :: RssDocument -> Feed Atom :: AtomFeed -> Feed data FeedElement RssElement :: RssItem -> FeedElement AtomElement :: AtomEntry -> FeedElement getFeedTitle :: Feed -> Text getElements :: Feed -> [FeedElement] getDate :: FeedElement -> Maybe UTCTime getTitle :: FeedElement -> Text getHashes :: FeedElement -> [Int] prettyElement :: FeedElement -> Doc instance GHC.Show.Show Imm.Feed.FeedElement instance GHC.Classes.Eq Imm.Feed.FeedElement instance GHC.Show.Show Imm.Feed.Feed instance GHC.Classes.Eq Imm.Feed.Feed instance GHC.Show.Show Imm.Feed.FeedRef instance GHC.Classes.Eq Imm.Feed.FeedRef instance Text.PrettyPrint.ANSI.Leijen.Pretty Imm.Feed.FeedRef -- | DSL/interpreter model for hooks, ie various events that can trigger -- arbitrary actions module Imm.Hooks -- | Hooks DSL data HooksF next OnNewElement :: Feed -> FeedElement -> next -> HooksF next -- | Hooks interpreter data CoHooksF m a CoHooksF :: (Feed -> FeedElement -> m a) -> CoHooksF m a -- | Triggered for each unread feed element [onNewElementH] :: CoHooksF m a -> Feed -> FeedElement -> m a onNewElement :: (MonadFree f m, LoggerF :<: f, HooksF :<: f) => Feed -> FeedElement -> m () instance GHC.Base.Functor m => GHC.Base.Functor (Imm.Hooks.CoHooksF m) instance GHC.Base.Functor Imm.Hooks.HooksF instance GHC.Base.Monad m => Imm.Prelude.PairingM (Imm.Hooks.CoHooksF m) Imm.Hooks.HooksF m -- | Hooks interpreter that sends a mail via a SMTP server for each -- element. You may want to consult Network.HaskellNet.SMTP, -- Network.HaskellNet.SMTP.SSL and Network.Mail.Mime -- modules for additional information. -- -- Here is an example configuration: -- --
-- sendmail :: SendMailSettings
-- sendmail = SendMailSettings smtpServer formatMail
--
-- formatMail :: FormatMail
-- formatMail = FormatMail
-- (\a b -> (defaultFormatFrom a b) { addressEmail = "user@host" } )
-- defaultFormatSubject
-- defaultFormatBody
-- (\_ _ -> [Address Nothing "user@host"])
--
-- smtpServer :: Feed -> FeedElement -> SMTPServer
-- smtpServer _ _ = SMTPServer
-- (Just $ Authentication PLAIN "user" "password")
-- (StartTls "smtp.server" defaultSettingsSMTPSTARTTLS)
--
module Imm.Hooks.SendMail
type Username = String
type Password = String
type ServerName = String
-- | How to connect to the SMTP server
data ConnectionSettings
Plain :: ServerName -> PortNumber -> ConnectionSettings
Ssl :: ServerName -> Settings -> ConnectionSettings
StartTls :: ServerName -> Settings -> ConnectionSettings
-- | How to authenticate to the SMTP server
data Authentication
Authentication :: AuthType -> Username -> Password -> Authentication
data SMTPServer
SMTPServer :: (Maybe Authentication) -> ConnectionSettings -> SMTPServer
-- | How to format outgoing mails from feed elements
data FormatMail
FormatMail :: (Feed -> FeedElement -> Address) -> (Feed -> FeedElement -> Text) -> (Feed -> FeedElement -> Text) -> (Feed -> FeedElement -> [Address]) -> FormatMail
-- | How to write the From: header of feed mails
[formatFrom] :: FormatMail -> Feed -> FeedElement -> Address
-- | How to write the Subject: header of feed mails
[formatSubject] :: FormatMail -> Feed -> FeedElement -> Text
-- | How to write the body of feed mails (sic!)
[formatBody] :: FormatMail -> Feed -> FeedElement -> Text
-- | How to write the To: header of feed mails
[formatTo] :: FormatMail -> Feed -> FeedElement -> [Address]
data SendMailSettings
SendMailSettings :: (Feed -> FeedElement -> SMTPServer) -> FormatMail -> SendMailSettings
-- | Interpreter for HooksF
mkCoHooks :: (MonadIO m) => SendMailSettings -> CoHooksF m SendMailSettings
-- | Fill addressName with the feed title and, if available, the
-- authors' names.
--
-- This function leaves addressEmail empty. You are expected to
-- fill it adequately, because many SMTP servers enforce constraints on
-- the From: email.
defaultFormatFrom :: Feed -> FeedElement -> Address
-- | Fill mail subject with the element title
defaultFormatSubject :: Feed -> FeedElement -> Text
-- | Fill mail body with:
--
--
-- import Imm.Boot
-- import Imm.Database.JsonFile
-- import Imm.Feed
-- import Imm.Hooks.SendMail
-- import Imm.HTTP.Simple
-- import Imm.Logger.Simple
-- import Imm.XML.Simple
--
-- main :: IO ()
-- main = do
-- logger <- defaultLogger
-- manager <- defaultManager
-- database <- defaultDatabase
--
-- imm (mkCoHttpClient, manager) (mkCoDatabase, database) (mkCoLogger, logger) (mkCoHooks, sendmail) (mkCoXmlParser, defaultPreProcess)
--
-- sendmail :: SendMailSettings
-- sendmail = SendMailSettings smtpServer formatMail
--
-- formatMail :: FormatMail
-- formatMail = FormatMail
-- (\a b -> (defaultFormatFrom a b) { addressEmail = "user@host" } )
-- defaultFormatSubject
-- defaultFormatBody
-- (\_ _ -> [Address Nothing "user@host"])
--
-- smtpServer :: Feed -> FeedElement -> SMTPServer
-- smtpServer _ _ = SMTPServer
-- (Just $ Authentication PLAIN "user" "password")
-- (StartTls "smtp.host" defaultSettingsSMTPSTARTTLS)
--
imm :: (a -> CoHttpClientF IO a, a) -> (b -> CoDatabaseF' IO b, b) -> (c -> CoLoggerF IO c, c) -> (d -> CoHooksF IO d, d) -> (e -> CoXmlParserF IO e, e) -> IO ()
instance GHC.Show.Show Imm.Boot.InterruptedException
instance GHC.Read.Read Imm.Boot.InterruptedException
instance GHC.Classes.Eq Imm.Boot.InterruptedException
instance GHC.Show.Show Imm.Boot.SafeGuard
instance GHC.Read.Read Imm.Boot.SafeGuard
instance GHC.Classes.Eq Imm.Boot.SafeGuard
instance GHC.Exception.Exception Imm.Boot.InterruptedException
-- | Database interpreter based on a JSON file
module Imm.Database.JsonFile
data CacheStatus
Empty :: CacheStatus
Clean :: CacheStatus
Dirty :: CacheStatus
data JsonFileDatabase t
JsonFileDatabase :: FilePath -> (Map (Key t) (Entry t)) -> CacheStatus -> JsonFileDatabase t
mkJsonFileDatabase :: (Table t) => FilePath -> JsonFileDatabase t
-- | Default database is stored in $XDG_CONFIG_HOME/imm/feeds.json
defaultDatabase :: Table t => IO (JsonFileDatabase t)
data JsonException
UnableDecode :: JsonException
-- | Interpreter for DatabaseF
mkCoDatabase :: (Table t, FromJSON (Key t), FromJSON (Entry t), ToJSON (Key t), ToJSON (Entry t), MonadIO m, MonadCatch m) => JsonFileDatabase t -> CoDatabaseF t m (JsonFileDatabase t)
loadInCache :: (Table t, MonadIO m, MonadCatch m, FromJSON (Key t), FromJSON (Entry t)) => JsonFileDatabase t -> m (JsonFileDatabase t)
insert :: (Table t, MonadIO m, MonadCatch m, FromJSON (Key t), FromJSON (Entry t)) => JsonFileDatabase t -> [(Key t, Entry t)] -> m (JsonFileDatabase t)
insertInCache :: Table t => [(Key t, Entry t)] -> JsonFileDatabase t -> JsonFileDatabase t
update :: (Table t, MonadIO m, MonadCatch m, FromJSON (Key t), FromJSON (Entry t)) => JsonFileDatabase t -> Key t -> (Entry t -> Entry t) -> m (JsonFileDatabase t)
updateInCache :: Table t => Key t -> (Entry t -> Entry t) -> JsonFileDatabase t -> JsonFileDatabase t
delete :: (Table t, MonadIO m, MonadCatch m, FromJSON (Key t), FromJSON (Entry t)) => JsonFileDatabase t -> [Key t] -> m (JsonFileDatabase t)
deleteInCache :: Table t => [Key t] -> JsonFileDatabase t -> JsonFileDatabase t
purge :: (Table t, MonadIO m, MonadCatch m, FromJSON (Key t), FromJSON (Entry t)) => JsonFileDatabase t -> m (JsonFileDatabase t)
purgeInCache :: Table t => JsonFileDatabase t -> JsonFileDatabase t
commit :: (MonadIO m, ToJSON (Key t), ToJSON (Entry t)) => JsonFileDatabase t -> m (JsonFileDatabase t)
instance GHC.Show.Show Imm.Database.JsonFile.JsonException
instance GHC.Classes.Eq Imm.Database.JsonFile.JsonException
instance GHC.Show.Show Imm.Database.JsonFile.CacheStatus
instance GHC.Classes.Eq Imm.Database.JsonFile.CacheStatus
instance Text.PrettyPrint.ANSI.Leijen.Pretty (Imm.Database.JsonFile.JsonFileDatabase t)
instance GHC.Exception.Exception Imm.Database.JsonFile.JsonException
-- | Meta-module that reexports many Imm sub-modules.
--
-- To get started, please consult Imm.Boot.
module Imm