Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public static class CartExtensions
- {
- public static Cart<TItem> Add<TItem>(this Cart<TItem> cart, TItem item)
- => cart.Match<Cart<TItem>, Cart<TItem>>()
- .With<EmptyCart<TItem>>(x => x.AddItem(item))
- .With<ActiveCart<TItem>>(x => x.AddItem(item))
- .With<PaidCart<TItem>>(x =>
- {
- Console.WriteLine("ERROR: The cart is paid for and items cannot be added");
- return x;
- })
- .Return();
- public static Cart<TItem> Remove<TItem>(this Cart<TItem> cart, TItem item)
- => cart.Match<Cart<TItem>, Cart<TItem>>()
- .With<EmptyCart<TItem>>(x =>
- {
- Console.WriteLine("ERROR: The cart is empty and items cannot be removed");
- return x;
- })
- .With<ActiveCart<TItem>>(x => x.RemoveItem(item))
- .With<PaidCart<TItem>>(x =>
- {
- Console.WriteLine("ERROR: The cart is paid for and items cannot be removed");
- return x;
- })
- .Return();
- public static void Display<TItem>(this Cart<TItem> cart)
- => cart.Match<Cart<TItem>, object>()
- .With<EmptyCart<TItem>>(x =>
- {
- Console.WriteLine("The cart is empty");
- return null;
- })
- .With<ActiveCart<TItem>>(x =>
- {
- Console.WriteLine("The active cart contains {0} items", x.Items.Count());
- return null;
- })
- .With<PaidCart<TItem>>(x =>
- {
- Console.WriteLine("The paid cart contains {0} items. Amount paid {1}");
- return null;
- })
- .Return();
- }
- static void Main(string[] args)
- {
- var emptyCart = new EmptyCart<string>();
- emptyCart.Display();
- var cartA = emptyCart.Add("A"); //one item
- emptyCart.Add("A").Display();
- var cartAb = cartA.Add("B"); //two items
- cartAb.Display();
- var cartB = cartAb.Remove("A"); //one item
- cartB.Display();
- var emptyCart2 = cartB.Remove("B"); //empty
- emptyCart2.Display();
- Console.WriteLine("Removing from emptyCart");
- emptyCart.Remove("B"); //error
- // try to pay for cartA
- Console.WriteLine("paying for cartA");
- var paidCart = cartA.Match<Cart<string>, Cart<string>>()
- .With<EmptyCart<string>>(x => x)
- .With<ActiveCart<string>>(x => x.Pay(100))
- .With<PaidCart<string>>(x => x)
- .Return();
- paidCart.Display();
- Console.WriteLine("paying for emptyCart");
- var emptyCartPaid = emptyCart.Match<Cart<string>, Cart<string>>()
- .With<EmptyCart<string>>(x => emptyCart)
- .With<ActiveCart<string>>(x => x.Pay(100))
- .With<PaidCart<string>>(x => emptyCart)
- .Return();
- emptyCartPaid.Display();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement