-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | fortune-mod clone -- -- fortune-mod clone, in library and executable form. @package misfortune @version 0.1 module Data.Fortune -- | A handle to an open fortune database. data FortuneFile -- | Get the path of the text part of an open fortune database. fortuneFilePath :: FortuneFile -> FilePath -- | Get the path of the index part of an open fortune database. fortuneIndexPath :: FortuneFile -> FilePath -- | openFortuneFile path delim writeMode: Open a fortune file at -- path, using delim as the character between strings, -- allowing writing if writeMode is set. If no file exists at -- the specified path, an error will be thrown or the file will be -- created, depending on writeMode. openFortuneFile :: FilePath -> Char -> Bool -> IO FortuneFile -- | Close a fortune file. Subsequent accesses will fail. closeFortuneFile :: FortuneFile -> IO () -- | Get the Index of a FortuneFile, opening it if necessary. getIndex :: FortuneFile -> IO Index -- | Clear a FortuneFiles Index and rebuild it from the -- contents of the text file. rebuildIndex :: FortuneFile -> IO () -- | getFortune f i retrieves the text of the i'th -- fortune (according to the order in the index file) in the -- FortuneFile f. getFortune :: FortuneFile -> Int -> IO Text -- | Get the text of every fortune in a fortune file, in the order they -- occur in the file. Ignores the index entirely. getFortunes :: FortuneFile -> IO [Text] -- | Get the number of fortunes in a fortune file, as recorded in the -- index. getNumFortunes :: FortuneFile -> IO Int -- | Append a fortune to a fortune file, inserting a delimiter if needed -- and updating the index. appendFortune :: FortuneFile -> Text -> IO () -- | A handle to an open fortune index file. data Index -- | openIndex path writeMode: Opens the index file at -- path. The Index will be writable if writeMode -- is True. If there is no index file at that path, an error will -- be thrown or the index will be created, depending on -- writeMode. openIndex :: FilePath -> Bool -> IO Index -- | Create an in-memory index - useful for working with files when, for -- whatever reason, you cannot create a valid index. createVirtualIndex :: IO Index -- | Close an index file. Subsequent accesses will fail. closeIndex :: Index -> IO () -- | Get some cached stats about the fortunes indexed in this file. getStats :: Index -> IO FortuneStats -- | Errors that can be thrown when stats are read from an index file. -- These errors describe various logical inconsistencies that generally -- indicate that the index file is corrupted somehow. data StatsProblem NegativeCount :: !Int -> StatsProblem NegativeLength :: !Int -> StatsProblem NegativeOffset :: !Int -> StatsProblem LengthsWithoutEntries :: StatsProblem EntriesWithoutLengths :: StatsProblem MaxLengthLessThanMinLength :: StatsProblem InconsistentLengthsForOneEntry :: StatsProblem -- | An exception type indicating things that can be wrong about an index -- file's header. data HeaderProblem BadMagicNumber :: !Word32 -> HeaderProblem UnsupportedVersion :: !Word32 -> HeaderProblem StatsProblem :: !StatsProblem -> HeaderProblem TableStartsBeforeHeaderEnds :: HeaderProblem -- | Errors that can be thrown indicating a problem with an index file. data IndexProblem HeaderProblem :: !HeaderProblem -> IndexProblem TableLongerThanFile :: IndexProblem AccessToClosedIndex :: IndexProblem -- | Force a consistency check on an index file. checkIndex :: Index -> IO (Maybe IndexProblem) -- | Conceptually, an Index file is just a header containing -- FortuneStats and an array of these entries. An -- IndexEntry stores the information needed to locate one string -- in the fortune fiel, as well as some basic stats about that one file -- (from which the FortuneStats will be derived). data IndexEntry IndexEntry :: !Int -> !Int -> !Int -> !Int -> IndexEntry -- | The location of the string in the file, as a byte offset stringOffset :: IndexEntry -> !Int -- | The number of bytes the string occupies. stringBytes :: IndexEntry -> !Int -- | The number of characters in the string. stringChars :: IndexEntry -> !Int -- | The number of lines in the string. stringLines :: IndexEntry -> !Int -- | Convert one index entry to a FortuneStats record describing it. indexEntryStats :: IndexEntry -> FortuneStats -- | Read all the entries in an Index getEntries :: Index -> IO (Vector IndexEntry) -- | Read a specified entry from an Index. getEntry :: Index -> Int -> IO IndexEntry -- | Repeatedly invoke a generator for index entries until it returns -- Nothing, appending all entries returned to the index file. unfoldEntries :: Index -> IO (Maybe IndexEntry) -> IO () -- | Append all the given entries to the Index file. appendEntries :: Index -> Vector IndexEntry -> IO () -- | Append a single IndexEntry to an Index file. appendEntry :: Index -> IndexEntry -> IO () -- | Delete all entries from an Index. clearIndex :: Index -> IO () -- | All the operations here should preserve correctness of stats, but just -- in case... This procedure forces the stats to be recomputed. rebuildStats :: Index -> IO () -- | Some statistics about the fortunes in a database. These are stored in -- the index file and used to speed up various calculations that would -- otherwise require re-reading lots of files. data FortuneStats -- | The number of fortune strings in the index numFortunes :: FortuneStats -> Int -- | The smallest number of characters in any string in the index minChars :: FortuneStats -> Int -- | The greatest number of characters in any string in the index maxLines :: FortuneStats -> Int -- | The smallest number of lines in any string in the index minLines :: FortuneStats -> Int -- | The greatest number of lines in any string in the index maxChars :: FortuneStats -> Int -- | List all the fortune files in a directory. The Bool value -- specifies whether to search subtrees as well. -- -- Any file which does not have an extension of ".ix" or ".dat" will be -- reported as a fortune file (".dat" is not used by misfortune, but is -- ignored so that misfortune can share fortune databases with -- fortune). listFortuneFiles :: Bool -> FilePath -> IO [FilePath] -- | List all the fortune files in several directories. Each directory will -- be searched by listFortuneFiles (using the corresponding -- Bool value to control whether the directory is searched -- recursively) and all results will be combined. listFortuneFilesIn :: [(FilePath, Bool)] -> IO [FilePath] -- | Like listFortuneFiles except only returning paths with the -- specified file name. findFortuneFile :: Bool -> FilePath -> String -> IO [FilePath] -- | Like listFortuneFilesIn except only returning paths with the -- specified file name. findFortuneFileIn :: [(String, Bool)] -> String -> IO [FilePath] -- | Like findFortuneFileIn but searches for multiple files in -- multiple directories. findFortuneFilesIn :: [(String, Bool)] -> [String] -> IO [FilePath] -- | Three different search paths are supported, depending on the "type" of -- fortune requested. These are the types that can be requested. data FortuneType All :: FortuneType Normal :: FortuneType Offensive :: FortuneType -- | Get the path of the directory containing built-in fortunes of the -- specified type. getFortuneDir :: FortuneType -> IO FilePath -- | Get a list of all fortune files on the configured search path (see -- getFortuneSearchPath) defaultFortuneFiles :: FortuneType -> IO [FilePath] -- | Get the default search path for a specified fortune type (ignoring the -- MISFORTUNE_PATH environment variables) defaultFortuneSearchPath :: FortuneType -> IO [(FilePath, Bool)] -- | Get the configured search path for a specified fortune type. If the -- environment variable MISFORTUNE_PATH_TYPE is set, it -- will be used. Otherwise, if MISFORTUNE_PATH is set, it will -- be used. Otherwise, the defaultFortuneSearchPath will be used. -- -- Environment variables are interpreted by splitting on -- : and checking for an optional + or - -- prefix on each component (where + indicates recursive search of -- that directory). The default is non-recursive search for each -- component. getFortuneSearchPath :: FortuneType -> IO [(FilePath, Bool)] -- | Search for all fortune files in the configured search path with the -- given name. resolveFortuneFile :: FortuneType -> String -> IO [FilePath] -- | Search for all fortune files in the configured search path with any of -- the given names. resolveFortuneFiles :: FortuneType -> [String] -> IO [FilePath] -- | Select a random fortune from all files matching any of a list of names -- (or if the list is empty, all fortune files on the search path). Every -- fortune string will have an equal probability of being selected. randomFortune :: [String] -> IO String -- | Select a random fortune file from a specified distribution and then -- select a random fortune from that file (unformly). randomFortuneFromRandomFile :: RVar FortuneFile -> IO String -- | Given a list of FortuneFiles, compute a distrubution over them -- weighted by the number of fortunes in each. If this distribution is -- used with randomFortuneFromRandomFile, the result will be a -- uniform selection over all the fortunes in all the files. defaultFortuneDistribution :: [FortuneFile] -> IO (Categorical Float FortuneFile) -- | Like defaultFortuneDistribution, but filtering the fortunes. In -- addition to the fortune file, the tuples in the distribution include a -- distribution over the matching fortune indices in that file, assigning -- equal weight to each. fortuneDistributionWhere :: (FortuneFile -> Int -> IndexEntry -> IO Bool) -> [FortuneFile] -> IO (Categorical Float (FortuneFile, Categorical Float Int)) -- | Perform an action with an open FortuneFile, ensuring the file -- is closed when the action exits. withFortuneFile :: FilePath -> Char -> Bool -> (FortuneFile -> IO a) -> IO a -- | Perform an action with many open FortuneFiles, ensuring the -- files are closed when the action exits. withFortuneFiles :: [FilePath] -> Char -> Bool -> ([FortuneFile] -> IO a) -> IO a mapFortunesWithIndexM :: (Enum a, Num a) => (a -> IndexEntry -> IO b) -> FortuneFile -> IO [b] mapFortunesWithIndex :: (Enum a, Num a) => (a -> IO b) -> FortuneFile -> IO [b] mapFortunesM :: (IndexEntry -> IO b) -> FortuneFile -> IO [b] mapFortunes :: (IndexEntry -> b) -> FortuneFile -> IO [b] filterFortunesWithIndexM :: (Enum a, Num a) => (a -> IndexEntry -> IO Bool) -> FortuneFile -> IO [a] filterFortunesWithIndex :: (Enum a, Num a) => (a -> IndexEntry -> Bool) -> FortuneFile -> IO [a] filterFortunesM :: (Enum a, Num a) => (IndexEntry -> IO Bool) -> FortuneFile -> IO [a] filterFortunes :: (Enum a, Num a) => (IndexEntry -> Bool) -> FortuneFile -> IO [a] instance Eq FortuneType instance Ord FortuneType instance Read FortuneType instance Show FortuneType instance Enum FortuneType instance Bounded FortuneType