summaryrefslogtreecommitdiff
path: root/ipl/packs/idol/sequence.iol
blob: 87bc2b722f23b093a67d72d8adbe3f4fa0a38b0a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
procedure sequence(bounds[ ])
  return Sequence(bounds)
end

class Sequence(bounds,indices)
  method max(i)
    elem := self.bounds[i]
    return (type(elem)== "integer",elem) | *elem-1
  end
  method elem(i)
    elem := self.bounds[i]
    return (type(elem)== "integer",self.indices[i]) | elem[self.indices[i]+1]
  end
  method activate()
    top := *(self.indices)
    if self.indices[1] > self$max(1) then fail
    s := ""
    every i := 1 to top do {
      s ||:= self$elem(i)
    }
    repeat {
       self.indices[top] +:= 1
       if top=1 | (self.indices[top] <= self$max(top)) then break
       self.indices[top] := 0
       top -:= 1
    }
    return s
  end
initially
  / (self.indices) := list(*self.bounds,0)
end