Skip to content

Create tags automatically when invoked#5

Open
krispya wants to merge 1 commit intomainfrom
feat/auto-tags
Open

Create tags automatically when invoked#5
krispya wants to merge 1 commit intomainfrom
feat/auto-tags

Conversation

@krispya
Copy link
Member

@krispya krispya commented May 30, 2024

This is a simple PR that creates a tag if it is not found instead of erroring, making createTag unnecessary to call. This reduces the boilerplate on all the tag tests in alignment with how I expect to use it.

test('schedule a runnable with tag', () => {
    const group1 = Symbol();
    const schedule = create();

    // This call is no longer necessary
    // createTag(schedule, group1);

    add(schedule, aFn, tag(group1), id('A'));
    add(schedule, bFn, after('A'), tag(group1), id('B'));

    run(schedule, {});

    expect(aFn).toBeCalledTimes(1);
    expect(bFn).toBeCalledTimes(1);

    expect(order).toEqual(['A', 'B']);
});

Similarly, scheduling tags with each other no longer becomes necessary. It can be inherited, for lack of a better word, from scheduling the runnable itself.

// This boilerplate becomes...
test('schedule a tag before or after another tag', () => {
    const group1 = Symbol();
    const group2 = Symbol();
    const group3 = Symbol();

    const schedule = create();

    createTag(schedule, group1);
    createTag(schedule, group2, before(group1));
    createTag(schedule, group3, after(group1));

    add(schedule, aFn, tag(group1), id('A'));
    add(schedule, bFn, tag(group2), id('B'));
    add(schedule, cFn, tag(group3), id('C'));

    run(schedule, {});

    expect(aFn).toBeCalledTimes(1);
    expect(bFn).toBeCalledTimes(1);
    expect(cFn).toBeCalledTimes(1);

    expect(order).toEqual(['B', 'A', 'C']);
});

// This
test('schedule a tag before or after another tag', () => {
    const group1 = Symbol();
    const group2 = Symbol();
    const group3 = Symbol();

    const schedule = create();

    add(schedule, aFn, tag(group1), id('A'));
    add(schedule, bFn, tag(group2), id('B'), before(group1));
    add(schedule, cFn, tag(group3), id('C'), after(group1));

    run(schedule, {});

    expect(aFn).toBeCalledTimes(1);
    expect(bFn).toBeCalledTimes(1);
    expect(cFn).toBeCalledTimes(1);

    expect(order).toEqual(['B', 'A', 'C']);
});

To determine would be how "inheriting" dependencies works for tags. We will need to come up with more complicated tests for this. The way I see it is that tags are empty until they get a runnable and runnables themselves have dependencies. The tag then is a way to describe a collection of runnables with "before" meaning "before the first tagged runnable in the sort" and "after" meaning "after the last tagged runnable in the sort".

This was referenced May 30, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant