package Ġcom . cop per leaf . tre ll is . visitor Ċ Ċ import Ġcom . cop per leaf . tre ll is . base . Spe k Ċ Ċ interface ĠSpe k Visitor Ġ{ ĊĠĠĠ Ġfun Ġenter ( candidate : ĠSpe k < *, Ġ* >) ĊĠĠĠ Ġfun Ġ< Result > Ġleave ( candidate : ĠSpe k < *, Ġ* >, Ġresult : ĠResult ) Ċ } Ċ Ċ fun ĠSpe k < *, Ġ* >. explore ( visitor : ĠSpe k Visitor ) Ġ{ ĊĠĠĠ Ġexplor ing ( visitor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . children . forEach Ġ{ Ġit . explore ( visitor ) Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġ< Result > ĠSpe k < *, Ġ* >. visit ing ( visitor : ĠSpe k Visitor , Ġcb : ĠSpe k < *, Ġ* >. () Ġ-> ĠResult ): ĠResult Ġ{ ĊĠĠĠ Ġvisitor . enter ( this ) ĊĠĠĠ Ġval Ġresult Ġ= Ġthis . cb () ĊĠĠĠ Ġreturn Ġresult . also Ġ{ Ġvisitor . leave ( this , Ġit ) Ġ} Ċ } Ċ Ċ fun ĠSpe k < *, Ġ* >. ex plor ing ( visitor : ĠSpe k Visitor , Ġcb : ĠSpe k < *, Ġ* >. () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġvisitor . enter ( this ) ĊĠĠĠ Ġthis . cb () ĊĠĠĠ Ġvisitor . leave ( this , Ġnull ) Ċ } Ċ