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. |
||
// |
// 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. |
||
// |
// 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 |
var Trait_SeqEntry = SeqEntry |
||
var Trait_Indexed = Indexed |
|||
var Trait_ByRef = ByRef |
|||
var Trait_ByKey = ByKey</lang> |