package fj.demo;
import fj.data.List;
import fj.data.State;
import static fj.demo.StateDemo_VendingMachine.Input.COIN;
import static fj.demo.StateDemo_VendingMachine.Input.TURN;
/**
* Created by MarkPerry on 20/07/2014.
*/
public class StateDemo_VendingMachine {
public enum Input { COIN, TURN }
public static class VendingMachine {
private boolean locked;
private int items;
private int coins;
public VendingMachine(boolean lock, int things, int numCoins) {
locked = lock;
items = things;
coins = numCoins;
}
/**
* Equals generated by Intellij
*/
@Override
public final boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
VendingMachine that = (VendingMachine) o;
if (coins != that.coins) return false;
if (items != that.items) return false;
if (locked != that.locked) return false;
return true;
}
/**
* HashCode generated by Intellij
*/
@Override
public final int hashCode() {
int result = locked ? 1 : 0;
result = 31 * result + items;
result = 31 * result + coins;
return result;
}
public final String toString() {
return String.format("VendingMachine(locked=%b,items=%d,coins=%d)", locked, items, coins);
}
final VendingMachine next(Input i) {
if (items == 0) {
return this;
} else if (i == COIN && !locked) {
return this;
} else if (i == TURN && locked) {
return this;
} else if (i == COIN && locked) {
return new VendingMachine(false, items, coins + 1);
} else if (i == TURN && !locked) {
return new VendingMachine(true, items - 1, coins);
} else {
return this;
}
}
}
static State<VendingMachine, VendingMachine> simulate(List<Input> list) {
return list.foldLeft((s, i) -> s.map(m -> m.next(i)), State.init());
}
static void test() {
State<VendingMachine, VendingMachine> s = simulate(List.list(COIN, TURN, TURN, COIN, COIN, TURN));
VendingMachine m = s.eval(new VendingMachine(true, 5, 0));
System.out.println(s.run(new VendingMachine(true, 5, 0)));
VendingMachine oracle = new VendingMachine(true, 3, 2);
System.out.printf("m1: %s, oracle: %s, equals: %b", m, oracle, m.equals(oracle));
}
public static void main(String args[]) {
test();
}
}