aboutsummaryrefslogtreecommitdiff
path: root/sx-filter.el
diff options
context:
space:
mode:
authorArtur Malabarba <bruce.connor.am@gmail.com>2014-11-07 14:03:04 +0000
committerArtur Malabarba <bruce.connor.am@gmail.com>2014-11-07 14:03:04 +0000
commit26177eb415f1bc4cf8bfa52e5f027ca38378786c (patch)
treef83a912af1d8c6002efece7ed363303c6a45f145 /sx-filter.el
parent0d59cd54c84b1245d0dd0ea25ff49d7abd5e60b7 (diff)
Renamed all files.
Still a lot to be done inside them.
Diffstat (limited to 'sx-filter.el')
-rw-r--r--sx-filter.el102
1 files changed, 102 insertions, 0 deletions
diff --git a/sx-filter.el b/sx-filter.el
new file mode 100644
index 0000000..6b56001
--- /dev/null
+++ b/sx-filter.el
@@ -0,0 +1,102 @@
+;;; stack-filter.el --- filters for stack-mode -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2014 Sean Allred
+
+;; Author: Sean Allred <code@seanallred.com>
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;
+
+;;; Code:
+
+
+;;; Dependencies
+
+(require 'stack-core)
+
+
+;;; Customizations
+
+(defconst stack-filter-cache-file
+ "filters.el")
+
+(defvar stack-filter
+ 'default
+ "The current filter.
+To customize the filter for the next call
+to `stack-core-make-request', let-bind this variable to the
+output of a call to `stack-core-compile-filter'. Be careful! If
+you're going to be using this new filter a lot, create a variable
+for it. Creation requests count against
+`stack-core-remaining-api-requests'!")
+
+
+;;; Compilation
+
+;;; TODO allow BASE to be a precompiled filter name
+(defun stack-filter-compile (&optional include exclude base)
+ "Compile INCLUDE and EXCLUDE into a filter derived from BASE.
+
+INCLUDE and EXCLUDE must both be lists; BASE should be a symbol
+or string."
+ (let ((keyword-arguments
+ `((include . ,(if include (mapconcat
+ #'stack-core-thing-as-string
+ include ";")))
+ (exclude . ,(if exclude (mapconcat
+ #'stack-core-thing-as-string
+ exclude ";")))
+ (base . ,(if base base)))))
+ (let ((response (stack-core-make-request
+ "filter/create"
+ keyword-arguments)))
+ (url-hexify-string
+ (cdr (assoc 'filter
+ (elt response 0)))))))
+
+
+;;; Storage and Retrieval
+
+(defun stack-filter-get (filter)
+ "Retrieve named FILTER from `stack-filter-cache-file'."
+ (cdr (assoc filter (stack-cache-get stack-filter-cache-file))))
+
+(defun stack-filter-store (name &optional filter)
+ "Store NAME as FILTER in `stack-filter-cache-file'.
+
+NAME should be a symbol and FILTER is a string as compiled by
+`stack-filter-compile'.
+
+If NAME is a cons cell, (car NAME) is taken to be the actual NAME
+and (cdr NAME) is taken to be the actual FILTER. In this case,
+the second argument is simply ignored."
+ (let ((name (if (consp name) (car name) name))
+ (filter (if (consp name) (cdr name) filter)))
+ (unless (symbolp name)
+ (error "Name must be a symbol: %S" name))
+ (let* ((dict (stack-cache-get stack-filter-cache-file))
+ (entry (assoc name dict)))
+ (if entry (setcdr entry filter)
+ (setq dict (cons (cons name filter) dict)))
+
+ (stack-cache-set stack-filter-cache-file dict))))
+
+(defun stack-filter-store-all (name-filter-alist)
+ (mapc #'stack-filter-store name-filter-alist))
+
+(provide 'stack-filter)
+;;; stack-filter.el ends here