+fun mailmanPlace (EApp ((EVar "mailman_place_default", _), (EString node, _)), _) =
+ SOME (node, Domain.nodeIp node)
+ | mailmanPlace (EApp ((EApp ((EVar "mailman_place", _), (EString node, _)), _), (EString ip, _)), _) =
+ SOME (node, ip)
+ | mailmanPlace _ = NONE
+
+fun mailmanPlaceDefault node = (EApp ((EVar "mailman_place_default", dl), (EString node, dl)), dl)
+
+val _ = Env.registerFunction ("mailman_place_to_web_node",
+ fn [e] => Option.map (fn (node, _) => (EString node, dl)) (mailmanPlace e)
+ | _ => NONE)
+
+val _ = Env.registerFunction ("mailman_place_to_node",
+ fn [e] => Option.map (fn (node, _) => (EString node, dl)) (mailmanPlace e)
+ | _ => NONE)
+
+val _ = Env.registerFunction ("mailman_place_to_ip",
+ fn [e] => Option.map (fn (_, ip) => (EString ip, dl)) (mailmanPlace e)
+ | _ => NONE)
+