On Mon, Jun 1, 2009 at 12:20 PM, Ralf Laemmel <rlaemmel@gmail.com> wrote:
On Mon, Jun 1, 2009 at 8:20 PM, David Fox <david@seereason.com> wrote:
Is there a Scrap Your Boilerplate guru out there who could whip up a three argument version of gzip for me?
This can be done of course (untested but type-checked code follows). Left wondering what the scenario might be :-)
Ralf
import Prelude hiding (GT) import Data.Generics
-- As originally defined: Twin map for transformation gzipWithT2 :: GenericQ (GenericT) -> GenericQ (GenericT) gzipWithT2 f x y = case gmapAccumT perkid funs y of ([], c) -> c _ -> error "gzipWithT2" where perkid a d = (tail a, unGT (head a) d) funs = gmapQ (\k -> GT (f k)) x
-- For three args now gzipWithT3 :: GenericQ (GenericQ (GenericT)) -> GenericQ (GenericQ (GenericT)) gzipWithT3 f x y z = case gmapAccumT perkid funs' z of ([], c) -> c _ -> error "gzipWithT3" where perkid a d = (tail a, unGT (head a) d) funs' = case gmapAccumQ perkid' funs y of ([], q) -> q _ -> error "gzipWithT3" where perkid' a d = (tail a, unGQ (head a) d) funs = gmapQ (\k -> (GQ (\k' -> GT (f k k')))) x
Thank you! What I have in mind is three way merging - you have two revisions based on the same original value, and you need to decide whether they can be merged automatically or they need to be merged by a user. You only have a real conflict when both revisions differ from the original and from each other. -david