I think you are right, this is probably the right track. A little more googling with permutation parsers gave me this, which is also about parsing iCal using parsec: http://stackoverflow.com/questions/3706172/haskell-parsec-and-unordered-prop... I'll review all this and see if that solves the problem... Thank you! Emmanuel On Tue, Dec 25, 2012 at 3:28 AM, Brent Yorgey <byorgey@seas.upenn.edu <mailto:byorgey@seas.upenn.edu>> wrote: Hi Emmanuel, Sounds like you want a permutation parser, perhaps? Check out http://hackage.haskell.org/packages/archive/parsec/latest/doc/html/Text-Pars... -Brent On Tue, Dec 25, 2012 at 12:18:37AM +0100, Emmanuel Touzery wrote: > Hi, > > I'm trying to parse ical files but the source material doesn't matter > much. First, I know there is an icalendar library on hackage, but I'm > trying to learn as well through this. > > Now the format is really quite simple and actually I'm parsing it, it > works, but I don't like the code I'm writing, it feels wrong and I'm sure > there is a better way. Actually for now I'm parsing it to an array of > arrays, but I want to fill a proper "data" structure. > > For my purpose the file contains a bunch of records like this: > > BEGIN:VEVENT > DTSTART:20121218T103000Z > DTEND:20121218T120000Z > [..] > DESCRIPTION: > [..] > END:VEVENT > > There are a bunch of records I don't care about and also I want to parse no > matter what is the order of directives (so, i want to parse also if DTEND > appears before DTSTART for instance, and so on). > > That last part is my one problem. I can't do: > > parseBegin > start <- parseStart > end <- parseEnd > skipRows > desc <- parseDesc > skipRows > end <- parseEnd > return Event { eventStart = start, eventEnd = end ...} > > my current working code is: > > parseEvent = do > parseBegin > contents <- many1 $ (try startDate) > <|> (try endDate) > <|> (try description) > <|> unknownCalendarInfo > parseEnd > return contents > > But then contents of course returns an array, while I want to return only > one element here. > > SOMEHOW what I would like is: > > parseEvent = do > parseBegin > contents <- many1 $ (start <- T.try startDate) > <|> (end <- T.try endDate) > <|> (desc <- T.try description) > <|> unknownCalendarInfo > parseEnd > return Event { eventStart = start, eventEnd = end ...} > > But obviously as far as Parsec is concerned startDate could occur several > times and also it's just not valid Haskell syntax. > > So, any hint about this problem? Parsing multi-line records with Parsec, > when I don't know the order in which the lines will appear? I mean sure I > can convert my array to the proper data structure... I find which element > in the array contains the start date and then which contains the end > date... and build my data structure.. But I'm sure something much nicer can > be done... I just can't find how. > > I see the author of iCalendar fixed the problem but I can't completely > understand his source, it's too many things at the same time for me, I need > to take this one step at a time. > > Thank you! > > Emmanuel > _______________________________________________ > Beginners mailing list > Beginners@haskell.org <mailto:Beginners@haskell.org> > http://www.haskell.org/mailman/listinfo/beginners _______________________________________________ Beginners mailing list Beginners@haskell.org <mailto:Beginners@haskell.org> http://www.haskell.org/mailman/listinfo/beginners