-
-
Notifications
You must be signed in to change notification settings - Fork 150
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
1d3c824
commit 541e9c8
Showing
2 changed files
with
44 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
/** | ||
* Lisp-like sequence abstraction for arbitrary types using `first` & | ||
* `next` operations only. | ||
* | ||
* @remarks | ||
* Unlike ES6 iterators this approach does not conflate both operations | ||
* and `first()` can be called any number of times to obtain the current | ||
* value (if any) from the sequence. | ||
*/ | ||
export interface ISeq<T> { | ||
/** | ||
* Returns the sequence's first value or `undefined` if there're no | ||
* further values. | ||
* | ||
* @remarks | ||
* If the sequence is guaranteed to not include `undefined` values, | ||
* a simple check for `seq.first() === undefined` is sufficient to | ||
* determine the end. If the sequence DOES contain `undefined` | ||
* values, the check should use `seq.next()`. | ||
*/ | ||
first(): T | undefined; | ||
/** | ||
* Returns a new sequence of the remaining elements or `undefined` | ||
* if there're no further values. | ||
* | ||
* @remarks | ||
* In general, implementations of this interface MUST always return | ||
* a new sequence instance and not mutate some internal cursor. I.e. | ||
* `seq.next() !== seq` | ||
*/ | ||
next(): ISeq<T> | undefined; | ||
} | ||
|
||
/** | ||
* Interface for data types providing an {@link ISeq} abstraction. | ||
*/ | ||
export interface ISeqable<T> { | ||
/** | ||
* Returns an {@link ISeq} of the type's data or `undefined` if | ||
* there're no values available. See {@link ISeq.next} | ||
*/ | ||
seq(): ISeq<T> | undefined; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters