Mercurial > lasercutter
view src/clojure/pprint/utilities.clj @ 10:ef7dbbd6452c
added clojure source goodness
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Sat, 21 Aug 2010 06:25:44 -0400 |
parents | |
children |
line wrap: on
line source
1 ;;; utilities.clj -- part of the pretty printer for Clojure3 ; Copyright (c) Rich Hickey. All rights reserved.4 ; The use and distribution terms for this software are covered by the5 ; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)6 ; which can be found in the file epl-v10.html at the root of this distribution.7 ; By using this software in any fashion, you are agreeing to be bound by8 ; the terms of this license.9 ; You must not remove this notice, or any other, from this software.11 ;; Author: Tom Faulhaber12 ;; April 3, 200914 ;; This module implements some utility function used in formatting and pretty15 ;; printing. The functions here could go in a more general purpose library,16 ;; perhaps.18 (in-ns 'clojure.pprint)20 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21 ;;; Helper functions for digesting formats in the various22 ;;; phases of their lives.23 ;;; These functions are actually pretty general.24 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26 (defn- map-passing-context [func initial-context lis]27 (loop [context initial-context28 lis lis29 acc []]30 (if (empty? lis)31 [acc context]32 (let [this (first lis)33 remainder (next lis)34 [result new-context] (apply func [this context])]35 (recur new-context remainder (conj acc result))))))37 (defn- consume [func initial-context]38 (loop [context initial-context39 acc []]40 (let [[result new-context] (apply func [context])]41 (if (not result)42 [acc new-context]43 (recur new-context (conj acc result))))))45 (defn- consume-while [func initial-context]46 (loop [context initial-context47 acc []]48 (let [[result continue new-context] (apply func [context])]49 (if (not continue)50 [acc context]51 (recur new-context (conj acc result))))))53 (defn- unzip-map [m]54 "Take a map that has pairs in the value slots and produce a pair of maps,55 the first having all the first elements of the pairs and the second all56 the second elements of the pairs"57 [(into {} (for [[k [v1 v2]] m] [k v1]))58 (into {} (for [[k [v1 v2]] m] [k v2]))])60 (defn- tuple-map [m v1]61 "For all the values, v, in the map, replace them with [v v1]"62 (into {} (for [[k v] m] [k [v v1]])))64 (defn- rtrim [s c]65 "Trim all instances of c from the end of sequence s"66 (let [len (count s)]67 (if (and (pos? len) (= (nth s (dec (count s))) c))68 (loop [n (dec len)]69 (cond70 (neg? n) ""71 (not (= (nth s n) c)) (subs s 0 (inc n))72 true (recur (dec n))))73 s)))75 (defn- ltrim [s c]76 "Trim all instances of c from the beginning of sequence s"77 (let [len (count s)]78 (if (and (pos? len) (= (nth s 0) c))79 (loop [n 0]80 (if (or (= n len) (not (= (nth s n) c)))81 (subs s n)82 (recur (inc n))))83 s)))85 (defn- prefix-count [aseq val]86 "Return the number of times that val occurs at the start of sequence aseq,87 if val is a seq itself, count the number of times any element of val occurs at the88 beginning of aseq"89 (let [test (if (coll? val) (set val) #{val})]90 (loop [pos 0]91 (if (or (= pos (count aseq)) (not (test (nth aseq pos))))92 pos93 (recur (inc pos))))))95 (defn- prerr [& args]96 "Println to *err*"97 (binding [*out* *err*]98 (apply println args)))100 (defmacro ^{:private true} prlabel [prefix arg & more-args]101 "Print args to *err* in name = value format"102 `(prerr ~@(cons (list 'quote prefix) (mapcat #(list (list 'quote %) "=" %)103 (cons arg (seq more-args))))))