-extern val domain : string -> Domain => [Root];
-
-domain "hcoop.net" with
-
-end
+extern type domain;
+extern val domain : domain -> Domain => [Root];
+
+extern type emailUser;
+extern type email;
+
+extern type aliasSource;
+extern val userSource : emailUser -> aliasSource;
+extern val defaultSource : aliasSource;
+extern val catchAllSource : aliasSource;
+
+extern type aliasTarget;
+extern val addressTarget : email -> aliasTarget;
+extern val addressesTarget : [email] -> aliasTarget;
+extern val dropTarget : aliasTarget;
+
+extern val aliasPrim : aliasSource -> aliasTarget -> [Domain];
+
+val alias = \user -> \email -> aliasPrim (userSource user) (addressTarget email);
+val aliasMulti = \user -> \emails -> aliasPrim (userSource user) (addressesTarget emails);
+val aliasDrop = \user -> aliasPrim (userSource user) dropTarget;
+
+val defaultAlias = \email -> aliasPrim defaultSource (addressTarget email);
+val catchAllAlias = \email -> aliasPrim catchAllSource (addressTarget email);
+
+domain "hcoop.net" with
+ alias "schmeppo" "dlonker";
+ aliasMulti "me" ["nowhere","smelly@yikes"];
+ aliasDrop "yippo";
+
+ defaultAlias "billy";
+ catchAllAlias "bonkers"
+end