From 75e59c12267ccdddf7d88b0bb5389cd4c37bc544 Mon Sep 17 00:00:00 2001 From: mo k Date: Thu, 26 Apr 2012 13:08:15 -0600 Subject: create a Collect extension method to collect results from IVisitable's --- src/domain/EstimatedNetProductionFor.cs | 4 ++-- src/domain/GasPlant.cs | 16 +++++++--------- src/domain/Range.cs | 8 +++++++- src/domain/utility/IVisitor.cs | 30 ++++++++++++++++++++++++++++++ src/test/GasPlantSpecs.cs | 15 +++++++++++++++ 5 files changed, 61 insertions(+), 12 deletions(-) diff --git a/src/domain/EstimatedNetProductionFor.cs b/src/domain/EstimatedNetProductionFor.cs index 31b2bd0..c046351 100644 --- a/src/domain/EstimatedNetProductionFor.cs +++ b/src/domain/EstimatedNetProductionFor.cs @@ -2,7 +2,7 @@ namespace domain { using utility; - public class EstimatedNetProductionFor : IValueReturningVisitor where T : ICommodity, new() + public class EstimatedNetProductionFor : IValueReturningVisitor where Commodity : ICommodity, new() { Month month; IQuantity result; @@ -15,7 +15,7 @@ namespace domain public void Visit(IWell well) { - result = result.Plus(well.NetProductionFor(month)); + result = result.Plus(well.NetProductionFor(month)); } public IQuantity Result() diff --git a/src/domain/GasPlant.cs b/src/domain/GasPlant.cs index 42bd38b..3035edb 100644 --- a/src/domain/GasPlant.cs +++ b/src/domain/GasPlant.cs @@ -34,27 +34,25 @@ namespace domain public IEnumerable MonthsOverAvailableCapacity() { - return MonthsOverAvailableCapacity(Month.Now().UpTo(new Month(2099, 12))); + return MonthsOverAvailableCapacity(Month.Now().UpTo(Month.Infinity)); } - public virtual IQuantity AvailableCapacityFor(Month month){ - throw new System.NotImplementedException(); + public virtual IQuantity AvailableCapacityFor(Month month) + { + return capacity.AvailableFor(month); } public IEnumerable MonthsOverAvailableCapacity(IRange months) { - var results = new List(); - months.Accept(month => + return months.Collect( month => { - if(IsOverCapacity(month)) - results.Add(month); + return IsOverCapacity(month); }); - return results; } bool IsOverCapacity(Month month) { - return capacity.AvailableFor(month).IsGreaterThan(TotalProductionFor(month)); + return AvailableCapacityFor(month).IsGreaterThan(TotalProductionFor(month)); } IQuantity TotalProductionFor(Month month) diff --git a/src/domain/Range.cs b/src/domain/Range.cs index 97b37af..236c513 100644 --- a/src/domain/Range.cs +++ b/src/domain/Range.cs @@ -1,6 +1,7 @@ namespace domain { using System; + using utility; public static class Ranges { @@ -10,7 +11,7 @@ namespace domain } } - public interface IRange where T : IComparable + public interface IRange : IVisitable where T : IComparable { void Accept(Action action); bool Contains(T item); @@ -27,6 +28,11 @@ namespace domain this.end = end; } + public void Accept(IVisitor visitor) + { + Accept(visitor.Visit); + } + public void Accept(Action visitor) { var next = this.start; diff --git a/src/domain/utility/IVisitor.cs b/src/domain/utility/IVisitor.cs index 25a7bbc..b086042 100644 --- a/src/domain/utility/IVisitor.cs +++ b/src/domain/utility/IVisitor.cs @@ -1,5 +1,8 @@ namespace utility { + using System; + using System.Collections.Generic; + public interface IVisitor { void Visit(T item); @@ -9,10 +12,12 @@ namespace utility { void Accept(IVisitor visitor); } + public interface IValueReturningVisitor : IVisitor { TResult Result(); } + public static class Visiting { public static TResult AcceptAndReturnResultFrom(this IVisitable visitable, IValueReturningVisitor visitor) @@ -20,5 +25,30 @@ namespace utility visitable.Accept(visitor); return visitor.Result(); } + + public static IEnumerable Collect( this IVisitable visitable, Func predicate) + { + var results = new List(); + visitable.Accept(new AnonymousVisitor(item => + { + if(predicate(item)) results.Add(item); + })); + return results; + } + } + + public class AnonymousVisitor : IVisitor + { + Action visitor; + + public AnonymousVisitor(Action visitor) + { + this.visitor = visitor; + } + + public void Visit(T item) + { + visitor(item); + } } } diff --git a/src/test/GasPlantSpecs.cs b/src/test/GasPlantSpecs.cs index e9a74b0..fdf8fd0 100644 --- a/src/test/GasPlantSpecs.cs +++ b/src/test/GasPlantSpecs.cs @@ -44,5 +44,20 @@ namespace test static IWell firstWell; static IWell secondWell; } + public class when_retrieving_the_available_capacity_for_a_month + { + It should_return_the_correct_amount = () => + { + result.ShouldEqual(30m.MCF()); + }; + + Because of = () => + { + sut.IncreaseCapacityTo(30m.MCF(),Month.Now()); + result = sut.AvailableCapacityFor(Month.Now()); + }; + + static IQuantity result; + } } } -- cgit v1.2.3