Skip to content

Commit 4373cf2

Browse files
authored
Merge pull request #136 from apache/tweak-types
Tweak types
2 parents 4b05bd1 + 5875ed9 commit 4373cf2

File tree

4 files changed

+97
-53
lines changed

4 files changed

+97
-53
lines changed

packages/dom/src/range/match.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,11 @@ import { cartesian } from './cartesian.js';
9595
*
9696
* @public
9797
*/
98-
export function makeCreateRangeSelectorMatcher(
99-
createMatcher: <T extends Selector, TMatch extends Node | Range>(
98+
export function makeCreateRangeSelectorMatcher<T extends Selector>(
99+
createMatcher: <TMatch extends Node | Range>(
100100
selector: T,
101101
) => Matcher<Node | Range, TMatch>,
102-
): (selector: RangeSelector) => Matcher<Node | Range, Range> {
102+
): (selector: RangeSelector<T>) => Matcher<Node | Range, Range> {
103103
return function createRangeSelectorMatcher(selector) {
104104
const startMatcher = createMatcher(selector.startSelector);
105105
const endMatcher = createMatcher(selector.endSelector);

packages/selector/src/index.ts

Lines changed: 3 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -21,57 +21,13 @@
2121
* SPDX-License-Identifier: Apache-2.0
2222
*/
2323

24-
import type { Matcher, Selector } from './types.js';
25-
26-
export type { Matcher, Selector } from './types.js';
2724
export type {
25+
Matcher,
26+
Selector,
2827
CssSelector,
2928
RangeSelector,
3029
TextPositionSelector,
3130
TextQuoteSelector,
3231
} from './types.js';
3332
export * from './text/index.js';
34-
35-
/**
36-
* Wrap a matcher creation function so that it supports refinement of selection.
37-
*
38-
* See {@link https://www.w3.org/TR/2017/REC-annotation-model-20170223/#refinement-of-selection
39-
* | §4.2.9 Refinement of Selection} in the Web Annotation Data Model.
40-
*
41-
* @param matcherCreator - The function to wrap; it will be executed both for
42-
* {@link Selector}s passed to the returned wrapper function, and for any
43-
* refining Selector those might contain (and any refinement of that, etc.).
44-
*
45-
* @public
46-
*/
47-
export function makeRefinable<
48-
// Any subtype of Selector can be made refinable; but note we limit the value
49-
// of refinedBy because it must also be accepted by matcherCreator.
50-
TSelector extends Selector & { refinedBy?: TSelector },
51-
TScope,
52-
// To enable refinement, the implementation’s Match object must be usable as a
53-
// Scope object itself.
54-
TMatch extends TScope
55-
>(
56-
matcherCreator: (selector: TSelector) => Matcher<TScope, TMatch>,
57-
): (selector: TSelector) => Matcher<TScope, TMatch> {
58-
return function createMatcherWithRefinement(
59-
sourceSelector: TSelector,
60-
): Matcher<TScope, TMatch> {
61-
const matcher = matcherCreator(sourceSelector);
62-
63-
if (sourceSelector.refinedBy) {
64-
const refiningSelector = createMatcherWithRefinement(
65-
sourceSelector.refinedBy,
66-
);
67-
68-
return async function* matchAll(scope) {
69-
for await (const match of matcher(scope)) {
70-
yield* refiningSelector(match);
71-
}
72-
};
73-
}
74-
75-
return matcher;
76-
};
77-
}
33+
export * from './refinable.js';

packages/selector/src/refinable.ts

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
/**
2+
* @license
3+
* Licensed to the Apache Software Foundation (ASF) under one
4+
* or more contributor license agreements. See the NOTICE file
5+
* distributed with this work for additional information
6+
* regarding copyright ownership. The ASF licenses this file
7+
* to you under the Apache License, Version 2.0 (the
8+
* "License"); you may not use this file except in compliance
9+
* with the License. You may obtain a copy of the License at
10+
*
11+
* http://www.apache.org/licenses/LICENSE-2.0
12+
*
13+
* Unless required by applicable law or agreed to in writing,
14+
* software distributed under the License is distributed on an
15+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16+
* KIND, either express or implied. See the License for the
17+
* specific language governing permissions and limitations
18+
* under the License.
19+
*
20+
* SPDX-FileCopyrightText: The Apache Software Foundation
21+
* SPDX-License-Identifier: Apache-2.0
22+
*/
23+
24+
import type { Matcher, Selector } from './types.js';
25+
26+
/**
27+
* A Refinable selector can have the `refinedBy` attribute, whose value must be
28+
* of the same type (possibly again refined, recursively).
29+
*
30+
* See {@link https://www.w3.org/TR/2017/REC-annotation-model-20170223/#refinement-of-selection
31+
* | §4.2.9 Refinement of Selection} in the Web Annotation Data Model.
32+
*
33+
* @example
34+
* Example value of type `Refinable<CssSelector, TextQuoteSelector>`:
35+
*
36+
* {
37+
* type: "CssSelector",
38+
* …,
39+
* refinedBy: {
40+
* type: "TextQuoteSelector",
41+
* …,
42+
* refinedBy: { … }, // again either a CssSelector or TextQuoteSelector
43+
* }
44+
* }
45+
*/
46+
export type Refinable<T extends Selector> = T & { refinedBy?: Refinable<T> };
47+
48+
/**
49+
* Wrap a matcher creation function so that it supports refinement of selection.
50+
*
51+
* See {@link https://www.w3.org/TR/2017/REC-annotation-model-20170223/#refinement-of-selection
52+
* | §4.2.9 Refinement of Selection} in the Web Annotation Data Model.
53+
*
54+
* @param matcherCreator - The function to wrap; it will be executed both for
55+
* {@link Selector}s passed to the returned wrapper function, and for any
56+
* refining Selector those might contain (and any refinement of that, etc.).
57+
*
58+
* @public
59+
*/
60+
export function makeRefinable<
61+
TSelector extends Selector,
62+
TScope,
63+
// To enable refinement, the implementation’s Match object must be usable as a
64+
// Scope object itself.
65+
TMatch extends TScope
66+
>(
67+
matcherCreator: (selector: Refinable<TSelector>) => Matcher<TScope, TMatch>,
68+
): (selector: Refinable<TSelector>) => Matcher<TScope, TMatch> {
69+
return function createMatcherWithRefinement(
70+
sourceSelector: Refinable<TSelector>,
71+
): Matcher<TScope, TMatch> {
72+
const matcher = matcherCreator(sourceSelector);
73+
74+
if (sourceSelector.refinedBy) {
75+
const refiningSelector = createMatcherWithRefinement(
76+
sourceSelector.refinedBy,
77+
);
78+
79+
return async function* matchAll(scope) {
80+
for await (const match of matcher(scope)) {
81+
yield* refiningSelector(match);
82+
}
83+
};
84+
}
85+
86+
return matcher;
87+
};
88+
}

packages/selector/src/types.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,10 +91,10 @@ export interface TextPositionSelector extends Selector {
9191
*
9292
* @public
9393
*/
94-
export interface RangeSelector extends Selector {
94+
export interface RangeSelector<T extends Selector = Selector> extends Selector {
9595
type: 'RangeSelector';
96-
startSelector: Selector;
97-
endSelector: Selector;
96+
startSelector: T;
97+
endSelector: T;
9898
}
9999

100100
/**

0 commit comments

Comments
 (0)