using System.Threading.Tasks;
using System.Collections.Generic;
using System.Diagnostics;
public static async Task Main(string[] args)
Console.WriteLine(ToResponse<Value>(new HaveASandwich(null, true)).Result);
Console.WriteLine(ToResponse<Value>(new HaveASandwich("error", true)).Result);
Console.WriteLine(ToResponse<Value>(new HaveASandwich("no error", false)).Result);
Console.WriteLine(ToResponse<Value>(new HaveASandwich("null", false)).Result);
public static async Task<Either<Error, T>> ToResponse<T>(HaveASandwich a) where T : new(){
var content = await a.ReadAsStringAsync();
if (string.IsNullOrEmpty(content))
return a.IsError() switch
true => DeserializeError(content) ?? new Error(),
false => DeserializeValue<T>(content) ?? throw new InvalidOperationException("Error while handling HttpResponseMessageExt ToResponse DeserializeValue")
public static Task<Either<Error, T>> ToResponse2<T>(HaveASandwich a) where T : new(){
return a.ReadAsStringAsync().ContinueWith(t =>
((Either<Error, string>)t.Result)
.Bind<string>(v => string.IsNullOrEmpty(v) ? new Error() : v)
.Bind<T>(v => a.IsError() ? DeserializeError(v) : DeserializeValue<T>(v))
public static Error DeserializeError(string c){
public static T DeserializeValue<T>(string c) where T : new(){
return c == "null" ? default(T) : new T();
public class HaveASandwich{
public HaveASandwich(string r, bool e){
public async Task<string> ReadAsStringAsync(){