
Hi
1) You depend on MTL, but I can't obviously see why. Perhaps the test suite?
The current implementation of (!) relies on the Monad instance for Either exported by Control.Monad.Error. There's no fundamental reason for this; it was just easier to code. Perhaps I'll get rid of it in a later version, but I haven't bothered yet because I don't think an MTL dependency is a big deal.
Yes, an MTL dependency is nothing to worry about at all, and isn't worth even thinking about removing given its actually used.
Heck, let me prove it to you -- here's what happens if I define (insert = unsafeInsert):
Ah, I see now. You are of course correct.
3) insert x y = delete x >>> deleteR y >>> unsafeInsert x y
Why not:
insert x y = unsafeInsert x y . delete x . delete y
Now you don't end up using the arrow combinators, and it becomes more readable (at least to me). Of course, this function may disappear entirely if what I wrote in (2) is correct.
This is a matter of taste, I guess. In this case I felt that the "backwards" order of (.) was a little misleading, and I'm personally quite comfortable with using (>>>) for forward composition.
Fair enough. You've obviously thought about the issues in this package a great deal, which gives me a nice happy feeling when using the package! Thanks Neil