@string-searching/specification
Version:
String searching specification for JavaScript
1 lines • 9.23 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","sources":["../src/Hit.js","../src/mock.js","../src/single.js","../src/StringSlice.js","../src/data.js"],"sourcesContent":["export default class Hit {\n\tconstructor(si, pattern, pi) {\n\t\tthis.si = si;\n\t\tthis.p = pattern;\n\t\tthis.pi = pi;\n\t}\n}\n","import assert from 'assert';\nimport StringSlice from './StringSlice.js';\nimport Hit from './Hit.js';\n\n/**\n * A brute-force string searching algorithm leveraging String#indexOf.\n *\n * @param {StringSlice} string\n * @param {Iterable<StringSlice>} patterns\n * @return {IterableIterator<Hit>}\n */\nexport default function* mock(string, patterns) {\n\tassert(string instanceof StringSlice);\n\tconst s = string.s.slice(string.i, string.j);\n\tfor (const pattern of patterns) {\n\t\tassert(pattern instanceof StringSlice);\n\t\tconst p = pattern.s.slice(pattern.i, pattern.j);\n\t\tlet fromIndex = 0;\n\t\twhile (true) {\n\t\t\tconst i = s.indexOf(p, fromIndex);\n\t\t\tif (i === -1) break;\n\t\t\tyield new Hit(string.i + i, pattern, pattern.i);\n\t\t\tif (fromIndex >= s.length) break;\n\t\t\tfromIndex = i + 1;\n\t\t}\n\t}\n}\n","const single = ({\n\ttest,\n\talgorithms,\n\tdata,\n\tskipEmptyString,\n\tskipEmptyPattern,\n}) => {\n\tfor (const algorithm of algorithms) {\n\t\tfor (const {string, patterns} of data) {\n\t\t\tif (string === '' && skipEmptyString) continue;\n\t\t\tfor (const {pattern, hits} of patterns) {\n\t\t\t\tif (pattern === '' && skipEmptyPattern) continue;\n\t\t\t\ttest(macro, algorithm, string, pattern, hits);\n\t\t\t}\n\t\t}\n\t}\n};\n\nexport default single;\n\nconst macro = (t, algorithm, s, p, hits) => {\n\tconst name = algorithm.name;\n\n\tconst si = 0;\n\tconst sj = s.length;\n\tconst pi = 0;\n\tconst pj = p.length;\n\n\tlet k = 0;\n\tfor (const i of algorithm(s, si, sj, p, pi, pj)) {\n\t\tif (k < hits.length) {\n\t\t\tt.is(i, hits[k], `${name} > begin of '${p}' in '${s}'`);\n\t\t\t++k;\n\t\t} else {\n\t\t\t++k;\n\t\t\tt.fail(\n\t\t\t\t`\"${name} > (${i}) callback called ${k} times for '${p}' in '${s}'`,\n\t\t\t);\n\t\t}\n\t}\n\n\tt.is(k, hits.length, `${name} > check number of hits for '${p}' in '${s}'`);\n};\n\nmacro.title = (title, algorithm, string, pattern, hits) =>\n\ttitle ??\n\t`${algorithm.name}('${string}', '${pattern}') hits ${JSON.stringify(hits)}`;\n","export default class StringSlice {\n\tconstructor(s, i, j) {\n\t\tthis.s = s;\n\t\tthis.i = i;\n\t\tthis.j = j;\n\t}\n}\n","const data = [\n\t{\n\t\tstring: '',\n\t\tpatterns: [\n\t\t\t{\n\t\t\t\tpattern: '',\n\t\t\t\thits: [0],\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: 'abcd',\n\t\t\t\thits: [],\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tstring: 'abcd',\n\t\tpatterns: [\n\t\t\t{\n\t\t\t\tpattern: '',\n\t\t\t\thits: [0, 1, 2, 3, 4],\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: 'a',\n\t\t\t\thits: [0],\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: 'b',\n\t\t\t\thits: [1],\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: 'c',\n\t\t\t\thits: [2],\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: 'd',\n\t\t\t\thits: [3],\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: 'abcde',\n\t\t\t\thits: [],\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: 'abcd',\n\t\t\t\thits: [0],\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: 'ab',\n\t\t\t\thits: [0],\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: 'bc',\n\t\t\t\thits: [1],\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: 'cd',\n\t\t\t\thits: [2],\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: 'abc',\n\t\t\t\thits: [0],\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: 'bcd',\n\t\t\t\thits: [1],\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: 'dcba',\n\t\t\t\thits: [],\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: 'xyz',\n\t\t\t\thits: [],\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tstring: 'abcdbdbc',\n\t\tpatterns: [\n\t\t\t{\n\t\t\t\tpattern: 'bc',\n\t\t\t\thits: [1, 6],\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tstring: 'abcdbdbcazertyuiopqsdfghjklmwxcvbn',\n\t\tpatterns: [\n\t\t\t{\n\t\t\t\tpattern: 'bc',\n\t\t\t\thits: [1, 6],\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tstring:\n\t\t\t'Some books are to be tasted, others to be swallowed, and some few to be chewed and digested.',\n\t\tpatterns: [\n\t\t\t{\n\t\t\t\tpattern: 'to',\n\t\t\t\thits: [15, 36, 66],\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tstring: 'aaaaaaaaab',\n\t\tpatterns: [\n\t\t\t{\n\t\t\t\tpattern: 'aaaab',\n\t\t\t\thits: [5],\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tstring: 'aaaaaaaaaab',\n\t\tpatterns: [\n\t\t\t{\n\t\t\t\tpattern: 'aaa',\n\t\t\t\thits: [0, 1, 2, 3, 4, 5, 6, 7],\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tstring: 'tototo',\n\t\tpatterns: [\n\t\t\t{\n\t\t\t\tpattern: 'to',\n\t\t\t\thits: [0, 2, 4],\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tstring: 'aaaa',\n\t\tpatterns: [\n\t\t\t{\n\t\t\t\tpattern: 'a',\n\t\t\t\thits: [0, 1, 2, 3],\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: 'aa',\n\t\t\t\thits: [0, 1, 2],\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: 'aaa',\n\t\t\t\thits: [0, 1],\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: 'aaaa',\n\t\t\t\thits: [0],\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tstring: 'aaaaa',\n\t\tpatterns: [\n\t\t\t{\n\t\t\t\tpattern: 'aa',\n\t\t\t\thits: [0, 1, 2, 3],\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tstring: 'xyyzxxyxzzzxyxyxxyzxyzxzxyxyzz',\n\t\tpatterns: [\n\t\t\t{\n\t\t\t\tpattern: 'xyz',\n\t\t\t\thits: [16, 19, 26],\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: 'zz',\n\t\t\t\thits: [8, 9, 28],\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: 'xyx',\n\t\t\t\thits: [5, 11, 13, 24],\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tstring: 'ABC ABCDAB ABCDABCDABDE',\n\t\tpatterns: [\n\t\t\t{\n\t\t\t\tpattern: 'ABCDABD',\n\t\t\t\thits: [15],\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tstring: 'ABCABCDABABCDABCDABDE',\n\t\tpatterns: [\n\t\t\t{\n\t\t\t\tpattern: 'ABCDABD',\n\t\t\t\thits: [13],\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: 'ABCDAB',\n\t\t\t\thits: [3, 9, 13],\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: 'ABCABC',\n\t\t\t\thits: [0],\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: 'ABC',\n\t\t\t\thits: [0, 3, 9, 13],\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: 'ABD',\n\t\t\t\thits: [17],\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tstring: 'babcbabcabcaabcabcabcacabc',\n\t\tpatterns: [\n\t\t\t{\n\t\t\t\tpattern: 'abcabcacab',\n\t\t\t\thits: [15],\n\t\t\t},\n\t\t],\n\t},\n];\n\nexport default data;\n"],"names":["Hit","si","pattern","pi","this","p","mock","string","patterns","s","slice","i","j","fromIndex","indexOf","length","_context","macro","t","algorithm","hits","name","k","is","fail","title","JSON","stringify","test","data","skipEmptyString","skipEmptyPattern","algorithms"],"mappings":"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"}