anchor.diff:  
     let renderProfileNotFound =
       page "not_found.liquid" "user not found"
  -  
  -  let handleUserProfileAsyncResult newUserProfileViewModel loggedInUser aResult = async {
  -    let! result = aResult |> Async.ofAsyncResult
  -    match result with
  -    | Success (Some (userProfile : UserProfile)) -> 
  +
  +  let onHandleUserProfileSuccess newUserProfileViewModel isLoggedIn userProfileMayBe = 
  +    match userProfileMayBe with
  +    | Some (userProfile : UserProfile) -> 
         let vm = {
           newUserProfileViewModel userProfile with
  -          IsLoggedIn = Option.isSome loggedInUser
  -          IsSelf = userProfile.IsSelf }
  -      return renderUserProfilePage vm
  -    | Success None -> 
  -      return renderProfileNotFound
  -    | Failure ex -> 
  -      printfn "%A" ex
  -      return page "server_error.liquid" "something went wrong"
  -  } 
  +          IsLoggedIn = isLoggedIn }
  +      renderUserProfilePage vm
  +    | None -> 
  +      renderProfileNotFound
  +
  +  let onHandleUserProfileFailure (ex : Exception) =
  +    printfn "%A" ex
  +    page "server_error.liquid" "something went wrong"
       
   
  -  let renderUserProfile newUserProfileViewModel handleUserProfile username loggedInUser  ctx = async {
  +  let renderUserProfile newUserProfileViewModel (handleUserProfile : HandleUserProfile) username loggedInUser  ctx = async {
       match Username.TryCreate username with
       | Success validatedUsername -> 
  +      let isLoggedIn = Option.isSome loggedInUser
  +      let onSuccess = 
  +        onHandleUserProfileSuccess newUserProfileViewModel isLoggedIn
         let! webpart = 
           handleUserProfile validatedUsername loggedInUser
  -        |> handleUserProfileAsyncResult newUserProfileViewModel loggedInUser
  +        |> AR.either onSuccess onHandleUserProfileFailure
         return! webpart ctx
       | Failure _ -> 
         return! renderProfileNotFound ctx
  
positive.code:   }
    let gravatarUrl (emailAddress : UserEmailAddress) =
      use md5 = MD5.Create()
      emailAddress.Value.Trim().ToLowerInvariant()  
      |> System.Text.Encoding.Default.GetBytes
      |> md5.ComputeHash
      |> Array.map (fun b -> b.ToString("x2"))
  
negative.code:     IsSelf = false
    }
  
    type FindUserProfile = 
      Username -> AsyncResult<UserProfile option, Exception>
    let findUserProfile (findUser : FindUser) username = asyncTrial {
      let! userMayBe = findUser username
      return Option.map newProfile userMayBe
    }
  
    type HandleUserProfile = 
      Username -> User option -> AsyncResult<UserProfile option, Exception>
    let handleUserProfile findUserProfile (username : Username) loggedInUser  = asyncTrial {
      match loggedInUser with
      | None -> 
  