content: -- | Contains actions for voting on posts and comments. There are functions
  --   for upvoting ('upvotePost', 'upvoteComment'), downvoting ('downvotePost',
  --   'downVoteComment') as well as removing votes that have already been cast
  --   ('unvotePost', 'unvoteComment').
  --
  --   Please note that automated voting (i.e. by a bot, as opposed to being
  --   specifically ordered to by a person) is strictly against the Reddit rules,
  --   and is a very effective way of getting your bot shadowbanned.
  module Reddit.Actions.Voting
    ( upvotePost
    , downvotePost
    , unvotePost
    , upvoteComment
    , downvoteComment
    , unvoteComment ) where
  
  import Reddit.Routes.Vote (VoteDirection(..))
  import Reddit.Types
  import Reddit.Types.Empty
  import Reddit.Types.Reddit
  import qualified Reddit.Routes as Route
  
  vote :: (Monad m, Thing a) => VoteDirection -> a -> RedditT m ()
  vote dir = nothing . runRoute . Route.vote dir
  
  -- | Upvote a post.
  upvotePost :: Monad m => PostID -> RedditT m ()
  upvotePost = vote UpVote
  
  -- | Downvote a post.
  downvotePost :: Monad m => PostID -> RedditT m ()
  downvotePost = vote DownVote
  
  -- | Remove a vote from a post.
  unvotePost :: Monad m => PostID -> RedditT m ()
  unvotePost = vote RemoveVote
  
  -- | Upvote a comment.
  upvoteComment :: Monad m => CommentID -> RedditT m ()
  upvoteComment = vote UpVote
  
  -- | Downvote a comment.
  downvoteComment :: Monad m => CommentID -> RedditT m ()
  downvoteComment = vote RemoveVote
  
  -- | Remove a previously-cast vote from a comment.
  unvoteComment :: Monad m => CommentID -> RedditT m ()
  unvoteComment = vote DownVote
  