Category talk:Wren-trait: Difference between revisions

Content added Content deleted
(→‎Source code: Added a further property.)
(→‎Source code: Added Indexed and SeqEntry classes.)
Line 46: Line 46:


// Ensures a range is ascending before passing it to the constructor.
// Ensures a range is ascending before passing it to the constructor.
// If it isn't, returns an empty range. Useful when bounds are variable.
// It it isn't, returns an empty range. Useful when bounds are variable.
static ascend(range, step) {
static ascend(range, step) {
if (!(range is Range)) Fiber.abort("First argument must be a range.")
if (!(range is Range)) Fiber.abort("First argument must be a range.")
Line 53: Line 53:


// Ensures a range is descending before passing it to the constructor.
// Ensures a range is descending before passing it to the constructor.
// If it isn't, returns an empty range. Useful when bounds are variable.
// It it isn't, returns an empty range. Useful when bounds are variable.
static descend(range, step) {
static descend(range, step) {
if (!(range is Range)) Fiber.abort("First argument must be a range.")
if (!(range is Range)) Fiber.abort("First argument must be a range.")
Line 111: Line 111:


iteratorValue(iterator) { _seq.iteratorValue(iterator) }
iteratorValue(iterator) { _seq.iteratorValue(iterator) }
}

/* SeqEntry represents an (index, value) pair for use with the Indexed class. */
class SeqEntry {
// Constructs a new SeqEntry object.
construct new(index, value) {
_index = index
_value = value
}

// Properties.
index { _index }
value { _value }

// Returns the current instance's string representation.
toString { "%(_index):%(_value)" }
}

/*
Indexed wraps a Sequence (other than a range) so its elements can be iterated over
together with their zero-based indices.
*/
class Indexed is Sequence {
// Constructs a new indexed sequence with a step of 'step' and optionally reversed.
construct new(seq, step, reversed) {
if (seq is Range) Fiber.abort("First argument cannot be a range.")
if (!(reversed is Bool)) Fiber.abort("Third argument must be true or false.")
_seq = !reversed ? Stepped.new(seq, step) : Reversed.new(seq, step)
}

// Constructs a new indexed sequence with a step of 'step' and 'reversed' set to false.
static new(seq, step) { new(seq, step, false) }

// Constructs a new indexed sequence with a step of 1.
construct new(seq) {
if (!(seq is Sequence) || seq is Range) {
Fiber.abort("Argument must be a sequence other than a range.")
}
_seq = seq
}

// Iterator protocol methods.
iterate(iterator) { _seq.iterate(iterator) }

iteratorValue(iterator) {
return SeqEntry.new(iterator, _seq.iteratorValue(iterator))
}
}
}


Line 176: Line 223:
var Trait_Stepped = Stepped
var Trait_Stepped = Stepped
var Trait_Reversed = Reversed
var Trait_Reversed = Reversed
var Trait_ByRef = ByRef</lang>
var Trait_SeqEntry = SeqEntry
var Trait_Indexed = Indexed
var Trait_ByRef = ByRef
var Trait_ByKey = ByKey</lang>