Advertisement
Guest User

F# Supersim

a guest
Feb 14th, 2014
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 2.96 KB | None | 0 0
  1. type Item (name : string, price : float) =
  2.     member this.Price =
  3.         price;
  4.     member this.Name =
  5.         name;
  6.  
  7. type Customer (shoppingList : list<Item>, inBasket : list<Item>) =
  8.     member this.ShoppingList =
  9.         shoppingList;
  10.     member this.InBasket =
  11.         inBasket;
  12.     member this.Shop =
  13.         this.AddItem(shoppingList.Head);
  14.     member this.AddItem(item : Item) =
  15.         Customer(List.filter (fun (x:Item) -> x <> item) shoppingList, List.append inBasket [item]);
  16.     member this.BagItem(item : Item) =
  17.         Customer(shoppingList, List.filter (fun (x:Item) -> x <> item) inBasket);
  18.     member this.Done =
  19.         shoppingList.IsEmpty
  20.  
  21. type Checkout (customers : list<Customer>) =
  22.     member this.AddCustomer(customer : Customer) =
  23.         Checkout(List.append customers [customer]);
  24.     member this.Tick =
  25.         if customers.IsEmpty then
  26.             this
  27.         else
  28.             let currentCustomer = customers.Head;
  29.             if currentCustomer.InBasket.IsEmpty then
  30.                 Checkout(List.filter (fun (x:Customer) -> x <> currentCustomer) customers);
  31.             else
  32.                 let baggedCustomer = currentCustomer.BagItem currentCustomer.InBasket.Head;
  33.                 Checkout(List.append [baggedCustomer] (List.filter (fun (x:Customer) -> x <> currentCustomer) customers));
  34.  
  35. type Supermarket (checkouts : list<Checkout>, customers : list<Customer>) =
  36.     member this.Tick =
  37.         let tickedCustomers = List.map (fun (x:Customer) -> x.Shop) customers;
  38.         let tickedCheckouts = List.map (fun (x:Checkout) -> x.Tick) checkouts;
  39.         let doneCustomers = List.filter (fun (x:Customer) -> x.Done) tickedCustomers;
  40.         let notDoneCustomers = List.filter (fun (x:Customer) -> not x.Done) tickedCustomers;
  41.         let filledCheckouts = this.SendCustomersToCheckouts(doneCustomers, tickedCheckouts);
  42.         Supermarket(filledCheckouts, notDoneCustomers);
  43.  
  44.     member this.SendCustomersToCheckouts (doneCustomers : list<Customer>, readyCheckouts : list<Checkout>) =
  45.         let rec addHeadCustomer(customers : list<Customer>, checkouts : list<Checkout>) =
  46.             if customers.IsEmpty then
  47.                 checkouts
  48.             else
  49.                 let updatedCheckout = checkouts.Head.AddCustomer customers.Head;
  50.                 let updatedCheckoutList =
  51.                     List.append (List.filter (fun (x:Checkout) -> x <> checkouts.Head) checkouts) [updatedCheckout];
  52.                 addHeadCustomer(List.filter (fun (x:Customer) -> x <> customers.Head) customers, updatedCheckoutList);
  53.         addHeadCustomer(doneCustomers, readyCheckouts)
  54.  
  55. let rec simulate (supermarket : Supermarket) =
  56.     simulate supermarket.Tick;
  57.  
  58. let singleCustomerShoppingList = [Item("Fishycakes", 5.0); Item("Nommycakes", 7.0)];
  59. let singleCustomer = Customer(singleCustomerShoppingList, []);
  60. let singleCheckout = Checkout([]);
  61. let supermarket = Supermarket([singleCheckout], [singleCustomer]);
  62. simulate(supermarket);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement