<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><meta content="text/html;charset=UTF-8" http-equiv="Content-Type"></head><body ><div style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10pt;"><div>Here is a stab of Eliot's approach...<br></div><div><br></div><div><br></div><div><blockquote style="border: 1px solid rgb(204, 204, 204); padding: 7px; background-color: rgb(245, 245, 245);"><div style="color: rgb(0, 0, 0); font-family: "Lato 2", sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;" class="x_-470843493gmail_default"><span class="size" style="font-size:18px">Oops.  I meant of course</span><br></div><div style="color: rgb(0, 0, 0); font-family: "Lato 2", sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;" class="x_-470843493gmail_quote"><span class="size" style="font-size:18px">| patterns first second Firsts Seconds |<br>patterns :=  #('{|' '|-' '|}' '{{' '}}' '[[' ']]' '__' '==' '::' '**' '##' '''').</span></div><div style="color: rgb(0, 0, 0); font-family: "Lato 2", sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;" class="x_-470843493gmail_quote"><span class="size" style="font-size:18px">Firsts ifNil:<br><span class="x_-470843493gmail_default">   </span>[Firsts :=<span> </span><span class="x_-470843493gmail_default">(</span>(patter<span class="x_-470843493gmail_default">n</span>s collect: #first) as:<span> </span><span class="x_-470843493gmail_default">Set) as:<span> </span></span>String.<br><span class="x_-470843493gmail_default">   <span class="x_-470843493gmail-Apple-converted-space"> </span></span>Seconds  := (<span class="x_-470843493gmail_default">(</span>patterns collect: #second) as:<span> </span><span class="x_-470843493gmail_default">Set) as:<span> </span></span>String].<br>self size >= 2<br>and: [(Firsts includes: (first := self first))<br>and: [(Seconds includes: (second := sef second)</span></div><div style="color: rgb(0, 0, 0); font-family: "Lato 2", sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;" class="x_-470843493gmail_default"><span class="size" style="font-size:18px"><span style="color: rgb(0, 0, 0);">and: [patterns includes: (ByteString with: first with: second)]]]</span></span><br></div></blockquote><br></div><div><br></div><div><br></div><div> adapted towards a workspace.<br></div><div><br></div><div><br></div><div><blockquote style="border: 1px solid rgb(204, 204, 204); padding: 7px; background-color: rgb(245, 245, 245);"><div>| ios patterns firsts seconds|<br></div><div>ios := ReadStream on: 'Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...|-'.<br></div><div>patterns :=  #('{|' '|-' '|}' '{{' '}}' '[[' ']]' '__' '==' '::' '**' '##' '''''').<br></div><div>firsts := ((patterns collect: #first) as: Set).<br></div><div>seconds  := ((patterns collect: #second) as: Set).<br></div><div>[(ios size >= 2) & (ios peek notNil) ]<br></div><div>      whileTrue:[<br></div><div>            ((firsts includes: (first := ios next))<br></div><div>              and: [(seconds includes: (second := ios peek))]<br></div><div>              and: [patterns includes: (ByteString with: first with: second)])<br></div><div>                        ifTrue:[^true]]<br></div></blockquote>cordially</div><div><br></div></div><br></body></html>