| gq 'j.Filter(func(n *Node) bool { return strings.Contains(n.String(), "good/") })'
| jq 'map(select(contains("good/")))' | gq 'j.Filter(func(n *Node) bool { return strings.Contains(n.String(), "good/") })'
| jq 'map(select(contains("good/")))'every map implementation ive seen has type function(a,b) -> list(a) -> list(b)
select(contains("good/")) is a function from string -> string|void
so map plus a voidable function equals a filter
| just means connect 2 filters
if you have a stream you turn it into a array with the array constructor []
if you have an array you turn it into a stream with the producer operator .[]
the api is super orthogonal and well designed. but you do have to understand the model