No Description

Herbert Vojčík c486587051 Repo url fix "git://" => "https://". 8 months ago
src e3ba12697f add atLyst:ifAbsent:put: 2 years ago
.gitignore 084a65a91b Initial commit. Extracted from Trapped. 2 years ago
Gruntfile.js 084a65a91b Initial commit. Extracted from Trapped. 2 years ago
LICENSE-MIT 084a65a91b Initial commit. Extracted from Trapped. 2 years ago
README.md 084a65a91b Initial commit. Extracted from Trapped. 2 years ago
bower.json 4a2197dc1d Remove some github urls. 1 year ago
deploy.js 084a65a91b Initial commit. Extracted from Trapped. 2 years ago
devel.js f3c85fbade amber-attic => amber-contrib-legacy 2 years ago
index.html 084a65a91b Initial commit. Extracted from Trapped. 2 years ago
local.amd.json 084a65a91b Initial commit. Extracted from Trapped. 2 years ago
package.json c486587051 Repo url fix "git://" => "https://". 8 months ago

README.md

Lyst

Get / set hierarchical data using array-like indexes.

The Lyst index (aka yndex) an array of elements: either strings, numbers or a sub-arrays. These are used to denote the (relative) location of a piece of data in a hierarchical object, and is used to read or write from / to this position.

Elements of a path are equivalent to elements of paths in classic file systems: each elements is one step deeper in a tree hierarchy. Thus, to read a data denoted by a path, Lyst starts from actual position, reads the contents denoted by first element, use the result to read the contents denoted by second elements etc. until the end. To write the data, the algorithm is similar to reading one, byt the last element is used to write the data instead.

  • if string path element is read from foo, foo at: aString is performed;
  • if string path element is written to foo, foo at: aString put: value is performed;
  • if number path element is read from foo, foo at: aNumber is performed;
  • if number path element is written to foo, foo at: aNumber put: value is performed;
  • if subarray path element #(bar) is read from foo, foo bar is performed;
  • if subarray path element #(bar) is written to foo, foo bar: value is performed.

API


Object >> atLyst: aCollection ifAbsent: aBlock

For example container atLyst: #((todos) 1 done) ifAbsent: [...]' essentially does

| x |
x := container todos at: 1.
^ x at: 'done'

But, whenever:

  • container fails to perform todos, or
  • container todos fails to perform at:ifAbsent:, or
  • container todos does not contain index 1, or
  • container todos at: 1 fails to perform at:ifAbsent:, or
  • container todos at: 1 does not contain index 'done',

the ifAbsent block value is returned.


Object >> atLyst: aCollection ifAbsent: aBlock put: anObject

For example container atLyst: #((todos) 1 done) ifAbsent: [...] put: 'foo' essentially does

| x |
x := container todos at: 1.
^ x at: 'done' put: 'foo'

But, whenever:

  • container fails to perform todos, or
  • container todos fails to perform at:ifAbsent:, or
  • container todos does not contain index 1, or
  • container todos at: 1 fails to do at:put:,

the ifAbsent block value is returned.


Lyst class >> parse: aString

Parses a string to get a proper array index to use with atLyst: API.

The syntax is resembling Smalltalk literal array syntax very closely. For example Lyst parse: '(value)' and Lyst parse: '(todos) 1 done' produce #((value)) and #((todos) 1 done) as results.

Syntactic sugar: as (foo) happens often, to denote unary selector, it can be written equivalently as ~foo, to improve readability. So above Lyst indexes' parseable string representation would likely be written '~value' and '~todos 1 done' instead.