public function test_demonstrate_state_monad($expectedProducts)
{
$initialState = new InMemoryCache([]);
list($result1, $outputState1) = S\runState(searchRelated('asia'), $initialState);
$this->assertEquals($expectedProducts, $result1);
list($result2, $outputState2) = S\runState(searchRelated('asia'), $outputState1);
$this->assertEquals($expectedProducts, $result2);
// After second computation, state shouldn't be modified
// Because we have item already in cache
$this->assertSame($outputState1, $outputState2);
}