bfcat - encode a file as a brainf*** program Challenge

Write a program or function that given a string, returns a valid Brainfuck program that when compiled and executed as Brainfuck, returns that string..


Assume all inputs are encoded as ASCII.
Assume the outputted BF program will execute in an environment with an infinite tape.
Assume the pointer starts at cell 0 with every cell initialized to a value of zero.
Each example below represent one possible correct output for the given input. In particular, the examples include extra newlines and spaces to help human readability. Solutions are free to format the outputted BF code in any way.
The tape is doubly infinite.
All cells provided by the interpreter are exactly 8-bit cells. Overflow and underflow wrap around in a predictable and sane matter.


Examples

Space string

Given the input  , your program/function could return:

+++++ +++++
+++++ +++++
+++++ +++++
++ .


Exclamation point

Given the input ! , your program/function could return:

+++++ +++++
+++++ +++++
+++++ +++++
+++
.


Two letters

Given the input hi , your program/function could return:

+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++

+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++

++++
.
+
.


This is code-golf, so the code with the smallest number of bytes wins. Good luck.
Brainfuck, 55 51 bytes

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


Try it online!

Example output for hi (without the linefeeds):

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++.&gt;++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.&gt;


Explanation

This moves across the tape while writing the program. The surrounding ,[...,] is a standard input loop. For each character, we use four cells:

[... x a b c ...]


where x is the cell we write the input to.

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


This part uses cell a to write a 21 into cell b via a standard multiplication of 3 and 7.

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


Now we use that 21 to write 42 into a and 63 into c by multiplying by 2 and 3 respectively. Then &lt;+&lt; moves back to cell x while turning the 42 into a 43 (the code point of +). Recap:

[... x 43 21 63 ...]


Now the main output loop:

[&gt;.&lt;-]


That is, while decrementing x we print one + each time.

&gt;+++.


After we're done we reuse the + cell, by adding 3 to give ..

&gt;&gt;-.


Finally, we move to the 63, decrement it to 62 (&gt;) and output that as well. The next iteration will use this cell as x.