public function filter(callable $pred) { return new self($this->root, FP::rgen(FP::map(function (self $child) use($pred) { return $child->filter($pred); }, FP::filter(function (self $child) use($pred) { return call_user_func($pred, $child->getRoot()); }, $this->children)))); }