-spec mktree(Signal) -> Tree when Signal :: gsc:signal(), Tree :: gsc_ntree:ntree(). % @doc make into a tree mktree(Sig) -> Tree0 = gsc_ntree:nstem(vtokens, Sig), Tree1 = rerootl_tkstr("=>", Tree0), Tree2 = rerootl_tkstr("*", Tree1), Tree2. rerootl_tkstr(S, Tree0 = #ns{val = Root0}) -> Kids0 = gsc_ntree:deleaf0(Tree0), IsntS = fun(Tk) -> isnt_str(S, Tk) end, case lists:splitwith(IsntS, Kids0) of % found % input: % *s Root0 % | % +-- .l Foo % +-- .l "=>" % +-- .l Bar % output: % *s "=>" % | % +-- *s Root0 -- .l Foo % +-- *s Root0 -- .l Bar {LHS1, [Tk0 | RHS1]} -> Root1 = Root0, LTree1 = gsc_ntree:releaf0(Root1, LHS1), RTree1 = rerootl_tkstr(S, gsc_ntree:releaf0(Root1, RHS1)), NewRoot0 = {op, Tk0}, NewKids0 = [LTree1, RTree1], NewTree = gsc_ntree:releaf0(NewRoot0, NewKids0), NewTree; % not found, nothing to do {Kids0, []} -> Tree0 end. %reroot_mapsto(Tree0 = #ns{val = Root0}) -> % Kids0 = gsc_ntree:deleaf0(Tree0), % IsntMapsto = fun(DL) -> isnt_str("=>", Tk) end, % case lists:splitwith(IsntMapsto, Kids0) of % % found % {LHS1, [Tk0 | RHS1]} -> % Root1 = Root0, % LTree1 = gsc_ntree:releaf0(Root1, LHS1), % RTree1 = reroot_mapsto(gsc_ntree:releaf0(Root1, RHS1)), % NewRoot0 = {op, Tk0}, % NewKids0 = [LTree1, RTree1], % NewTree = gsc_ntree:releaf0(NewRoot0, NewKids0), % NewTree; % % nothing to do % {Kids0, []} -> % Tree0 % end. isnt_str(X, Y) -> not is_str(X, Y). is_str(S, #tk{str = S}) -> true; is_str(_, _) -> false.