using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace HelloWorldMvcApp
public static partial class FunctionalExtensions
public static Maybe<T> FirstOrNone<T>(this List<T> @source, Func<T, bool> predicate)
var firstOrDefault = @source.FirstOrDefault(predicate);
return firstOrDefault != null ?
new Some<T>(firstOrDefault) :
public class ClientViewModel
[Display(Name = "Enter Client Id:")]
public string ClientId { get; set; }
public string Name { get; set; }
public int Id { get; set; }
public string Name { get; set; }
public int EmployeeId { get; set; }
public class MockClientRepository
List<Client> clients = new List<Client>{
new Client{Id=1, Name="Jim", EmployeeId=1},
new Client{Id=2, Name="John", EmployeeId=4}
public Maybe<Client> GetById(int id){return clients.FirstOrNone(x => x.Id == id);}
public int Id { get; set; }
public string Name { get; set; }
public class MockEmployeeRepository
List<Employee> employees = new List<Employee>{
new Employee{Id=1, Name="Jane"},
new Employee{Id=2, Name="Rick"}
public Maybe<Employee> GetById(int id){return employees.FirstOrNone(x => x.Id == id);}
public abstract class Maybe<T>
public abstract Maybe<T1> Map<T1>(Func<T, T1> f);
public abstract T1 MatchWith<T1>(Func<T1> None, Func<T, T1> Some);
public Maybe<T1> Bind<T1>(Func<T, Maybe<T1>> f){
None: () => new None<T1>(),
public class None<T> : Maybe<T>
public override Maybe<T1> Map<T1>(Func<T, T1> f)
public override T1 MatchWith<T1>(Func<T1> None, Func<T, T1> Some)
public class Some<T> : Maybe<T>
private readonly T value;
public Some(T value) { this.value = value; }
public override Maybe<T1> Map<T1>(Func<T, T1> f)
return new Some<T1>(f(this.value));
public override T1 MatchWith<T1>(Func<T1> None, Func<T, T1> Some)