(defun all-positions (item sequence &rest args &key from-end (start 0) end key
test test-not)
(declare (ignore from-end start end key test test-not))
(loop for i = (apply #'position item sequence args)
while i
collect i
do (setf (getf args :start) (1+ i))))
(defun split-by-positions (sequence positions)
(when (or (null positions)
(> (first positions) 0))
(push 0 positions))
(loop for (start end) on positions
collect (subseq sequence start end)))
(dolist (s '("OFOFOFFOFOFFOFOFF"
"FOO"
"BAR"
"O"
""))
(format t "~S~%" (split-by-positions s (all-positions #\O s)))
(assert (equal (apply #'concatenate
(type-of s)
(split-by-positions s (all-positions #\O s)))
s)))
KGRlZnVuIGFsbC1wb3NpdGlvbnMgKGl0ZW0gc2VxdWVuY2UgJnJlc3QgYXJncyAma2V5IGZyb20tZW5kIChzdGFydCAwKSBlbmQga2V5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0IHRlc3Qtbm90KQogIChkZWNsYXJlIChpZ25vcmUgZnJvbS1lbmQgc3RhcnQgZW5kIGtleSB0ZXN0IHRlc3Qtbm90KSkKICAobG9vcCBmb3IgaSA9IChhcHBseSAjJ3Bvc2l0aW9uIGl0ZW0gc2VxdWVuY2UgYXJncykKICAgICAgICB3aGlsZSBpCiAgICAgICAgY29sbGVjdCBpCiAgICAgICAgZG8gKHNldGYgKGdldGYgYXJncyA6c3RhcnQpICgxKyBpKSkpKQoKKGRlZnVuIHNwbGl0LWJ5LXBvc2l0aW9ucyAoc2VxdWVuY2UgcG9zaXRpb25zKQogICh3aGVuIChvciAobnVsbCBwb3NpdGlvbnMpCiAgICAgICAgICAgICg+IChmaXJzdCBwb3NpdGlvbnMpIDApKQogICAgKHB1c2ggMCBwb3NpdGlvbnMpKQogIChsb29wIGZvciAoc3RhcnQgZW5kKSBvbiBwb3NpdGlvbnMKICAgICAgICBjb2xsZWN0IChzdWJzZXEgc2VxdWVuY2Ugc3RhcnQgZW5kKSkpCgooZG9saXN0IChzICcoIk9GT0ZPRkZPRk9GRk9GT0ZGIgogICAgICAgICAgICAgIkZPTyIKICAgICAgICAgICAgICJCQVIiCiAgICAgICAgICAgICAiTyIKICAgICAgICAgICAgICIiKSkKICAoZm9ybWF0IHQgIn5TfiUiIChzcGxpdC1ieS1wb3NpdGlvbnMgcyAoYWxsLXBvc2l0aW9ucyAjXE8gcykpKQogIChhc3NlcnQgKGVxdWFsIChhcHBseSAjJ2NvbmNhdGVuYXRlCiAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlLW9mIHMpCiAgICAgICAgICAgICAgICAgICAgICAgIChzcGxpdC1ieS1wb3NpdGlvbnMgcyAoYWxsLXBvc2l0aW9ucyAjXE8gcykpKQogICAgICAgICAgICAgICAgIHMpKSkK