Mercurial > lasercutter
view src/clojure/contrib/datalog/util.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 ;; Copyright (c) Jeffrey Straszheim. All rights reserved. The use and2 ;; distribution terms for this software are covered by the Eclipse Public3 ;; License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) which can4 ;; be found in the file epl-v10.html at the root of this distribution. By5 ;; using this software in any fashion, you are agreeing to be bound by the6 ;; terms of this license. You must not remove this notice, or any other,7 ;; from this software.8 ;;9 ;; util.clj10 ;;11 ;; A Clojure implementation of Datalog -- Utilities12 ;;13 ;; straszheimjeffrey (gmail)14 ;; Created 3 Feburary 200917 (ns clojure.contrib.datalog.util18 (:use [clojure.contrib.seq :only (separate)]))22 ;;; Bindings and logic vars. A binding in a hash of logic vars to23 ;;; bound values. Logic vars are any symbol prefixed with a \?.25 (defn is-var?26 "Is this a logic variable: e.g. a symbol prefixed with a ?"27 [sym]28 (when (symbol? sym)29 (let [name (name sym)]30 (and (= \? (first name))31 (not= \? (fnext name))))))33 (defn is-query-var?34 "Is this a query variable: e.g. a symbol prefixed with ??"35 [sym]36 (when (symbol? sym)37 (let [name (name sym)]38 (and (= \? (first name))39 (= \? (fnext name))))))41 (defn map-values42 "Like map, but works over the values of a hash map"43 [f hash]44 (let [key-vals (map (fn [[key val]] [key (f val)]) hash)]45 (if (seq key-vals)46 (apply conj (empty hash) key-vals)47 hash)))49 (defn keys-to-vals50 "Given a map and a collection of keys, return the collection of vals"51 [m ks]52 (vals (select-keys m ks)))54 (defn reverse-map55 "Reverse the keys/values of a map"56 [m]57 (into {} (map (fn [[k v]] [v k]) m)))60 ;;; Preduce -- A parallel reduce over hashes62 (defn preduce63 "Similar to merge-with, but the contents of each key are merged in64 parallel using f.66 f - a function of 2 arguments.67 data - a collection of hashes."68 [f data]69 (let [data-1 (map (fn [h] (map-values #(list %) h)) data)70 merged (doall (apply merge-with concat data-1))71 ; Groups w/ multiple elements are identified for parallel processing72 [complex simple] (separate (fn [[key vals]] (> (count vals) 1)) merged)73 fold-group (fn [[key vals]] {key (reduce f vals)})74 fix-single (fn [[key [val]]] [key val])]75 (apply merge (concat (pmap fold-group merged) (map fix-single simple)))))78 ;;; Debuging and Tracing80 (def *trace-datalog* nil)82 (defmacro trace-datalog83 "If *test-datalog* is set to true, run the enclosed commands"84 [& body]85 `(when *trace-datalog*86 ~@body))89 ;; End of file