
- script.go
 - API to add functions
  - RegisterUnaryFunction(name string, get bool, f func(arg any) any)
  - RegisterBinaryFunction(name string, getLeft, getRight bool, f func(left, right any) any)
   - handle in EvalWithRoot
   - get indicates using get and not first in eval of args
   - no override of existing
   - convert to lower case and validate
   - how to indicate with stack

 - @.foo without a comparison indicates existance

- parse
 - add discover option to find JSON or SEN in a string or file
  - 3 states
   - DiscoverOff
   - DiscoverAny
   - DiscoverSets - only discover {} and []
  - starting map/mode is like value but no errors on invalid
   - same as value but replace errChar with a skip or skip and drop to drop current
    - if number then cb and drop
  - errors don't panic but close off current (if whole) and then back to discover maps
 - implement on all parsers


- jp.GetPaths() and jp.FirstPath() - discussion #59
 - returns paths that match or maybe pairs of path and value

- embedded struct pointer encoding issue
- json.Unmarshaler
 - use alt.Recompose and convert simple to bytes and pass to unmarshaller

- pretty
 - align maps as well as arrays

- unit tests and example for cmd/oj

- optimize unmarshal
 - direct parse to struct

----------------

- option to detect duplicate keys or make part of validator
 - change stack to include array and map or maybe just map and nil means array
  - check performance hit
  - check added condition of whether keys should be checked. If too high then copy code
 - or separate stack in func for key maps along with dip code

-------------

- Match a JavaScript regular expression. For example, [?(@.description =~ /cat.*/i)]
- Exists syntax? [?(@.x exists)]
