-
-
Notifications
You must be signed in to change notification settings - Fork 26
/
group-names-sorter.ts
62 lines (56 loc) · 1.03 KB
/
group-names-sorter.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
const TW_MARCO_GROUP_ORDER = [
'sm',
'md',
'lg',
'xl',
'hover',
'focus',
'active',
'group-hover',
'group-focus',
'focus-within',
'focus-visible',
'motion-safe',
'motion-reduce',
'disabled',
'visited',
'checked',
'first',
'last',
'odd',
'even',
]
export default function groupNamesSorter<T>(
getName: (val: T) => string = val => (val as unknown) as string
) {
return (a, b) => {
const nameA = getName(a)
const nameB = getName(b)
const aSortIndex = TW_MARCO_GROUP_ORDER.findIndex(name => name === nameA)
const bSortIndex = TW_MARCO_GROUP_ORDER.findIndex(name => name === nameB)
if (aSortIndex !== -1 && bSortIndex === -1) {
// a found, b not found
return 1
}
if (aSortIndex === -1 && bSortIndex !== -1) {
// b found, a not found
return -1
}
if (aSortIndex !== -1 && bSortIndex !== -1) {
if (aSortIndex < bSortIndex) {
return -1
}
if (aSortIndex > bSortIndex) {
return 1
}
return 0
}
if (nameA < nameB) {
return -1
}
if (nameA > nameB) {
return 1
}
return 0
}
}