public SubUnit GMapT <A>(MkT <A> lf) { Func <Dept, SubUnit> fd = d => new SubUnit(lf.Apply(d)); Func <Employee, SubUnit> fe = e => new SubUnit(lf.Apply(e)); return(Match(fd, fe)); }
private static void V2Example() { var grandchild = new Grandchild("Mario"); var child = new Child(grandchild); var parent = new Parent(child); var lf = new MkT <Grandchild>(p => new Grandchild(p.Name + " Rossi")); var result = Everywhere(lf, parent); }
private static void ParadiseExample() { // Build example company var company = Functions.BuildCompany(); // Lift function, mkT in the original paper var liftedIncrease = new MkT <Salary>(p => Functions.Increase(0.1m, p)); // Apply the lifted function everywhere var result = Everywhere(liftedIncrease, company); // Salary is increased, check only one to verify it var original = company.Departments .FirstOrDefault(p => p.Name.Value == "Strategy") .Manager.Salary.Value; var final = result.Departments .FirstOrDefault(p => p.Name.Value == "Strategy") .Manager.Salary.Value; Console.WriteLine($"Starting salary is {original}, final salary is {final}"); }
public Dept GMapT <A>(MkT <A> lf) { return(new Dept(lf.Apply(Name), lf.Apply(Manager), Units.Select(u => lf.Apply(u)).ToArray())); }
public Grandchild GMapT <A>(MkT <A> lf) { return(new Grandchild(Name)); }
public Parent GMapT <A>(MkT <A> lf) { return(new Parent(lf.Apply(_child))); }
public Company GMapT <A>(MkT <A> lf) { return(new Company(Departments.Select(d => lf.Apply(d)).ToArray())); }
public Salary GMapT <A>(MkT <A> lf) { return(this); }
public new Manager GMapT <A>(MkT <A> lf) { return(new Manager(lf.Apply(Salary), lf.Apply(Person))); }
public Employee GMapT <A>(MkT <A> lf) { return(new Employee(lf.Apply(Salary), lf.Apply(Person))); }
public Person GMapT <A>(MkT <A> lf) { return(new Person(lf.Apply(Address), lf.Apply(Name))); }
public Child GMapT <A>(MkT <A> lf) { return(new Child(lf.Apply(_grandchild))); }
public Address GMapT <A>(MkT <A> lf) { return(this); }
public Name GMapT <A>(MkT <A> lf) { return(this); }