NONE => false
| SOME values => SS.member (values, value)
+fun queryAll user =
+ case SM.find (!acl, user) of
+ NONE => []
+ | SOME classes => SM.foldri (fn (class, values, out) =>
+ (class, SS.foldr (op::) [] values) :: out)
+ [] classes
+
+fun whoHas {class, value} =
+ SM.foldri (fn (user, classes, users) =>
+ case SM.find (classes, class) of
+ NONE => users
+ | SOME values =>
+ if SS.member (values, value) then
+ user :: users
+ else
+ users) [] (!acl)
+
fun class {user, class} =
case SM.find (!acl, user) of
NONE => SS.empty