<div dir="ltr">Suggestion: I notice that you are using indexing into a list as a lookup table, you might want to switch to a vector + unsafe reads in the efficient version<div><br></div><div>Ben</div></div><br><div class="gmail_quote"><div dir="ltr">On Fri, 10 Jul 2015 at 01:24 Alvaro J. Genial <<a href="mailto:genial@alva.ro">genial@alva.ro</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Howdy,</div><div><br></div><div>I'd like to announce a first version of <font face="monospace, monospace"><a href="http://hackage.haskell.org/package/base91" target="_blank">base91</a></font>, a Haskell package to enable the encoding and decoding of data in Base91 format, as documented in its <a href="http://base91.sourceforge.net" target="_blank">specification</a>. The main benefits of said scheme are a good reduction in overhead (from 31% up to 58%) when compared to Base64 due to the clever use of two printable ASCII characters (consuming 16 bits) to encode 13 arbitrary bits, as well as neither need for nor ambiguity over padding or alphabets.</div><div><br></div><div>It includes support for...</div><div><br></div><div>- Plain Strings (module Codec.Binary.Base91.String)</div><div>- Data.ByteString (module Codec.Binary.Base91.ByteString)</div><div>- Data.Text (module Codec.Binary.Base91.Text)</div>- The latter two combined (module Codec.Binary.Base91.Efficient)<div>- Data.ByteString.Lazy (module Codec.Binary.Base91.ByteString.Lazy)</div><div>- Data.Text.Lazy (module Codec.Binary.Base91.Text.Lazy)</div><div><div>- The latter two combined (module Codec.Binary.Base91.Efficient.Lazy)</div><div><div><br></div><div>...which are all just concretely typed versions of the generic implementation in Codec.Binary.Base91.</div><div><br></div><div>I had fun exploring some of the latest GHC extensions, as evidenced by Codec.Binary.Base91.Control, which relies on a certain amount of type trickery to reconcile the incongruence between monomorphic containers and the standard type classes.</div><div><br></div><div>Anyway, suggestions are very welcome. In particular, I'm interested in:</div><div><br></div><div>1. Whether the generic decode and encode signatures can be simplified or improved elsehow.</div><div>2. Whether there already exist classes similar in purpose to Applicative' and Foldable'.<br></div><div>3. Whether it makes sense to offer decode and encode variants that use lazy (left) folds--currently folding is always strict, even with lazy types.</div><div><br>(Testing comes nearly free courtesy of QuickCheck and the identity property of decode . encode, plus a couple of concrete examples. Please open an issue or otherwise let me know if you find a bug.)<br></div><div><br></div><div>Thank you,</div><div><br clear="all"><div><div><div dir="ltr"><div style="font-family:arial;font-size:small"><a href="http://alva.ro" target="_blank">Alvaro</a></div><div style="font-family:arial;font-size:small"><br></div></div></div></div>
</div></div></div></div>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
</blockquote></div>