(in-package :distribute-coin)

;; STRING → BOOLEAN
(defun onion-url (url)
  "Return whether or not a given URL is for an onion site."
  (cl-ppcre:scan "\.onion" url))


;; STRING PATTERN-PAIR … PATTERN-PAIR → STRING
(defun replace-all (string &rest replace-pairs)
  "Apply several sets of regex replacements to a string,
  with each replacement in the form of a 'replacement-pair':
  '(TARGET REPLACEMENT)
  I.E., to replace 'a', you'd use
  '('a' 'replacement-of-a')"

  (mapcar (lambda (pair)
	    (setq string
		  (cl-ppcre:regex-replace-all
		    (first pair) string (second pair))))
	  replace-pairs)
  string)


;; STRING → STRING
(defun file-type (filename)
  "Return the file extension of a given filename."
  (setq type-string (cl-ppcre:regex-replace-all ".*\\." filename "\."))
  (if (or (zerop (length type-string))
	  (not (cl-ppcre:scan "\\." filename)))
    nil
    type-string))


(defun choose-new-file-name (original new-a new-b)
  (setq new-name
	(cond ((or (and (zerop (length new-a)) (zerop (length new-b)))
		    (and (not new-a) (not new-b)))
		original)
	       ((zerop (length new-a))
		new-b)
	       ('T new-a)))
  (if (equal new-name "nil") (setq new-name original))
  (if (not (file-type new-name))
    (string+ new-name (file-type original))
    new-name))


;; STRING-A STRING-B … STRING-N → STRING
(defun string+ (&rest strings)
    "Combine an arbitrary amount of strings into a single string."
      (reduce (lambda (a b) (format nil "~A~A" a b)) strings))