Well, despite of fact that core.logic is fine tool and is worth of study, I 
have implemented own solution to my problem.

Here is a full implementation: http://pastebin.com/Z5BETZd3

And the idea is to index each value in record perserving the record and 
meaning of values. Then search by these values. The mini DSL contains "from 
insert select where" keywords.

The resulting usage code is:

(defn permission[ roles ops states ]
(letfn [ (or-nil [ a ] (or a #{ nil })) ]
(from :permission
(doseq[ r (or-nil roles) o (or-nil ops) s (or-nil states) ]
(insert { :role r :op o :state s })))))

(permission #{:admin :operator } #{:reject :accept} #{:applied} )
(permission #{:auditor :operator } #{:list} any )
(permission #{:operator } #{:enter} #{:dirty} )

(defn can-access[ role op state ]
(not (empty? (from :permission
(where { :role role :op op :state state })))))

(defn get-operations[ role state ]
(map :op (from :permission
(select [ :op ]
(where { :role role :state state })))))

; Some tests

(get-operations  :operator :applied)
(can-access :auditor :list :applied)
(can-access :admin :enter :dirty)

 

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to