record perseq(pre, rep)

procedure repeater(seq, ratio, limit)		#: find repeat in sequence
   local init, i, prefix, results, segment, span

   /ratio := 2
   /limit := 0.75

   results := copy(seq)

   prefix := []

   repeat {
      span := *results / ratio
      every i := 1 to span do {
         segment := results[1+:i] | next
         if lequiv(lextend(segment, *results), results) then
            return perseq(prefix, segment)
         }
      put(prefix, get(results)) |		# first term to prefix
         return perseq(prefix, results)
      if *prefix > limit * *seq then return perseq(seq, [])
      }

end