def showChars : Nat → String → String.Pos.Raw → IO Unit
| 0,     _, _   => pure ()
| n+1,   s, idx => do
  unless s.atEnd idx  do
    IO.println (">> " ++ toString (s.get idx)) *>
    showChars n s (s.next idx)

def main : IO UInt32 :=
let s₁             := "hello α_world_β";
let b : String.Pos.Raw := 0;
let e              := s₁.rawEndPos;
IO.println (s₁.extract b e) *>
IO.println (s₁.extract (b+ "  ") e) *>
IO.println (s₁.extract (b+ "  ") (e.unoffsetBy ⟨1⟩)) *>
IO.println (s₁.extract (b.offsetBy ⟨2⟩) (e.unoffsetBy ⟨2⟩)) *>
IO.println (s₁.extract (b.offsetBy ⟨7⟩) e) *>
IO.println (s₁.extract (b.offsetBy ⟨8⟩) e) *>
IO.println (toString e) *>
IO.println (repr "   aaa   ".trim) *>
showChars s₁.length s₁ 0  *>
IO.println ("abc".isPrefixOf "abcd") *>
IO.println ("abcd".isPrefixOf "abcd") *>
IO.println ("".isPrefixOf "abcd") *>
IO.println ("".isPrefixOf "") *>
IO.println ("ab".isPrefixOf "cb") *>
IO.println ("ab".isPrefixOf "a") *>
IO.println ("αb".isPrefixOf "αbc") *>
IO.println ("\x00a").length *>
pure 0
