export type UserId = string export type Name = string export type User = { id: string, name: string, active: boolean } export error UserMissing = { id: string } export error StoreUnavailable = { message: string } export service Users { find(id: UserId): Option fails StoreUnavailable save(user: User): void fails StoreUnavailable all(): User[] fails StoreUnavailable } export const getUser = (id: UserId): User fails UserMissing | StoreUnavailable uses Users.find => match Users.find(id) { Some(user) => user, None => fail(UserMissing({ id })) } export const rename = (id: UserId, name: Name): User fails UserMissing | StoreUnavailable uses Users.find | Users.save => { const user = getUser(id) const renamed = { ...user, name } Users.save(renamed) renamed } export const displayName = (id: UserId): Name fails StoreUnavailable uses Users.find => try { getUser(id).name } catch { UserMissing(error) => "Guest" } export const activeNames = (): Name[] fails StoreUnavailable uses Users.all => Users.all() |> filter(user => user.active) |> map(user => user.name)