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