import { createIdentifier } from '@blocksuite/global/di'; import type { DataSource } from '../data-source/base.js'; import { Matcher_ } from '../logical/matcher.js'; import { groupByMatchers } from './define.js'; import type { GroupByConfig } from './types.js'; export const createGroupByMatcher = (list: GroupByConfig[]) => { return new Matcher_(list, v => v.matchType); }; export class GroupByService { constructor(private readonly dataSource: DataSource) {} allExternalGroupByConfig(): GroupByConfig[] { return Array.from( this.dataSource.provider.getAll(ExternalGroupByConfigProvider).values() ); } get matcher() { return createGroupByMatcher([ ...this.allExternalGroupByConfig(), ...groupByMatchers, ]); } } export const GroupByProvider = createIdentifier('group-by-service'); export const getGroupByService = (dataSource: DataSource) => { return dataSource.serviceGetOrCreate( GroupByProvider, () => new GroupByService(dataSource) ); }; export const ExternalGroupByConfigProvider = createIdentifier( 'external-group-by-config' );