ASCII hello world

The ASCII generator can finally render some basic shapes. The primitives don’t get rotated yet (all lines are vertical).
It’s possible to combine any number of primitive shapes (currently only Box and Line) and render them into one ASCII image. It’s still very basic but it’s finally possible to actually take a look at the result.
The following input:

putStrLn "WOW"
putStr . render2 dict grids . msum $
    [ draw $ Box (0, 0) (50, 20)
    , draw $ Box (5, 5) (10, 10)
    , draw $ Line (0, 4) (70, 25)
    ]

Produces:

WOW

'|||||||||||||||||||||||||||||||||||||||||||||||| '                   
|                                                 |                   
|                                                 |                   
|                                                 |                   
||||                                              |                   
|   |'||| '                                       |                   
|    | ||||                                       |                   
|    |    ||||                                    |                   
|    |    |   |||                                 |                   
|         |      |||                              |                   
|    '||| '         ||||                          |                   
|                       |||                       |                   
|                          |||                    |                   
|                             ||||                |                   
|                                 |||             |                   
|                                    |||          |                   
|                                       ||||      |                   
|                                           |||   |                   
|                                              ||||                   
                                                  ||||                
'|||||||||||||||||||||||||||||||||||||||||||||||| '   |||             
                                                         |||          
                                                            ||||      
                                                                |||   
                                                                   |||

The algorithm is currently using a dictionary of ASCII characters. I also started testing it with Unicode characters.
It’s working in principle but causes some issues when copying the output into other programs.
I think I’ll end up with two modes for the program (ASCII / Unicode).