Compose two Brainfuck programs Given 2 brainfuck code snippets A and B, output some brainfuck code C which has the same behavior as running B with the input of As result. Note that C must work for any input that match the following assumptions, as if it were given to A.

You can assume:


Finite input.
both A and B halt.
EOF is consistently 0 or consistently -1.
Consistently allow or disallow cells to left
Unbounded tape (otherwise the requirement may be impossible)
Consistently 8-bit wrapping or unbounded integer
No stream(input or output for A or B) contain the byte representing EOF
Code A and B can contain characters that possibly appear in your C, and +-[]&lt;&gt;,.


E.g. (EOF=0)

A = ,[..,]
B = ,[...,]
C = ,[......,]

A = &gt;,[&gt;,]&lt;[.&lt;]
B = ,[...,]
C = &gt;&gt;&gt;&gt;,[[-&lt;+&lt;+&lt;+&gt;&gt;&gt;]&gt;&gt;&gt;,]&lt;&lt;&lt;&lt;[.&lt;]

A = &gt;,[&gt;,]&lt;[.&lt;]
B = ,[...,]
C = &gt;,[&gt;,]&lt;[...&lt;]

A = ,.
B = ,.
C = ,&gt;,[,]&lt;.

A = ,.
B = ,.
C = ,.


are valid tests

Shortest code in each language win. Winner in Brainfuck will be accepted.
brainfuck, 526 bytes

-&lt;+++++&lt;+&lt;+++++&lt;-[+++++++[&lt;++++++++&gt;-]&lt;---&gt;&gt;]&lt;&lt;--&lt;--&lt;+..&lt;&lt;&lt;&lt;,[[&lt;+&gt;&gt;+&lt;-]----[&gt;-&lt;-
---]&gt;[+[++[++++++++++++++[++[[-]&lt;]&lt;&lt;&lt;[&gt;--&gt;&gt;&gt;-.&gt;&gt;&gt;.&lt;&lt;&lt;.&gt;.&gt;.&lt;&lt;.+&gt;&gt;--..&gt;.&lt;..&lt;.&gt;.&gt;..
&lt;++.&lt;.&gt;..&gt;.&lt;..&lt;.&gt;--.&gt;&gt;.&lt;&lt;.&gt;.&lt;..&lt;.&gt;.&gt;.&lt;.&lt;.&gt;++.&lt;&lt;.&gt;.&gt;.&gt;.&lt;.&lt;.&gt;..&gt;.&lt;..&lt;.&gt;&gt;&gt;.&lt;&lt;--.++&lt;
&lt;&lt;]&gt;&gt;&gt;&gt;[&lt;]&lt;]&gt;[&lt;&lt;&lt;&lt;[&gt;]&gt;[+&gt;&gt;&gt;&gt;&gt;.&gt;.&lt;&lt;&lt;.&gt;.&lt;.&gt;&gt;&gt;.&lt;.[.&lt;.&gt;&gt;&gt;]&lt;++[&lt;&lt;.&lt;.&gt;&gt;.&lt;&lt;--.&lt;&lt;.&gt;.&gt;.++
&gt;&gt;&gt;-]&lt;&lt;&lt;&lt;.&gt;.&gt;&gt;.&lt;.&lt;&lt;&lt;.&gt;&gt;..&gt;&gt;.&lt;&lt;&lt;.&gt;--.&gt;.&lt;++...&lt;&lt;.&gt;&gt;--..&gt;&gt;.&lt;.&lt;..&lt;.&gt;.&gt;&gt;.&lt;&lt;++...&gt;.&lt;..
&lt;.&gt;&gt;&gt;.&lt;&lt;--...++&lt;&lt;[.&gt;]&lt;&lt;&lt;--.&lt;&lt;.&gt;&gt;++.&lt;.&gt;&gt;&gt;.&lt;&lt;--.++&lt;&lt;&lt;]]&lt;]&gt;[&lt;&lt;&lt;.&gt;&gt;]&lt;]&gt;[&gt;&gt;.&gt;.&lt;&lt;&lt;.&gt;.&gt;
&gt;&gt;.[&lt;]]&lt;]&gt;[&gt;&gt;.&gt;.&lt;..&lt;.&gt;&gt;&gt;.[&lt;]&lt;&lt;&lt;+&gt;-&gt;&gt;]&lt;&lt;.[-]&gt;,]


Formatted:

-&lt;+++++&lt;+&lt;+++++&lt;-[+++++++[&lt;++++++++&gt;-]&lt;---&gt;&gt;]
&lt;&lt;--&lt;--&lt;+..&lt;&lt;&lt;&lt;
,
[
  [&lt;+&gt; &gt;+&lt;-]
  ----[&gt;-&lt;----]&gt;
  [
    not question mark
    +
    [
      not greater than
      ++
      [
        not less than
        ++++++++++++++
        [
          not period
          ++
          [
            not comma
            [-]&lt;
          ]
          &lt;&lt;&lt;
          [
            comma B
            &gt;--&gt;&gt;&gt; -.&gt;&gt;&gt;.&lt;&lt;&lt;.&gt;.&gt;.&lt;&lt;.+&gt;&gt;--..&gt;.&lt;..&lt;.&gt;.&gt;..&lt;++.&lt;.&gt;..&gt;.&lt;..&lt;.&gt;--.&gt;&gt;.&lt;&lt;
            .&gt;.&lt;..&lt;.&gt;.&gt;.&lt;.&lt;.&gt;++.&lt;&lt;.&gt;.&gt;.&gt;.&lt;.&lt;.&gt;..&gt;.&lt;..&lt;.&gt;&gt;&gt;.&lt;&lt;--.++&lt;&lt;&lt;
          ]
          &gt;&gt;&gt;&gt;[&lt;]&lt;
        ]
        &gt;
        [
          period
          &lt;&lt;&lt;&lt;
          [
            B
            &gt;
          ]
          &gt;
          [
            A
            +&gt;&gt;&gt; &gt;&gt;.&gt;.&lt;&lt;&lt;.&gt;.&lt;.&gt;&gt;&gt;.&lt;.[.&lt;.&gt;&gt;&gt;]&lt;++[&lt;&lt;.&lt;.&gt;&gt;.&lt;&lt;--.&lt;&lt;.&gt;.&gt;.++&gt;&gt;&gt;-]&lt;&lt;&lt;&lt;.
            &gt;.&gt;&gt;.&lt;.&lt;&lt;&lt;.&gt;&gt;..&gt;&gt;.&lt;&lt;&lt;.&gt;--.&gt;.&lt;++...&lt;&lt;.&gt;&gt;--..&gt;&gt;.&lt;.&lt;..&lt;.&gt;.&gt;&gt;.&lt;&lt;++...&gt;.&lt;
            ..&lt;.&gt;&gt;&gt;.&lt;&lt;--...++&lt;&lt;[.&gt;]&lt;&lt;&lt;--.&lt;&lt;.&gt;&gt;++.&lt;.&gt;&gt;&gt;.&lt;&lt;--.++&lt;&lt;&lt;
          ]
        ]
        &lt;
      ]
      &gt;
      [
        less than
        &lt;&lt;&lt;.&gt;&gt;
      ]
      &lt;
    ]
    &gt;
    [
      greater than
      &gt;&gt;.&gt;.&lt;&lt;&lt;.&gt;.&gt;&gt;&gt;.[&lt;]
    ]
    &lt;
  ]
  &gt;
  [
    question mark
    &gt;&gt;.&gt;.&lt;..&lt;.&gt;&gt;&gt;.[&lt;]
    &lt;&lt;&lt;+&gt;-&gt;&gt;
  ]
  &lt;&lt;.[-]&gt;,
]


With respect to A, B, and C: EOF = 0, cells left of start disallowed, 8-bit wrapping cells.

Expects A followed by ? followed by B.

Try it online

(This answer can be made compliant with a brainfuck interpreter that doesn't allow going left of the start at the cost of one byte by transliterating y/&lt;&gt;/&gt;&lt;/ and prepending a &gt;.)

The basic idea is to use a series of string replacements in order to simulate the tapes of A and B using 2-cell nodes, with special attention given to replacing . in A and , in B so that the intermediate data stream is kept in a block of cells to the left of the simulated tape. The string replacement scheme is:


Insert &gt;&gt; before A
In both A and B, replace &gt; with &gt;[-]+&gt; and &lt; with &lt;&lt;
In A, replace . with &gt;[-]-[&gt;&gt;]+[[&gt;+&lt;-]&lt;[&gt;+&lt;-]&lt;]&gt;+[-&gt;&gt;+]&lt;[&gt;&gt;&gt;-&lt;&lt;+[&lt;&lt;]&lt;+&gt;&gt;&gt;[&gt;&gt;]+&lt;&lt;&lt;-]&gt;[+&lt;-&gt;]+&lt;/
Insert &gt;[&gt;&gt;]+&gt; after A and before B
In B, replace , with ,[,]&gt;,&lt;&lt;[&lt;&lt;]&lt;[[&gt;]&gt;&gt;[&gt;&gt;]&lt;+&lt;[&lt;&lt;]&lt;[&lt;]&gt;-]&gt;[&gt;]&gt;&gt;[&gt;&gt;]+&lt;*