rename structs to be less specific about underlying types
keep track of how many ways to reach each exit states