0.8.4: stadlib in Lyng! added universal Iterable functions
This commit is contained in:
1 parent
f9198fe583
commit
3948283481
15 files changed
+338
-15
No files matched your search
+16
-1
@@ -17,7 +17,14 @@ Iterator itself is a simple interface that should provide only to method:
|
||||
|
||||
Just remember at this stage typed declarations are not yet supported.
|
||||
|
||||
Having `Iterable` in base classes allows to use it in for loop. Also, each `Iterable` has some utility functions available:
|
||||
Having `Iterable` in base classes allows to use it in for loop. Also, each `Iterable` has some utility functions available, for example
|
||||
|
||||
val r = 1..10 // Range is Iterable!
|
||||
assertEquals( [9,10] r.takeLast(2) )
|
||||
assertEquals( [1,2,3] r.take(3) )
|
||||
assertEquals( [9,10] r.drop(8) )
|
||||
assertEquals( [1,2] r.dropLast(8) )
|
||||
>>> void
|
||||
|
||||
## Instance methods
|
||||
|
||||
@@ -33,7 +40,15 @@ Having `Iterable` in base classes allows to use it in for loop. Also, each `Iter
|
||||
| map(f) | create a list of values returned by `f` called for each element of the iterable |
|
||||
| indexOf(i) | return index if the first encounter of i or a negative value if not found |
|
||||
| associateBy(kf) | create a map where keys are returned by kf that will be called for each element |
|
||||
| first | first element (1) |
|
||||
| last | last element (1) |
|
||||
| take(n) | return [Iterable] of up to n first elements |
|
||||
| taleLast(n) | return [Iterable] of up to n last elements |
|
||||
| drop(n) | return new [Iterable] without first n elements |
|
||||
| dropLast(n) | return new [Iterable] without last n elements |
|
||||
|
||||
(1)
|
||||
: throws `NoSuchElementException` if there is no such element
|
||||
|
||||
fun Iterable.toList(): List
|
||||
fun Iterable.toSet(): Set
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
# RingBuffer
|
||||
|
||||
This is a fixed size buffer that allow to store N last elements with _O(1)_ effectiveness (no data shifting).
|
||||
|
||||
Here is the sample:
|
||||
|
||||
val r = RingBuffer(3)
|
||||
assert( r is RingBuffer )
|
||||
assertEquals(0, r.size)
|
||||
assertEquals(3, r.capacity)
|
||||
|
||||
r += 10
|
||||
assertEquals(1, r.size)
|
||||
assertEquals(10, r.first)
|
||||
|
||||
r += 20
|
||||
assertEquals(2, r.size)
|
||||
assertEquals( [10, 20], r.toList() )
|
||||
|
||||
r += 30
|
||||
assertEquals(3, r.size)
|
||||
assertEquals( [10, 20, 30], r.toList() )
|
||||
|
||||
// now first value is lost:
|
||||
r += 40
|
||||
assertEquals(3, r.size)
|
||||
assertEquals( [20, 30, 40], r.toList() )
|
||||
assertEquals(3, r.capacity)
|
||||
|
||||
>>> void
|
||||
|
||||
Ring buffer implements [Iterable], so any of its methods are available for `RingBuffer`, e.g. `first`, `last`, `toList`,
|
||||
`take`, `drop`, `takelast`, `dropLast`, etc.
|
||||
|
||||
## Constructor
|
||||
|
||||
RinbBuffer(capacity: Int)
|
||||
|
||||
## Instance methods
|
||||
|
||||
| method | description | remarks |
|
||||
|-------------|------------------------|---------|
|
||||
| capacity | max size of the buffer | |
|
||||
| size | current size | (1) |
|
||||
| operator += | add new item | (1) |
|
||||
| add(item) | add new item | (1) |
|
||||
| iterator() | return iterator | (1) |
|
||||
|
||||
(1)
|
||||
: Ringbuffer is not threadsafe, protect it with a mutex to avoid RC where necessary.
|
||||
|
||||
[Iterable]: Iterable.md
|
||||
@@ -189,3 +189,19 @@ Important difference from the channels or like, every time you collect the flow,
|
||||
|
||||
Notice that flow's lambda is not called until actual collection is started. Cold flows are
|
||||
better in terms of resource consumption.
|
||||
|
||||
Flows allow easy transforming of any [Iterable]. See how the standard Lyng library functions use it:
|
||||
|
||||
fun Iterable.filter(predicate) {
|
||||
val list = this
|
||||
flow {
|
||||
for( item in list ) {
|
||||
if( predicate(item) ) {
|
||||
emit(item)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
[Iterable]: Iterable.md
|
||||
+5
-2
@@ -14,8 +14,9 @@ __Other documents to read__ maybe after this one:
|
||||
- [Advanced topics](advanced_topics.md), [declaring arguments](declaring_arguments.md)
|
||||
- [OOP notes](OOP.md), [exception handling](exceptions_handling.md)
|
||||
- [math in Lyng](math.md)
|
||||
- [time](time.md) and [parallelism](parallelism.md)
|
||||
- [parallelism] - multithreaded code, coroutines, etc.
|
||||
- Some class references: [List], [Set], [Map], [Real], [Range], [Iterable], [Iterator], [time manipulation](time.md)
|
||||
- Some class references: [List], [Set], [Map], [Real], [Range], [Iterable], [Iterator], [time manipulation](time.md), [RingBuffer], [Buffer].
|
||||
- Some samples: [combinatorics](samples/combinatorics.lyng.md), national vars and
|
||||
loops: [сумма ряда](samples/сумма_ряда.lyng.md). More at [samples folder](samples)
|
||||
|
||||
@@ -1304,4 +1305,6 @@ See [math functions](math.md). Other general purpose functions are:
|
||||
|
||||
[Buffer]: Buffer.md
|
||||
|
||||
[parallelism]: parallelism.md
|
||||
[parallelism]: parallelism.md
|
||||
|
||||
[RingBuffer]: RingBuffer.md
|
||||
Reference in new issue
Block a user