35 lines
1.1 KiB
Clojure
35 lines
1.1 KiB
Clojure
(ns pronouns.util
|
|
(:require [clojure.string :as s]))
|
|
|
|
(defn slurp-tabfile [path]
|
|
(let [lines (s/split (slurp path) #"\n")]
|
|
(map #(s/split % #"\t") lines)))
|
|
|
|
(defn table-lookup
|
|
[query-key table]
|
|
(let [arity (count query-key)
|
|
filtered-table (filter #(= query-key (take arity %)) table)]
|
|
(first filtered-table)))
|
|
|
|
(defn tabfile-lookup
|
|
[query-key tabfile]
|
|
(table-lookup query-key (slurp-tabfile tabfile)))
|
|
|
|
(defn minimum-unambiguous-path
|
|
([pronouns-table sections] (minimum-unambiguous-path pronouns-table sections 1))
|
|
([pronouns-table sections number-of-sections]
|
|
(let [sections-subset (take number-of-sections sections)
|
|
results (filter #(= (take number-of-sections %) sections-subset) pronouns-table)]
|
|
(case (count results)
|
|
0 nil
|
|
1 (clojure.string/join "/" sections-subset)
|
|
(recur pronouns-table sections (+ number-of-sections 1))))))
|
|
|
|
(defn abbreviate
|
|
"given a list of pronoun rows, return a list of minimum unabiguous paths"
|
|
[pronouns-table]
|
|
(map (partial minimum-unambiguous-path pronouns-table) pronouns-table))
|
|
|
|
(defn vec-coerce [x]
|
|
(if (vector? x) x [x]))
|