Back to Simulation of an automaton
#ifndef PASTELSYS_AUTOMATON_SIMULATION_HPP
#define PASTELSYS_AUTOMATON_SIMULATION_HPP
#include "pastel/sys/automaton_simulation.h"
#include <algorithm>
namespace Pastel
{
    template <
        typename Symbol,
        typename StateData,
        typename TransitionData,
        typename Customization,
        typename StateSet,
        typename Insert_State>
    StateSet simulateAutomatonWithoutEpsilonClosure(
        const Automaton<Symbol, StateData, TransitionData, Customization>& automaton,
        const Optional<Symbol>& symbol,
        const StateSet& emptySet,
        const StateSet& stateSet,
        const Insert_State& insert)
    {
        typedef Automaton<Symbol, StateData, TransitionData, Customization> 
            Automaton;
        typedef typename Automaton::State_ConstIterator
            State_ConstIterator;
        typedef typename Automaton::Transition_ConstIterator
            Transition_ConstIterator;
        StateSet toStateSet(emptySet);
        // Find out the state-sets which are produced
        // by following the transitions with the given symbol
        // for each state.
        std::for_each(
            stateSet.cbegin(), stateSet.cend(),
            [&](const State_ConstIterator& state)
        {
            auto branchRange = automaton.cBranchRange(
                state, symbol);
            std::for_each(
                branchRange.begin(),
                branchRange.end(),
                [&](const Transition_ConstIterator& transition)
            {
                insert(transition->to(), toStateSet);
            });
        });
        return toStateSet;
    }
}
#endif