This will most likely get overwritten during refactoring.

And it did occur to me that this is very much like "group blocks by ftype" operation that happens during merging/concatenation. And the implementation does look rather trivial:

```python
def mapreduce_blocks(mgr, keyfunc, reducer):
    return dict((key, reducer(val_iter))
                for key, val_iter in itertools.groupby(mgr.blocks, keyfunc=keyfunc))

def group_blocks_by_ftype(mgr):
    return mapreduce_blocks(mgr, keyfunc=lambda b: str(b.ftype),
                            reducer=list)

def combine_blocks_by_dtype(mgr):
    return mapreduce_blocks(mgr, keyfunc=lambda b: str(b.dtype),
                            reducer=mgr.combine)
```

Such one-liner functions are indeed a natural extension of blockmanager external API, but I'm not sure if they deserve to be part of it.