@@ -0,0 +1,271 @@
6+++ search-text-chars "*abcdefghilmnoprstuvwxyz"
12+++ prefixes ^~ (trip-syls sis:po)
13+++ suffixes ^~ (trip-syls dex:po)
14+++ full-opts ^~ (gulf .~zod .~fes)
15+++ sanitize-search-text
20+ !=(~ (find [a]~ search-text-chars))
21++$ pfsf ?(%prefix %suffix)
24++$ search-syls (list syl) :: in reverse order, e.g. ["net" "pal" "pel" "sam" ~]. length 1-4
25++$ search-syl-opts (list @q)
26++$ search-opts (list search-syl-opts) :: must have length 4
32++$ mr-search :: maybe reversed full search
37+++ search-syl-to-search-syl-opts
41+ ?: =(%prefix pfsf.search) prefixes suffixes
42+ ?: =(tape.search "***") full-opts
45+ ?. (tape-matches tape.search cand) ~
46+ %- ?: =(%prefix pfsf.search) ins:po ind:po
48+++ search-text-to-search-syls
51+ =. search-text (sanitize-search-text search-text)
55+ (rip [0 24] (crip search-text)) :: jet doesn't support rip [3 3] which is equivalent
61+ ?: =(0 (mod count 2)) %suffix %prefix
63+ :- [i.syl-tapes pfsf]
64+ $(syl-tapes t.syl-tapes, count +(count))
66+++ search-syls-to-search-opts
73+ (search-syl-to-search-syl-opts syl)
75+ |= syl-opts=search-syl-opts
79+ ?: (gte (lent opts) 4)
81+ $(opts (snoc (search-opts opts) (search-syl-opts ~[.~zod])))
83+++ search-text-to-full
86+ =/ =search-syls (search-text-to-search-syls search-text)
88+ (search-syls-to-search-opts search-syls)
90+++ expand-search-text-to-len
91+ |= [search=tape flen=@ud rotate=?]
92+ =. search (sanitize-search-text search)
95+ =+ slen=(lent search)
100+ (weld search (reap (sub flen slen) '*'))
102+ $(search (weld "*" search))
104+++ expand-search-text
107+ =. search (sanitize-search-text search)
111+ !(levy (tape search) (cury test '*')) :: is all wild
113+ =/ expand (cury expand-search-text-to-len search)
120+++ search-text-to-fulls
122+ ^- (list search-full)
123+ =/ texts (expand-search-text search)
127+ =/ full (search-text-to-full text)
128+ ?: =(~[~ ~ ~ ~] search-opts.full)
131+++ reverse-list :: that is, put first 2 in back "abcd" -> "cdab"
140+ =/ padding (search-text-to-search-syls "dozzoddozzod")
143+ (slag (lent search-syls) padding)
145+ |= search=search-full
147+ :- (reverse-list (pad-search-syls search-syls.search))
148+ (reverse-list search-opts.search)
149+++ estimate-search-pain
150+ |= search=search-full
151+ =/ opts search-opts.search
156+ (add (mul acc 2) (lent i.opts))
157+ $(acc new-acc, opts t.opts)
158+:: ++ estimate-search-pain
159+:: |= search=search-full
160+:: =/ max-pain (bex 32)
161+:: =/ opts search-opts.search
165+:: =/ level-pain (div (mul max-pain (lent i.opts)) 256)
167+:: (add (mul acc 2) (lent i.opts))
168+:: $(acc new-acc, opts t.opts)
169+++ estimate-search-text-pain
171+ (estimate-search-pain (search-text-to-full search-text))
172+++ maybe-reverse-search
173+ |= [search=search-full]
175+ =/ search-pain (estimate-search-pain search)
176+ =/ rsearch (reverse-search search)
177+ =/ rsearch-pain (estimate-search-pain rsearch)
178+ ?: (gth search-pain rsearch-pain)
179+ [[%.y rsearch-pain] rsearch]
180+ [[%.n search-pain] search]
182+++ maybe-reverse-searches
183+ |= [searches=(list search-full) pain-thresh=@]
188+ =/ mr (maybe-reverse-search i.searches)
189+ =/ new-pain (add pain pain.mr)
190+ ?: (gth new-pain pain-thresh)
191+ $(searches t.searches)
193+ $(searches t.searches, pain new-pain)
196+ |= [search=tape cand=tape]
201+ ?: |(=(i.search i.cand) =(i.search '*'))
202+ $(search t.search, cand t.cand)
206+ %- ?:(=(%prefix pfsf) tos:po tod:po)
210+ =((crip tape.syl) (tosd cand pfsf.syl))
213+ :: todo check cand < 256
214+ (tape-matches tape.syl (trip (tosd cand pfsf.syl)))
216+ |= [search=search-syls cand-atom=@]
217+ =/ cand (rip 3 cand-atom)
221+ :: =? cand =(cand ~)
224+ ?& (syl-equals i.search 0)
227+ :: =/ nncand ^- (lest @)
228+ :: ?~ cand ~[0] cand
229+ ?& (syl-matches i.search i.cand)
230+ $(search t.search, cand t.cand)
234+ |= [lb=@ rb=@ opts=(list @)]
239+ &((lte lb a) (gte rb a))
241+++ range-contains-search
242+ |= [lb=@ rb=@ search=search-opts] :: includes lb and rb - [lb, rb]
243+ ^- [opts=search-opts contains=?]
249+ =/ cand-0 (opts-in-range lb-0 rb-0 s-0)
250+ =/ cand-0-len (lent cand-0)
251+ :: ~& "lb: {<`@q`lb>} rb: {<`@q`rb>} cand-len: {<cand-0-len>}"
252+ ?: =(0 cand-0-len) `%.n
255+ ?: (gte cand-0-len 3) %.y :: entire valid galaxy is bounded
256+ =/ lb-clean =(0 (rsh 3 lb)) :: lb is galaxy
257+ =/ rb-clean =(0 (rsh 3 (add-d rb 1))) :: rb is last planet in galaxy
258+ ?: &(=(2 cand-0-len) |(lb-clean rb-clean))
259+ %.y :: two galaxies, and one is right on the edge (fully bounded)
263+ =/ crb (add .~fipfes-fipzod i.cand-0)
264+ =/ slb (rev-q (rev-f max lb i.cand-0))
265+ =/ srb (rev-q (rev-f min rb crb))
266+ =/ sub-contains +:^$(lb (rsh 3 slb), rb (rsh 3 srb), search t.search)