@SuppressWarnings("unchecked")
    public static <T> NFAFactory<T> compileFactory(
            final Pattern<T, ?> pattern, boolean timeoutHandling) {
        if (pattern == null) {
            // return a factory for empty NFAs
            return new NFAFactoryImpl<>(
                    0,
                    Collections.<String, Long>emptyMap(),
                    Collections.<State<T>>emptyList(),
                    timeoutHandling);
        } else {
            final NFAFactoryCompiler<T> nfaFactoryCompiler = new NFAFactoryCompiler<>(pattern);
            nfaFactoryCompiler.compileFactory();
            return new NFAFactoryImpl<>(
                    nfaFactoryCompiler.getWindowTime(),
                    nfaFactoryCompiler.getWindowTimes(),
                    nfaFactoryCompiler.getStates(),
                    timeoutHandling);
        }
    }
@Test
    public void testNoUnnecessaryStateCopiesCreated() {
        final Pattern<Event, Event> pattern =
                Pattern.<Event>begin("start")
                        .where(startFilter)
                        .notFollowedBy("not")
                        .where(startFilter)
                        .followedBy("oneOrMore")
                        .where(startFilter)
                        .oneOrMore()
                        .followedBy("end")
                        .where(endFilter);

        final NFACompiler.NFAFactoryCompiler<Event> nfaFactoryCompiler =
                new NFACompiler.NFAFactoryCompiler<>(pattern);
        nfaFactoryCompiler.compileFactory();

        int endStateCount = 0;
        for (State<Event> state : nfaFactoryCompiler.getStates()) {
            if (state.getName().equals("end")) {
                endStateCount++;
            }
        }

        assertEquals(1, endStateCount);
    }