code: def stem(self, p, metadata=None):
          
          # TODO: removed i and j from the original implementation
          # to comply with the `token.update` API
          i = 0
          j = len(p) - 1
          # copy the parameters into statics
          self.b = p
          self.k = j
          self.k0 = i
          if self.k <= self.k0 + 1:
              return self.b  # --DEPARTURE--
  
          # With this line, strings of length 1 or 2 don't go through the
          # stemming process, although no mention is made of this in the
          # published algorithm. Remove the line to match the published
          # algorithm.
  
          self.step1ab()
          self.step1c()
          self.step2()
          self.step3()
          self.step4()
          self.step5()
          return self.b[self.k0 : self.k + 1]
docs: In stem(p,i,j), p is a char pointer, and the string to be stemmed
          is from p[i] to p[j] inclusive. Typically i is zero and j is the
          offset to the last character of a string, (p[j+1] == '\0'). The
          stemmer adjusts the characters p[i] ... p[j] and returns the new
          end-point of the string, k. Stemming never increases word length, so
          i <= k <= j. To turn the stemmer into a module, declare 'stem' as
          extern, and delete the remainder of this file.