From 61db20e91cf0b08b4640b692df0830ed4aade314 Mon Sep 17 00:00:00 2001 From: Piotr Icikowski Date: Wed, 26 Jul 2023 22:13:21 +0200 Subject: [PATCH] feat(pkg): add initial source code --- collection.go | 378 +++++++++++++++ collection_test.csv | 1001 ++++++++++++++++++++++++++++++++++++++++ collection_test.go | 56 +++ comparators/numeric.go | 10 + comparators/package.go | 4 + comparators/string.go | 15 + functions.go | 39 ++ functions/package.go | 4 + functions/types.go | 24 + go.mod | 11 + go.sum | 11 + optional.go | 48 ++ optional_test.go | 128 +++++ package.go | 4 + 14 files changed, 1733 insertions(+) create mode 100644 collection.go create mode 100644 collection_test.csv create mode 100644 collection_test.go create mode 100644 comparators/numeric.go create mode 100644 comparators/package.go create mode 100644 comparators/string.go create mode 100644 functions.go create mode 100644 functions/package.go create mode 100644 functions/types.go create mode 100644 go.mod create mode 100644 go.sum create mode 100644 optional.go create mode 100644 optional_test.go create mode 100644 package.go diff --git a/collection.go b/collection.go new file mode 100644 index 0000000..4b75852 --- /dev/null +++ b/collection.go @@ -0,0 +1,378 @@ +package collections + +import ( + "reflect" + "sort" + "sync" + "sync/atomic" + + "pkg.icikowski.pl/collections/functions" +) + +// Collection represents the collection of data +// +// By default, the collection uses parallel implementation of operators. +type Collection[T any] struct { + data []T + parallel bool +} + +// Count counts values in the collection +func (s *Collection[T]) Count() int { + return len(s.data) +} + +// Epty determines whether the collection is empty +func (s *Collection[T]) Empty() bool { + return len(s.data) == 0 +} + +// Parallel sets the collection to use parallel implementation of operators +func (s *Collection[T]) Parallel() *Collection[T] { + s.parallel = true + return s +} + +// Sequential sets the collection to use sequential implementation of operators +func (s *Collection[T]) Sequential() *Collection[T] { + s.parallel = false + return s +} + +func (s *Collection[T]) filterParallel(p functions.Predicate[T]) *Collection[T] { + processed := []T{} + mux := sync.Mutex{} + wg := sync.WaitGroup{} + + wg.Add(len(s.data)) + for _, e := range s.data { + e := e + go func() { + defer wg.Done() + if p(e) { + mux.Lock() + defer mux.Unlock() + processed = append(processed, e) + } + }() + } + wg.Wait() + + s.data = processed + return s +} + +func (s *Collection[T]) filterSequential(p functions.Predicate[T]) *Collection[T] { + processed := []T{} + for _, e := range s.data { + if p(e) { + processed = append(processed, e) + } + } + s.data = processed + return s +} + +// Filter filters the collection using given [functions.Predicate] +func (s *Collection[T]) Filter(p functions.Predicate[T]) *Collection[T] { + if s.parallel { + return s.filterParallel(p) + } + return s.filterSequential(p) +} + +func (s *Collection[T]) allMatchParallel(p functions.Predicate[T]) bool { + wg := sync.WaitGroup{} + state := atomic.Bool{} + + wg.Add(len(s.data)) + state.Store(true) + + for _, e := range s.data { + if !state.Load() { + break + } + e := e + go func() { + defer wg.Done() + if state.Load() && !p(e) { + state.Store(false) + } + }() + } + + return state.Load() +} + +func (s *Collection[T]) allMatchSequential(p functions.Predicate[T]) bool { + for _, e := range s.data { + if !p(e) { + return false + } + } + return true +} + +// AllMatch checks whether all elements in collection match given [functions.Predicate] +func (s *Collection[T]) AllMatch(p functions.Predicate[T]) bool { + if s.parallel { + return s.allMatchParallel(p) + } + return s.allMatchSequential(p) +} + +func (s *Collection[T]) anyMatchParallel(p functions.Predicate[T]) bool { + wg := sync.WaitGroup{} + state := atomic.Bool{} + + wg.Add(len(s.data)) + state.Store(false) + + for _, e := range s.data { + if state.Load() { + break + } + e := e + go func() { + defer wg.Done() + if state.Load() && p(e) { + state.Store(true) + } + }() + } + + return state.Load() +} + +func (s *Collection[T]) anyMatchSequential(p functions.Predicate[T]) bool { + for _, e := range s.data { + if p(e) { + return true + } + } + return false +} + +// AnyMatch checks whether any elements in collection match given [functions.Predicate] +func (s *Collection[T]) AnyMatch(p functions.Predicate[T]) bool { + if s.parallel { + return s.anyMatchParallel(p) + } + return s.anyMatchSequential(p) +} + +func (s *Collection[T]) noneMatchParallel(p functions.Predicate[T]) bool { + wg := sync.WaitGroup{} + state := atomic.Bool{} + + wg.Add(len(s.data)) + state.Store(true) + + for _, e := range s.data { + if !state.Load() { + break + } + e := e + go func() { + defer wg.Done() + if state.Load() && p(e) { + state.Store(false) + } + }() + } + + return state.Load() +} + +func (s *Collection[T]) noneMatchSequential(p functions.Predicate[T]) bool { + for _, e := range s.data { + if p(e) { + return false + } + } + return true +} + +// NoneMatch checks whether no elements in collection match given [functions.Predicate] +func (s *Collection[T]) NoneMatch(p functions.Predicate[T]) bool { + if s.parallel { + return s.noneMatchParallel(p) + } + return s.noneMatchSequential(p) +} + +// Sorted sorts the collection using given [functions.Comparator] +func (s *Collection[T]) Sorted(c functions.Comparator[T]) *Collection[T] { + sort.SliceStable(s.data, func(i, j int) bool { + return c(s.data[i], s.data[j]) + }) + return s +} + +func (s *Collection[T]) peekParallel(c functions.Consumer[T]) *Collection[T] { + wg := sync.WaitGroup{} + wg.Add(len(s.data)) + + for _, e := range s.data { + e := e + go func() { + defer wg.Done() + c(e) + }() + } + + wg.Wait() + return s +} + +func (s *Collection[T]) peekSequential(c functions.Consumer[T]) *Collection[T] { + for _, e := range s.data { + c(e) + } + return s +} + +// Peek executes given [function.Consumer] on every value in collections +func (s *Collection[T]) Peek(c functions.Consumer[T]) *Collection[T] { + if s.parallel { + return s.peekParallel(c) + } + return s.peekSequential(c) +} + +func (s *Collection[T]) transformParallel(u functions.UnaryOperator[T]) *Collection[T] { + processed := make([]T, len(s.data)) + wg := sync.WaitGroup{} + + wg.Add(len(s.data)) + for i, e := range s.data { + i, e := i, e + go func() { + defer wg.Done() + processed[i] = u(e) + }() + } + + wg.Wait() + s.data = processed + return s +} + +func (s *Collection[T]) transformSequential(u functions.UnaryOperator[T]) *Collection[T] { + processed := []T{} + for _, e := range s.data { + processed = append(processed, u(e)) + } + s.data = processed + return s +} + +// Transform transforms all values in collection using given [functions.UnaryOperator] +func (s *Collection[T]) Transform(u functions.UnaryOperator[T]) *Collection[T] { + if s.parallel { + return s.transformParallel(u) + } + return s.transformSequential(u) +} + +// Reduce reduces values in given collection using given [functions.BinaryOperator] +func (s *Collection[T]) Reduce(b functions.BinaryOperator[T]) T { + processed := *new(T) + if len(s.data) == 0 { + processed = s.data[0] + } + + for _, e := range s.data[1:] { + processed = b(processed, e) + } + return processed +} + +// Limit limits the collection to given number of values +func (s *Collection[T]) Limit(n int) *Collection[T] { + if len(s.data) < n { + return s + } + + if n < 0 { + n = 0 + } + + s.data = s.data[:n] + return s +} + +// Skip skips given number of values in the collection +func (s *Collection[T]) Skip(n int) *Collection[T] { + if len(s.data) == 0 { + return s + } + + if n > len(s.data) { + n = len(s.data) + } + + s.data = s.data[n:] + return s +} + +// FindFirst returns [Optional] with first item of the collection +func (s *Collection[T]) FindFirst() *Optional[T] { + e, present := *new(T), false + if len(s.data) != 0 { + e, present = s.data[0], true + } + return &Optional[T]{e, present} +} + +// FindFirst returns [Optional] with last item of the collection +func (s *Collection[T]) FindLast() *Optional[T] { + e, present := *new(T), false + if len(s.data) != 0 { + e, present = s.data[len(s.data)-1], true + } + return &Optional[T]{e, present} +} + +// Min returns the lowest value from the collection using given [functions.Comparator] +func (s *Collection[T]) Min(c functions.Comparator[T]) *Optional[T] { + return s.Sorted(c).FindFirst() +} + +// Max returns the highest value from the collection using given [functions.Comparator] +func (s *Collection[T]) Max(c functions.Comparator[T]) *Optional[T] { + return s.Sorted(c).FindLast() +} + +// Distinct ensures that all elements in the collecion are unique +func (s *Collection[T]) Distinct() *Collection[T] { + processed := []T{} + for i := 0; i < len(s.data); i++ { + hasCopy := false + for j := i + 1; j < len(s.data); j++ { + if reflect.DeepEqual(s.data[i], s.data[j]) { + hasCopy = true + break + } + } + if !hasCopy { + processed = append(processed, s.data[i]) + } + } + s.data = processed + return s +} + +// MapCollection maps collection of values of type T to collection of values of type U using given [functions.Function] +func MapCollection[T, U any](src *Collection[T], mapper functions.Function[T, U]) *Collection[U] { + data := []U{} + for _, e := range src.data { + data = append(data, mapper(e)) + } + return &Collection[U]{data, src.parallel} +} + +// Collect returns all items from collection as a slice +func (s *Collection[T]) Collect() []T { + return s.data +} diff --git a/collection_test.csv b/collection_test.csv new file mode 100644 index 0000000..736bca1 --- /dev/null +++ b/collection_test.csv @@ -0,0 +1,1001 @@ +id,lastName,firstName,email +1,Makiver,Erinn,emakiver0@squarespace.com +2,Lamport,Reta,rlamport1@moonfruit.com +3,Dosdale,Jeanne,jdosdale2@npr.org +4,Iacovini,Kelsi,kiacovini3@cmu.edu +5,Grog,Thedrick,tgrog4@wikispaces.com +6,Turfus,Delcine,dturfus5@hostgator.com +7,Elt,Ariella,aelt6@purevolume.com +8,Yeardsley,Madge,myeardsley7@webnode.com +9,Ottewill,Catherina,cottewill8@seesaa.net +10,Cleynaert,Daisi,dcleynaert9@timesonline.co.uk +11,Grabb,Constancy,cgrabba@shinystat.com +12,Eyckel,Homere,heyckelb@t.co +13,Semon,Alverta,asemonc@feedburner.com +14,Codlin,Irvin,icodlind@pen.io +15,Threader,King,kthreadere@xinhuanet.com +16,Sinisbury,Kristy,ksinisburyf@elpais.com +17,Chavrin,Edgard,echavring@pcworld.com +18,Whybray,Abbye,awhybrayh@w3.org +19,Ketch,Irvine,iketchi@tinypic.com +20,Staddart,Wilona,wstaddartj@1und1.de +21,Foch,Grover,gfochk@issuu.com +22,Caddan,Robina,rcaddanl@sbwire.com +23,Ionnisian,Billye,bionnisianm@ocn.ne.jp +24,Calderbank,Irina,icalderbankn@umn.edu +25,Jandel,Keenan,kjandelo@whitehouse.gov +26,Gribben,Rafa,rgribbenp@photobucket.com +27,Linnell,Orly,olinnellq@dyndns.org +28,Jerratsch,Bel,bjerratschr@tamu.edu +29,Garken,Herman,hgarkens@nymag.com +30,Grundey,Shawn,sgrundeyt@cbc.ca +31,Hiley,Odie,ohileyu@marketwatch.com +32,Keymar,Louella,lkeymarv@ft.com +33,Ives,Paolina,pivesw@netvibes.com +34,Wedlock,Lemar,lwedlockx@ox.ac.uk +35,Wetter,Devi,dwettery@skype.com +36,Roughley,Roxanna,rroughleyz@businesswire.com +37,Lillistone,Sterling,slillistone10@chicagotribune.com +38,Bleakman,Marie-jeanne,mbleakman11@last.fm +39,Torpie,Jami,jtorpie12@discovery.com +40,Detloff,Janelle,jdetloff13@sfgate.com +41,Hulks,Joli,jhulks14@pbs.org +42,Sore,Amitie,asore15@umn.edu +43,Sheals,Kirsteni,ksheals16@sakura.ne.jp +44,Carbin,Dene,dcarbin17@nature.com +45,Glader,Celle,cglader18@telegraph.co.uk +46,Larkings,Bettina,blarkings19@over-blog.com +47,Davenall,Chrissy,cdavenall1a@usnews.com +48,Wallman,Regina,rwallman1b@answers.com +49,Grose,Laurel,lgrose1c@sun.com +50,Feaviour,Ethelind,efeaviour1d@furl.net +51,Tebbs,Diego,dtebbs1e@de.vu +52,Sherborne,Jilli,jsherborne1f@shinystat.com +53,Willimott,Brinna,bwillimott1g@miitbeian.gov.cn +54,De Blasi,Obidiah,odeblasi1h@spiegel.de +55,Orwell,Pearla,porwell1i@adobe.com +56,Jepensen,Jerome,jjepensen1j@skyrock.com +57,Dyton,Mannie,mdyton1k@google.co.uk +58,Vernon,Tucker,tvernon1l@constantcontact.com +59,Slite,Saidee,sslite1m@jugem.jp +60,Fellgett,Gawain,gfellgett1n@printfriendly.com +61,Farre,Hailey,hfarre1o@sourceforge.net +62,Joss,Glory,gjoss1p@taobao.com +63,Woodison,Coletta,cwoodison1q@unicef.org +64,Egle of Germany,Randie,regleofgermany1r@sfgate.com +65,Heitz,Ranique,rheitz1s@theatlantic.com +66,Allwood,Briant,ballwood1t@apple.com +67,Balkwill,Aeriel,abalkwill1u@amazon.com +68,Ginni,Wallis,wginni1v@gravatar.com +69,Kinman,Pearla,pkinman1w@free.fr +70,Ewins,Martie,mewins1x@state.tx.us +71,Mellows,Casi,cmellows1y@xrea.com +72,Livezley,Eleanore,elivezley1z@dedecms.com +73,Paule,Raychel,rpaule20@privacy.gov.au +74,Beniesh,Marcello,mbeniesh21@so-net.ne.jp +75,Kinnon,Sargent,skinnon22@wikimedia.org +76,Kusick,Shelly,skusick23@eepurl.com +77,Breckwell,Granger,gbreckwell24@spiegel.de +78,Penketh,Roseanna,rpenketh25@smugmug.com +79,Bunning,Gae,gbunning26@slideshare.net +80,Beetlestone,Heinrik,hbeetlestone27@instagram.com +81,Seggie,Glynda,gseggie28@stanford.edu +82,Knevit,Edwin,eknevit29@europa.eu +83,Pool,Barbara,bpool2a@typepad.com +84,Reimer,Olenolin,oreimer2b@cdc.gov +85,Hayter,Kalindi,khayter2c@chronoengine.com +86,Hymers,Venus,vhymers2d@theatlantic.com +87,Westgarth,Osborne,owestgarth2e@sakura.ne.jp +88,Pentycost,Glory,gpentycost2f@booking.com +89,Hotchkin,Arel,ahotchkin2g@liveinternet.ru +90,Serck,Rayner,rserck2h@lulu.com +91,Cejka,Katalin,kcejka2i@webnode.com +92,Wurst,Guenevere,gwurst2j@fda.gov +93,Dashwood,Bonita,bdashwood2k@liveinternet.ru +94,Balasini,Bentley,bbalasini2l@cloudflare.com +95,Coulthart,Ashlan,acoulthart2m@4shared.com +96,Popelay,Bonni,bpopelay2n@ftc.gov +97,McHarry,Chloe,cmcharry2o@multiply.com +98,MacTeague,Loralee,lmacteague2p@redcross.org +99,Chazelle,Regina,rchazelle2q@mapy.cz +100,Eite,Dermot,deite2r@squidoo.com +101,Stuckford,Chilton,cstuckford2s@oakley.com +102,York,Jordain,jyork2t@ucoz.ru +103,Dommett,Regine,rdommett2u@myspace.com +104,Yearsley,Hernando,hyearsley2v@unesco.org +105,Eick,Casi,ceick2w@free.fr +106,Helks,Alethea,ahelks2x@ca.gov +107,Peerless,Camella,cpeerless2y@netvibes.com +108,Olivello,Delano,dolivello2z@theatlantic.com +109,Blaymires,Frazier,fblaymires30@java.com +110,Brezlaw,Agnes,abrezlaw31@blog.com +111,Hamerton,Kelci,khamerton32@hp.com +112,Hannah,Ambrosius,ahannah33@merriam-webster.com +113,Goulbourn,Nial,ngoulbourn34@cnbc.com +114,Stiggles,Emlyn,estiggles35@fastcompany.com +115,Shallow,Analiese,ashallow36@yale.edu +116,Pallaske,Wren,wpallaske37@hibu.com +117,Antonias,Merrily,mantonias38@craigslist.org +118,Rathke,Isabeau,irathke39@apple.com +119,Stenett,Neil,nstenett3a@unicef.org +120,Gouge,Paolo,pgouge3b@dmoz.org +121,Follen,Salmon,sfollen3c@amazon.com +122,Paybody,Queenie,qpaybody3d@amazon.com +123,Bauduin,Micki,mbauduin3e@vk.com +124,Geall,Gorden,ggeall3f@walmart.com +125,Chadney,Titos,tchadney3g@bloglovin.com +126,Hutley,Ailey,ahutley3h@ucoz.ru +127,Jeandet,Delila,djeandet3i@imgur.com +128,Abry,Dalis,dabry3j@behance.net +129,Lowey,Carrie,clowey3k@imgur.com +130,Jervois,Mischa,mjervois3l@ucla.edu +131,Widmore,Salvidor,swidmore3m@youtube.com +132,Roskams,Gun,groskams3n@ycombinator.com +133,Haseldine,Laurianne,lhaseldine3o@plala.or.jp +134,Pedrol,Lucie,lpedrol3p@livejournal.com +135,Aistrop,Kingston,kaistrop3q@nature.com +136,Ivshin,Myer,mivshin3r@salon.com +137,Cousins,Carroll,ccousins3s@naver.com +138,Brotherick,Peyter,pbrotherick3t@guardian.co.uk +139,Carnaman,Sofie,scarnaman3u@ifeng.com +140,Dodimead,Yurik,ydodimead3v@theguardian.com +141,Ream,Laney,lream3w@newsvine.com +142,Bernier,Cordie,cbernier3x@weebly.com +143,Wreiford,Mil,mwreiford3y@tiny.cc +144,Rodway,Linnea,lrodway3z@cnet.com +145,Hudleston,Danica,dhudleston40@wiley.com +146,Townsley,Jerrold,jtownsley41@businessweek.com +147,Masey,Helena,hmasey42@drupal.org +148,Deverille,Sydel,sdeverille43@mlb.com +149,Hallt,Enrico,ehallt44@free.fr +150,Igglesden,Ginevra,gigglesden45@bigcartel.com +151,Harrhy,Rey,rharrhy46@cisco.com +152,Ionesco,Andrej,aionesco47@umich.edu +153,Galler,Geraldine,ggaller48@ca.gov +154,Stammirs,Nil,nstammirs49@t.co +155,Schwand,Amelia,aschwand4a@cnbc.com +156,Shearstone,Ginger,gshearstone4b@java.com +157,De Domenico,Micky,mdedomenico4c@elegantthemes.com +158,Grolle,Ricki,rgrolle4d@senate.gov +159,Mowett,Carmine,cmowett4e@newsvine.com +160,Escott,Piggy,pescott4f@example.com +161,Margiotta,Humberto,hmargiotta4g@delicious.com +162,Oram,Ginger,goram4h@t-online.de +163,Whitcombe,Henka,hwhitcombe4i@flavors.me +164,Gunn,Nyssa,ngunn4j@telegraph.co.uk +165,Wingham,Jefferey,jwingham4k@slashdot.org +166,Turmell,Jeremiah,jturmell4l@booking.com +167,O'Dreain,Shelby,sodreain4m@sun.com +168,Brandle,Ashlan,abrandle4n@cbsnews.com +169,Booeln,Dario,dbooeln4o@hubpages.com +170,Rome,Janenna,jrome4p@reuters.com +171,Click,Shellysheldon,sclick4q@wiley.com +172,Glaves,Mattie,mglaves4r@homestead.com +173,Furley,Fifi,ffurley4s@microsoft.com +174,Baggalley,Alexis,abaggalley4t@narod.ru +175,Ivasechko,Cesaro,civasechko4u@prnewswire.com +176,Akast,Dara,dakast4v@nhs.uk +177,Evins,Matilde,mevins4w@springer.com +178,Shrubsall,Eadith,eshrubsall4x@amazon.co.uk +179,Mogie,Julio,jmogie4y@dailymail.co.uk +180,Sibborn,Juline,jsibborn4z@nydailynews.com +181,Angelini,Phillie,pangelini50@bbb.org +182,MacCallam,Alia,amaccallam51@chron.com +183,Millett,Cleopatra,cmillett52@wordpress.org +184,Nisbet,Fabio,fnisbet53@dropbox.com +185,Bissell,Kermy,kbissell54@moonfruit.com +186,Tansly,Jonas,jtansly55@arstechnica.com +187,Propper,Dacia,dpropper56@arizona.edu +188,Durant,Kayley,kdurant57@1und1.de +189,Hainning,Brigid,bhainning58@altervista.org +190,Valencia,Gerick,gvalencia59@samsung.com +191,Park,Gae,gpark5a@alexa.com +192,Belitz,Murray,mbelitz5b@over-blog.com +193,Ingerman,Cherianne,cingerman5c@google.com.hk +194,De Mattia,Brewster,bdemattia5d@csmonitor.com +195,Hursthouse,Branden,bhursthouse5e@telegraph.co.uk +196,Hirjak,Vincenty,vhirjak5f@google.ru +197,Idle,Shandie,sidle5g@hp.com +198,Cleen,Suzanne,scleen5h@deliciousdays.com +199,Syne,Menard,msyne5i@com.com +200,Rosel,Addison,arosel5j@economist.com +201,McCole,Milton,mmccole5k@free.fr +202,Thorndycraft,Edward,ethorndycraft5l@nydailynews.com +203,De Benedetti,Biddy,bdebenedetti5m@cisco.com +204,Bertin,Salli,sbertin5n@google.pl +205,Paullin,Jewel,jpaullin5o@paginegialle.it +206,Alpine,Lionello,lalpine5p@rambler.ru +207,Drewe,Stafford,sdrewe5q@irs.gov +208,Heindl,Sloan,sheindl5r@desdev.cn +209,Kryszka,Laraine,lkryszka5s@simplemachines.org +210,Satford,Jonathan,jsatford5t@sciencedaily.com +211,Bythell,Lexy,lbythell5u@unesco.org +212,MacAirt,Bette,bmacairt5v@craigslist.org +213,Libbie,Ogdan,olibbie5w@qq.com +214,Sawle,Julianna,jsawle5x@japanpost.jp +215,Pauwel,Ardra,apauwel5y@usatoday.com +216,Storms,Suzann,sstorms5z@cam.ac.uk +217,Van de Castele,Atlante,avandecastele60@tripod.com +218,Currin,Ringo,rcurrin61@issuu.com +219,Gromley,Cyrille,cgromley62@google.fr +220,Struys,Linn,lstruys63@ft.com +221,Danilin,Ninetta,ndanilin64@youku.com +222,Murch,Sky,smurch65@tmall.com +223,Hise,Margie,mhise66@buzzfeed.com +224,Rudeforth,Reinold,rrudeforth67@nytimes.com +225,O'Driscole,Arabella,aodriscole68@bing.com +226,Okell,Archibaldo,aokell69@ucoz.ru +227,Comer,Gunter,gcomer6a@kickstarter.com +228,Missen,Moselle,mmissen6b@so-net.ne.jp +229,Grantham,Hashim,hgrantham6c@merriam-webster.com +230,Turnpenny,Karmen,kturnpenny6d@blog.com +231,Seckom,Washington,wseckom6e@creativecommons.org +232,Roumier,Rafaello,rroumier6f@wordpress.com +233,Elfitt,Bertha,belfitt6g@gnu.org +234,Prall,Rozina,rprall6h@google.ca +235,Horry,Rona,rhorry6i@phpbb.com +236,Hischke,Laina,lhischke6j@4shared.com +237,Decourt,Duke,ddecourt6k@upenn.edu +238,Denington,Kaleena,kdenington6l@who.int +239,Jest,De,djest6m@bbb.org +240,Maryman,Renelle,rmaryman6n@gravatar.com +241,Spadeck,Putnem,pspadeck6o@blogger.com +242,Anstie,Ulrick,uanstie6p@dailymotion.com +243,Brandel,Zorah,zbrandel6q@nba.com +244,Taffs,Bordy,btaffs6r@hubpages.com +245,Tibb,Bessy,btibb6s@umn.edu +246,Tonbridge,Donetta,dtonbridge6t@zdnet.com +247,McRobbie,Cori,cmcrobbie6u@mayoclinic.com +248,Godspede,Hendrika,hgodspede6v@phpbb.com +249,Franciskiewicz,Onfroi,ofranciskiewicz6w@hao123.com +250,Way,Sharleen,sway6x@infoseek.co.jp +251,Shitliff,Rosmunda,rshitliff6y@wikispaces.com +252,Bartul,Katey,kbartul6z@clickbank.net +253,Clever,Jena,jclever70@tripadvisor.com +254,Willoughley,Alasdair,awilloughley71@ocn.ne.jp +255,Pridie,Dido,dpridie72@theglobeandmail.com +256,Edwinson,Bradly,bedwinson73@cocolog-nifty.com +257,Bythway,Becki,bbythway74@hc360.com +258,Wailes,Mandie,mwailes75@answers.com +259,Golling,Pauly,pgolling76@patch.com +260,Owbrick,Giorgia,gowbrick77@economist.com +261,Cheyenne,Hana,hcheyenne78@google.fr +262,Lappine,Ivie,ilappine79@shutterfly.com +263,Kunath,Hermina,hkunath7a@weather.com +264,Nolli,Humbert,hnolli7b@wsj.com +265,McCosker,Ahmed,amccosker7c@cnn.com +266,Bolstridge,Lindie,lbolstridge7d@unicef.org +267,Caudray,Glory,gcaudray7e@skyrock.com +268,Durram,Claudian,cdurram7f@ucoz.com +269,Tomczak,Calley,ctomczak7g@samsung.com +270,Zannutti,Madelon,mzannutti7h@va.gov +271,Pontain,Elmira,epontain7i@cam.ac.uk +272,Wantling,Olga,owantling7j@shinystat.com +273,Giddy,Fayette,fgiddy7k@bravesites.com +274,Hydes,Fedora,fhydes7l@amazon.de +275,Ettery,Ozzie,oettery7m@nasa.gov +276,Rosenwald,Gayle,grosenwald7n@icio.us +277,Woolforde,Valli,vwoolforde7o@flavors.me +278,Cadman,Julissa,jcadman7p@bbb.org +279,Drexel,Gerhardt,gdrexel7q@disqus.com +280,Farquarson,Colman,cfarquarson7r@oracle.com +281,Byham,Paulina,pbyham7s@ibm.com +282,Pietrzak,Letty,lpietrzak7t@flickr.com +283,Blowers,Gage,gblowers7u@sitemeter.com +284,Roser,Carce,croser7v@arstechnica.com +285,Codling,Ricard,rcodling7w@mapquest.com +286,Dabel,Morly,mdabel7x@goodreads.com +287,Macallam,Henrietta,hmacallam7y@1und1.de +288,Langabeer,Otha,olangabeer7z@purevolume.com +289,Klasen,Stuart,sklasen80@prweb.com +290,Depka,Brenna,bdepka81@nbcnews.com +291,Edmenson,Clarice,cedmenson82@seattletimes.com +292,Stuckley,Vicki,vstuckley83@people.com.cn +293,Van't Hoff,Ervin,evanthoff84@earthlink.net +294,Eakin,Clarey,ceakin85@arstechnica.com +295,Melonby,Hattie,hmelonby86@homestead.com +296,Mehew,Karole,kmehew87@themeforest.net +297,Gillion,Bancroft,bgillion88@omniture.com +298,Sibary,Lyndsie,lsibary89@is.gd +299,Baggally,Kathye,kbaggally8a@japanpost.jp +300,Cecely,Joete,jcecely8b@123-reg.co.uk +301,Eames,Estrella,eeames8c@slate.com +302,Hynde,Nicol,nhynde8d@sitemeter.com +303,Cathel,Kristin,kcathel8e@wiley.com +304,Oolahan,Carol-jean,coolahan8f@nytimes.com +305,Senecaux,Agustin,asenecaux8g@behance.net +306,McIlory,Lamont,lmcilory8h@ucoz.ru +307,Harms,Artemis,aharms8i@phpbb.com +308,Dalyiel,Ferdy,fdalyiel8j@drupal.org +309,Yakebovich,Xylina,xyakebovich8k@bravesites.com +310,Yokel,Lauraine,lyokel8l@pinterest.com +311,Barrington,Benetta,bbarrington8m@spiegel.de +312,Nolan,Debee,dnolan8n@ovh.net +313,Spellworth,Nicky,nspellworth8o@archive.org +314,Harget,Therine,tharget8p@mapy.cz +315,Pitceathly,Daveen,dpitceathly8q@naver.com +316,Whittleton,Astra,awhittleton8r@nymag.com +317,Lafontaine,Gratiana,glafontaine8s@parallels.com +318,Cathesyed,Kalila,kcathesyed8t@1688.com +319,Berg,Nev,nberg8u@weebly.com +320,Borkin,Udale,uborkin8v@canalblog.com +321,Scriven,Donnell,dscriven8w@abc.net.au +322,Paulucci,Lanny,lpaulucci8x@slate.com +323,Daubeny,Raychel,rdaubeny8y@slideshare.net +324,Casford,Ranee,rcasford8z@tinypic.com +325,Mealham,Eadith,emealham90@godaddy.com +326,Godin,Nanine,ngodin91@state.gov +327,Jeannin,Kris,kjeannin92@apple.com +328,Schober,Avril,aschober93@stanford.edu +329,Tuohy,Hyacinthie,htuohy94@illinois.edu +330,Huxtable,Adiana,ahuxtable95@wix.com +331,Buffin,Constantina,cbuffin96@nhs.uk +332,Matusevich,Robinet,rmatusevich97@cornell.edu +333,Menham,Theressa,tmenham98@myspace.com +334,Splain,Wolfie,wsplain99@house.gov +335,Bastable,Davidde,dbastable9a@comcast.net +336,Scollan,Berti,bscollan9b@barnesandnoble.com +337,Gladman,Selle,sgladman9c@dailymotion.com +338,Fulford,Kass,kfulford9d@tiny.cc +339,Angric,Tamara,tangric9e@addthis.com +340,Boarleyson,Archie,aboarleyson9f@freewebs.com +341,Trevaskus,Melody,mtrevaskus9g@goo.ne.jp +342,Hovenden,Melva,mhovenden9h@alexa.com +343,Wand,Koral,kwand9i@harvard.edu +344,Dowderswell,Caspar,cdowderswell9j@livejournal.com +345,Darcy,Jarad,jdarcy9k@wikipedia.org +346,Gillanders,Bent,bgillanders9l@ning.com +347,Laroux,Joanie,jlaroux9m@parallels.com +348,Berriman,Vivien,vberriman9n@gnu.org +349,Di Frisco,Fredra,fdifrisco9o@slate.com +350,Simoneschi,Kirstyn,ksimoneschi9p@google.de +351,Brayshay,Vasili,vbrayshay9q@phoca.cz +352,Vallance,Evan,evallance9r@ftc.gov +353,Tubritt,Clary,ctubritt9s@pinterest.com +354,Baddoe,Lishe,lbaddoe9t@auda.org.au +355,Large,Estel,elarge9u@hc360.com +356,Lamblin,Adriane,alamblin9v@craigslist.org +357,Sandall,Ring,rsandall9w@pagesperso-orange.fr +358,Reading,Gisele,greading9x@addthis.com +359,Leedal,Ellyn,eleedal9y@cdbaby.com +360,Polino,Bob,bpolino9z@issuu.com +361,Clewley,Rockey,rclewleya0@microsoft.com +362,Chasle,Lauretta,lchaslea1@mac.com +363,Burgot,Barry,bburgota2@example.com +364,Geffcock,Hortense,hgeffcocka3@loc.gov +365,Zorzenoni,Thedrick,tzorzenonia4@cyberchimps.com +366,Chidlow,Andreas,achidlowa5@artisteer.com +367,Weatherdon,Sharl,sweatherdona6@mysql.com +368,Gleeton,Clair,cgleetona7@hostgator.com +369,Pennone,Benedick,bpennonea8@shutterfly.com +370,Jiroutka,Katey,kjiroutkaa9@msn.com +371,Glastonbury,Kenn,kglastonburyaa@barnesandnoble.com +372,Mewett,Melinde,mmewettab@pagesperso-orange.fr +373,Bernardino,Rose,rbernardinoac@1und1.de +374,Mitkov,Donetta,dmitkovad@latimes.com +375,Mourant,Constantin,cmourantae@redcross.org +376,Rivitt,Chandra,crivittaf@patch.com +377,Abrahamsson,Michel,mabrahamssonag@amazon.com +378,Clemenson,Matthew,mclemensonah@smh.com.au +379,Flear,Lucky,lflearai@ft.com +380,Couronne,Corella,ccouronneaj@addthis.com +381,Beswell,Dur,dbeswellak@prnewswire.com +382,Cottham,Diandra,dcotthamal@dmoz.org +383,O'Crevan,Barret,bocrevanam@walmart.com +384,Meadley,Mohandis,mmeadleyan@xrea.com +385,Backhouse,Lorrin,lbackhouseao@trellian.com +386,Dyke,Norean,ndykeap@spiegel.de +387,Dray,Jackquelin,jdrayaq@xrea.com +388,Apthorpe,Osbourn,oapthorpear@1688.com +389,Elster,Becca,belsteras@blogger.com +390,Kneafsey,Bartolemo,bkneafseyat@domainmarket.com +391,Brisley,Garrard,gbrisleyau@bigcartel.com +392,Farnie,Danny,dfarnieav@dedecms.com +393,Denekamp,Thorvald,tdenekampaw@theguardian.com +394,Berling,Bel,bberlingax@fema.gov +395,Hutchison,Paco,phutchisonay@ucoz.ru +396,Yurchenko,Clo,cyurchenkoaz@cmu.edu +397,Cray,Nanci,ncrayb0@blogspot.com +398,Tarply,Thane,ttarplyb1@vkontakte.ru +399,Lismore,Angela,alismoreb2@ning.com +400,Carneck,Timothee,tcarneckb3@forbes.com +401,Ropartz,Abdul,aropartzb4@slashdot.org +402,Kittman,Kilian,kkittmanb5@about.com +403,Gillean,Liuka,lgilleanb6@msu.edu +404,Allum,Zach,zallumb7@printfriendly.com +405,Timmes,Petey,ptimmesb8@marriott.com +406,Janouch,Jeth,jjanouchb9@joomla.org +407,Ellaman,Lyn,lellamanba@msn.com +408,Trevan,Wally,wtrevanbb@gnu.org +409,Garrelts,Urban,ugarreltsbc@pinterest.com +410,Anniwell,Ingra,ianniwellbd@pbs.org +411,Goly,Hodge,hgolybe@intel.com +412,Yusupov,Hester,hyusupovbf@usgs.gov +413,Townley,Austina,atownleybg@php.net +414,Gatley,Arabele,agatleybh@amazon.com +415,Shermar,Adelheid,ashermarbi@nhs.uk +416,Perrygo,Lorry,lperrygobj@who.int +417,Pickle,Ivor,ipicklebk@ameblo.jp +418,Low,Gregoor,glowbl@guardian.co.uk +419,Greatrex,Tore,tgreatrexbm@i2i.jp +420,Flecknell,Ardelia,aflecknellbn@yahoo.com +421,Udell,Otes,oudellbo@blog.com +422,Rennick,Joela,jrennickbp@mediafire.com +423,Bastin,Faina,fbastinbq@sakura.ne.jp +424,Eisikovitsh,Yelena,yeisikovitshbr@phoca.cz +425,Frend,Morley,mfrendbs@biblegateway.com +426,Ploughwright,Kacy,kploughwrightbt@aboutads.info +427,D'Aguanno,Ewart,edaguannobu@w3.org +428,Asple,Nicki,nasplebv@fema.gov +429,Randle,Bessy,brandlebw@nbcnews.com +430,Stripp,Leesa,lstrippbx@constantcontact.com +431,Sanderson,Filide,fsandersonby@phpbb.com +432,Harryman,Dante,dharrymanbz@wikispaces.com +433,Auchterlony,Taryn,tauchterlonyc0@ehow.com +434,Brellin,Dennie,dbrellinc1@addtoany.com +435,Feaster,Rafaelita,rfeasterc2@soundcloud.com +436,Suston,Sallee,ssustonc3@wsj.com +437,Shaefer,Cornela,cshaeferc4@360.cn +438,Hallad,Elysee,ehalladc5@privacy.gov.au +439,Burnep,Bili,bburnepc6@umich.edu +440,Kidner,Rasla,rkidnerc7@diigo.com +441,Evetts,Alyda,aevettsc8@bravesites.com +442,MacEnelly,Elmer,emacenellyc9@digg.com +443,McDavid,Torie,tmcdavidca@princeton.edu +444,Hagstone,Ripley,rhagstonecb@kickstarter.com +445,Goodread,Kittie,kgoodreadcc@independent.co.uk +446,Grishanin,Arnie,agrishanincd@tripod.com +447,Rushbrooke,Rog,rrushbrookece@indiatimes.com +448,Howood,Tally,thowoodcf@taobao.com +449,Antecki,Rowland,ranteckicg@tmall.com +450,Kinmond,Nicola,nkinmondch@spiegel.de +451,Lambeth,Anette,alambethci@virginia.edu +452,Kitlee,Nev,nkitleecj@1688.com +453,Ollie,Tessi,tollieck@jiathis.com +454,Trengrove,Falkner,ftrengrovecl@intel.com +455,Lattin,Menard,mlattincm@fotki.com +456,Fenech,Ketti,kfenechcn@mlb.com +457,Lauritzen,Clementius,clauritzenco@comcast.net +458,Marvelley,Innis,imarvelleycp@virginia.edu +459,Matokhnin,Paola,pmatokhnincq@statcounter.com +460,Wasteney,Sheelah,swasteneycr@forbes.com +461,Vanshin,Willyt,wvanshincs@aboutads.info +462,Hurt,Osborn,ohurtct@multiply.com +463,Wessell,Hermine,hwessellcu@altervista.org +464,Rustman,Dodie,drustmancv@go.com +465,Kester,Web,wkestercw@booking.com +466,Moland,Ardenia,amolandcx@simplemachines.org +467,Milham,Elaine,emilhamcy@mit.edu +468,Clohisey,Barbara,bclohiseycz@businessinsider.com +469,Pickvance,Izaak,ipickvanced0@goo.ne.jp +470,Flowitt,Callie,cflowittd1@wisc.edu +471,Loan,Cathrin,cloand2@reuters.com +472,Peris,Joyann,jperisd3@dyndns.org +473,Lafee,Paule,plafeed4@oaic.gov.au +474,Asche,Tyson,tasched5@alibaba.com +475,Persehouse,Gabriela,gpersehoused6@simplemachines.org +476,Cheer,Vassily,vcheerd7@patch.com +477,Shortt,Alisander,ashorttd8@google.cn +478,Simm,Rawley,rsimmd9@mac.com +479,Rumgay,Carney,crumgayda@ustream.tv +480,Occleshaw,Elinore,eoccleshawdb@vkontakte.ru +481,Gaze,Madelin,mgazedc@theguardian.com +482,Bowsher,Rahal,rbowsherdd@mashable.com +483,Haseldine,Dierdre,dhaseldinede@msn.com +484,Beals,Marmaduke,mbealsdf@mysql.com +485,Jordi,Christalle,cjordidg@utexas.edu +486,Rodenburg,Annabelle,arodenburgdh@unicef.org +487,Scrine,Brade,bscrinedi@creativecommons.org +488,Bignal,Randolph,rbignaldj@mlb.com +489,Bramwich,Toby,tbramwichdk@goodreads.com +490,Evitt,Betsy,bevittdl@nsw.gov.au +491,Piddock,Franky,fpiddockdm@biblegateway.com +492,Paulus,Quinn,qpaulusdn@ow.ly +493,Bahia,Cristina,cbahiado@wikia.com +494,Toun,Petronella,ptoundp@newyorker.com +495,MacConchie,Brina,bmacconchiedq@reuters.com +496,Dummigan,Bastien,bdummigandr@t-online.de +497,Mathew,Amos,amathewds@cdbaby.com +498,O'Shiels,Truda,toshielsdt@yelp.com +499,Keat,Ettie,ekeatdu@phoca.cz +500,Benjamin,Mendie,mbenjamindv@ovh.net +501,Le Grand,Sherline,slegranddw@harvard.edu +502,Rosenboim,Goldi,grosenboimdx@tripadvisor.com +503,Openshaw,Waring,wopenshawdy@cnbc.com +504,Sabater,Maryjane,msabaterdz@who.int +505,Arnolds,Eudora,earnoldse0@tumblr.com +506,Chatelot,Fawne,fchatelote1@shareasale.com +507,Paffley,Ambrosi,apaffleye2@phoca.cz +508,Debrett,Donal,ddebrette3@patch.com +509,Durante,Elianora,edurantee4@cafepress.com +510,Kupper,Cordie,ckuppere5@wired.com +511,Barbe,Cordey,cbarbee6@chicagotribune.com +512,cornhill,Lauralee,lcornhille7@pcworld.com +513,Blanden,Tadeo,tblandene8@cnet.com +514,Dent,Juliette,jdente9@ucla.edu +515,Farish,Selia,sfarishea@pen.io +516,Mapson,Vittorio,vmapsoneb@baidu.com +517,Laurence,August,alaurenceec@narod.ru +518,Buglar,Sofie,sbuglared@pagesperso-orange.fr +519,Stonman,Mirabel,mstonmanee@google.ru +520,Luffman,Sibyl,sluffmanef@ed.gov +521,Cancellieri,Roslyn,rcancellierieg@exblog.jp +522,Matuszkiewicz,Colman,cmatuszkiewiczeh@live.com +523,Crumley,Starr,scrumleyei@berkeley.edu +524,Hamor,Rorke,rhamorej@bizjournals.com +525,Piel,Adiana,apielek@bluehost.com +526,Sharrocks,Nelson,nsharrocksel@seattletimes.com +527,Duffie,Devonne,dduffieem@shareasale.com +528,Kuhnhardt,Rozanne,rkuhnhardten@vinaora.com +529,Gamlin,Goober,ggamlineo@angelfire.com +530,Polhill,Shelley,spolhillep@va.gov +531,Breache,Lula,lbreacheeq@123-reg.co.uk +532,Hinge,Augustina,ahingeer@cpanel.net +533,Durtnel,Keven,kdurtneles@php.net +534,Satchel,Stu,ssatchelet@unicef.org +535,Ciccone,Lenee,lcicconeeu@dailymail.co.uk +536,Danilov,Shannon,sdanilovev@weather.com +537,Cressor,Saleem,scressorew@nyu.edu +538,Huggin,Nicolette,nhugginex@japanpost.jp +539,MacAlpine,Lorrin,lmacalpineey@so-net.ne.jp +540,Lant,Adelbert,alantez@mac.com +541,Gethins,Freida,fgethinsf0@blogger.com +542,Maceur,Bert,bmaceurf1@salon.com +543,Kacheller,Karly,kkachellerf2@cbc.ca +544,Arnoll,Malinda,marnollf3@go.com +545,Lehrian,Raynor,rlehrianf4@cpanel.net +546,Stickford,Mella,mstickfordf5@fotki.com +547,Longfield,Laurice,llongfieldf6@multiply.com +548,Sanpher,Ray,rsanpherf7@edublogs.org +549,Moscrop,Gradeigh,gmoscropf8@storify.com +550,Margerison,Franni,fmargerisonf9@icq.com +551,Ketton,Rolf,rkettonfa@harvard.edu +552,Benka,Leanora,lbenkafb@google.de +553,Tyrie,Jamil,jtyriefc@time.com +554,Minchinden,Clair,cminchindenfd@youtu.be +555,Ivie,Griswold,giviefe@people.com.cn +556,Maine,Kimberlee,kmaineff@google.ru +557,Stilgoe,Madge,mstilgoefg@linkedin.com +558,Potbury,Donny,dpotburyfh@cnn.com +559,Ciccotto,Breanne,bciccottofi@unicef.org +560,Trout,Crawford,ctroutfj@is.gd +561,Mildmott,Niki,nmildmottfk@spotify.com +562,Tomaszek,Sibilla,stomaszekfl@ucsd.edu +563,Hrishchenko,Silas,shrishchenkofm@marketwatch.com +564,Scarsbrooke,Kenny,kscarsbrookefn@hud.gov +565,Cunnington,Yolane,ycunningtonfo@washingtonpost.com +566,Calloway,Evita,ecallowayfp@mozilla.com +567,Claus,Minny,mclausfq@bluehost.com +568,Straine,Kathi,kstrainefr@merriam-webster.com +569,Taffrey,Katee,ktaffreyfs@nps.gov +570,Giggie,Tabbie,tgiggieft@whitehouse.gov +571,McParlin,Onofredo,omcparlinfu@microsoft.com +572,Darthe,Anselma,adarthefv@liveinternet.ru +573,Dewey,Aron,adeweyfw@yahoo.com +574,Dyke,Ray,rdykefx@about.com +575,Chellam,Constanta,cchellamfy@hhs.gov +576,Cleaveland,Lane,lcleavelandfz@w3.org +577,Raisbeck,Jeanette,jraisbeckg0@google.co.jp +578,Halton,Caz,chaltong1@usa.gov +579,Blyth,Armstrong,ablythg2@netlog.com +580,Napoleone,Suzette,snapoleoneg3@trellian.com +581,Vaar,Elie,evaarg4@biglobe.ne.jp +582,Arnoll,Frasier,farnollg5@microsoft.com +583,Pinhorn,Gareth,gpinhorng6@japanpost.jp +584,Peppard,Dorotea,dpeppardg7@arstechnica.com +585,Rowe,Hali,hroweg8@arstechnica.com +586,Crow,Gawain,gcrowg9@gmpg.org +587,Troughton,Eliot,etroughtonga@blogtalkradio.com +588,Fardon,Victor,vfardongb@springer.com +589,Rumin,Nester,nrumingc@hud.gov +590,Chellingworth,Nata,nchellingworthgd@com.com +591,Poore,Mia,mpoorege@tinypic.com +592,Robottom,Hester,hrobottomgf@ycombinator.com +593,Farnish,Hermy,hfarnishgg@live.com +594,Wasiel,Dode,dwasielgh@paginegialle.it +595,Elves,Jo,jelvesgi@ocn.ne.jp +596,Bradder,Erin,ebraddergj@merriam-webster.com +597,Curton,Yasmeen,ycurtongk@fotki.com +598,McGrill,Domenic,dmcgrillgl@123-reg.co.uk +599,Kevane,Ervin,ekevanegm@biblegateway.com +600,Studdard,Andra,astuddardgn@walmart.com +601,Misken,Georgy,gmiskengo@cornell.edu +602,Gallier,Shaw,sgalliergp@examiner.com +603,Benedicte,Meryl,mbenedictegq@ted.com +604,Goodby,Kaine,kgoodbygr@mediafire.com +605,Jessope,Thornie,tjessopegs@house.gov +606,Woolens,Donaugh,dwoolensgt@ning.com +607,Chapelhow,Sonnie,schapelhowgu@ted.com +608,Boeter,Padraig,pboetergv@desdev.cn +609,Springtorpe,Hanni,hspringtorpegw@barnesandnoble.com +610,Kilmaster,Fidole,fkilmastergx@google.co.jp +611,Slot,Dona,dslotgy@about.com +612,Baldick,Chucho,cbaldickgz@unicef.org +613,Asp,Zachary,zasph0@wp.com +614,Swalowe,Malynda,mswaloweh1@thetimes.co.uk +615,Lockery,Carmelita,clockeryh2@bbc.co.uk +616,Cauderlie,Evita,ecauderlieh3@intel.com +617,Stuttard,Jude,jstuttardh4@jalbum.net +618,Volker,Ailbert,avolkerh5@networkadvertising.org +619,Mulliss,Leontyne,lmullissh6@histats.com +620,Stearndale,Adelind,astearndaleh7@people.com.cn +621,Daish,Torrin,tdaishh8@360.cn +622,Buntain,Albertine,abuntainh9@mtv.com +623,Stride,Marlo,mstrideha@paginegialle.it +624,Cleen,Kaycee,kcleenhb@51.la +625,Killiam,Ermin,ekilliamhc@state.gov +626,Garrison,Woodrow,wgarrisonhd@google.com.br +627,Wadge,Barclay,bwadgehe@odnoklassniki.ru +628,Felstead,Ceil,cfelsteadhf@unc.edu +629,Raft,Curt,crafthg@ask.com +630,Castagnasso,Rheta,rcastagnassohh@ask.com +631,Climo,Michel,mclimohi@cloudflare.com +632,Whybray,Kristofer,kwhybrayhj@boston.com +633,Fletcher,Betteann,bfletcherhk@cnbc.com +634,Pasmore,De witt,dpasmorehl@msn.com +635,Maskill,Alejandrina,amaskillhm@unc.edu +636,Macartney,Michaela,mmacartneyhn@nasa.gov +637,Girton,Geoffrey,ggirtonho@xinhuanet.com +638,Gracey,Lilli,lgraceyhp@un.org +639,Cassin,Dukie,dcassinhq@mashable.com +640,Beere,Cosetta,cbeerehr@eepurl.com +641,Whittles,Carol,cwhittleshs@nba.com +642,Hairsine,Shirleen,shairsineht@google.com +643,Cortes,Ardisj,acorteshu@ezinearticles.com +644,Itzchaky,Henka,hitzchakyhv@gmpg.org +645,Yetton,Blair,byettonhw@51.la +646,Robel,Garvey,grobelhx@weebly.com +647,Belcham,Fairleigh,fbelchamhy@csmonitor.com +648,Arblaster,Colline,carblasterhz@technorati.com +649,Dirand,Garnet,gdirandi0@bandcamp.com +650,Ditts,Everard,edittsi1@live.com +651,Heinonen,Roobbie,rheinoneni2@mayoclinic.com +652,Arbor,Nicolina,narbori3@hibu.com +653,Folley,Whitney,wfolleyi4@usgs.gov +654,Colly,Tamar,tcollyi5@example.com +655,Tesh,Misti,mteshi6@hud.gov +656,Gehricke,Gram,ggehrickei7@mozilla.com +657,Grishelyov,Phip,pgrishelyovi8@nps.gov +658,Stothart,Lorrie,lstotharti9@dot.gov +659,Hanscom,Ronnie,rhanscomia@ycombinator.com +660,Lerego,Marj,mleregoib@newsvine.com +661,Gidman,Boigie,bgidmanic@weather.com +662,Barke,Lorrie,lbarkeid@bluehost.com +663,Burkin,Field,fburkinie@mayoclinic.com +664,Colloff,Correna,ccolloffif@youku.com +665,Licciardiello,Bertine,blicciardielloig@java.com +666,Pocke,Rachelle,rpockeih@deviantart.com +667,Udall,Cletis,cudallii@biglobe.ne.jp +668,Parlet,Ginny,gparletij@un.org +669,Sherrard,Erie,esherrardik@ftc.gov +670,Bottoms,Jens,jbottomsil@blogspot.com +671,Beardwell,Yanaton,ybeardwellim@sogou.com +672,Kidson,Eveleen,ekidsonin@ebay.co.uk +673,Edison,Aldin,aedisonio@accuweather.com +674,Guyer,Winne,wguyerip@themeforest.net +675,Bernardot,Lucretia,lbernardotiq@mtv.com +676,Shellcross,Marcella,mshellcrossir@utexas.edu +677,Marquet,Loella,lmarquetis@bluehost.com +678,MacCracken,Nicki,nmaccrackenit@webeden.co.uk +679,McGirl,Angelika,amcgirliu@deviantart.com +680,Giovannardi,Eduard,egiovannardiiv@hugedomains.com +681,Lovekin,Hartwell,hlovekiniw@netvibes.com +682,Heindrich,Chanda,cheindrichix@nationalgeographic.com +683,Riccardi,Lenka,lriccardiiy@1und1.de +684,Boothe,Mario,mbootheiz@wordpress.org +685,Durkin,Trudie,tdurkinj0@opensource.org +686,Tomasz,Tybie,ttomaszj1@bravesites.com +687,Dadd,Guillaume,gdaddj2@fema.gov +688,Hassen,Beatrix,bhassenj3@time.com +689,Caseri,Maude,mcaserij4@devhub.com +690,Stebbings,Ilsa,istebbingsj5@unc.edu +691,Romagosa,Stephenie,sromagosaj6@moonfruit.com +692,Losel,Fritz,floselj7@addtoany.com +693,Parres,Lizette,lparresj8@yellowbook.com +694,Do,Adrea,adoj9@cornell.edu +695,Gabler,Adelice,agablerja@barnesandnoble.com +696,Dedenham,Jammal,jdedenhamjb@npr.org +697,Bresson,Bianca,bbressonjc@mtv.com +698,Trousdell,Baxie,btrousdelljd@archive.org +699,Metzel,Iris,imetzelje@ted.com +700,Phant,Rosabella,rphantjf@ihg.com +701,Betjeman,Sheff,sbetjemanjg@nature.com +702,Lakes,Farleigh,flakesjh@squarespace.com +703,McCrillis,Othilie,omccrillisji@omniture.com +704,Monery,Florencia,fmoneryjj@whitehouse.gov +705,Stearley,Sapphira,sstearleyjk@netscape.com +706,Brunotti,Annabelle,abrunottijl@de.vu +707,Pellew,Myra,mpellewjm@technorati.com +708,Hiddersley,Margret,mhiddersleyjn@slideshare.net +709,Botha,Rafe,rbothajo@gov.uk +710,Klishin,Blondelle,bklishinjp@earthlink.net +711,Bertelet,Lettie,lberteletjq@mozilla.com +712,Dykins,Vivianne,vdykinsjr@java.com +713,Rase,Archibold,arasejs@goo.gl +714,Mucklo,Carly,cmucklojt@live.com +715,Deinhard,Helene,hdeinhardju@dedecms.com +716,Arstingall,Luciana,larstingalljv@ucoz.ru +717,Pull,Maren,mpulljw@google.com.hk +718,Darville,Temple,tdarvillejx@google.fr +719,Zuker,Margarette,mzukerjy@posterous.com +720,Mongin,Deanna,dmonginjz@huffingtonpost.com +721,Schutt,Stephani,sschuttk0@wufoo.com +722,Wombwell,Tallia,twombwellk1@paypal.com +723,Southard,Arty,asouthardk2@adobe.com +724,Krystek,Nedi,nkrystekk3@blog.com +725,Corradetti,Belia,bcorradettik4@businessweek.com +726,Dreelan,Nert,ndreelank5@ibm.com +727,Dederich,Kennith,kdederichk6@irs.gov +728,Chevalier,Cassandre,cchevalierk7@walmart.com +729,Ferrai,Katinka,kferraik8@e-recht24.de +730,Laborda,Mattias,mlabordak9@businessweek.com +731,Doutch,Ross,rdoutchka@joomla.org +732,Dencs,Morten,mdencskb@dailymail.co.uk +733,Greener,Haleigh,hgreenerkc@unicef.org +734,Nassy,Tedd,tnassykd@google.com.hk +735,Tregien,Emmy,etregienke@purevolume.com +736,Minton,Teodor,tmintonkf@independent.co.uk +737,Yosifov,Verna,vyosifovkg@nbcnews.com +738,Brittoner,Maure,mbrittonerkh@illinois.edu +739,Prahm,Hubert,hprahmki@angelfire.com +740,Vose,Elisabetta,evosekj@histats.com +741,Swinglehurst,Mariette,mswinglehurstkk@businessinsider.com +742,D'Aguanno,Rutter,rdaguannokl@soup.io +743,Keer,Mickey,mkeerkm@sciencedaily.com +744,Rabley,Margeaux,mrableykn@merriam-webster.com +745,Klaus,Julianna,jklausko@networksolutions.com +746,Middle,Renata,rmiddlekp@nature.com +747,MacCrossan,Margot,mmaccrossankq@marriott.com +748,Hillin,Carr,chillinkr@cafepress.com +749,Grewe,Waylon,wgreweks@rambler.ru +750,Ranshaw,Heidie,hranshawkt@delicious.com +751,Rhyme,Adan,arhymeku@liveinternet.ru +752,Chisman,Shaine,schismankv@hhs.gov +753,Reeders,Honor,hreederskw@jimdo.com +754,Seedull,Frances,fseedullkx@xinhuanet.com +755,Tremoulet,Grier,gtremouletky@purevolume.com +756,Sleet,Tiffi,tsleetkz@cdbaby.com +757,Frigout,Caro,cfrigoutl0@npr.org +758,Kepe,Englebert,ekepel1@nbcnews.com +759,Dreier,Orly,odreierl2@myspace.com +760,Oates,Lacey,loatesl3@t.co +761,Minihan,Hagen,hminihanl4@dropbox.com +762,Guidelli,Hasheem,hguidellil5@simplemachines.org +763,Primett,Clair,cprimettl6@intel.com +764,Redman,Lily,lredmanl7@cnn.com +765,Kellick,Skipp,skellickl8@blogger.com +766,Rumming,Elsie,erummingl9@blogger.com +767,Tidbold,Herrick,htidboldla@booking.com +768,Caldairou,Norri,ncaldairoulb@marketwatch.com +769,Sadat,Caye,csadatlc@blinklist.com +770,Grishin,Vickie,vgrishinld@shareasale.com +771,Mulroy,Milzie,mmulroyle@jigsy.com +772,Collman,Alex,acollmanlf@bloglovin.com +773,Archambault,Thacher,tarchambaultlg@webs.com +774,Missenden,Hertha,hmissendenlh@zdnet.com +775,Bau,Alphonse,abauli@networksolutions.com +776,Cornish,Larisa,lcornishlj@nytimes.com +777,Strete,Stirling,sstretelk@ftc.gov +778,Kierans,Clio,ckieransll@microsoft.com +779,Fliege,Nikolaos,nfliegelm@wikia.com +780,Bourget,Sunshine,sbourgetln@amazonaws.com +781,Hoonahan,Kellen,khoonahanlo@arstechnica.com +782,Duddy,Neel,nduddylp@fc2.com +783,Johl,Olivia,ojohllq@theatlantic.com +784,Clementucci,Normy,nclementuccilr@oakley.com +785,Excell,Melesa,mexcellls@wordpress.com +786,Linden,Min,mlindenlt@newsvine.com +787,Bosdet,Raphael,rbosdetlu@marketwatch.com +788,Ferrao,Yorgos,yferraolv@mashable.com +789,Trenoweth,Meara,mtrenowethlw@telegraph.co.uk +790,Pedler,Anitra,apedlerlx@freewebs.com +791,Sommerscales,Shandra,ssommerscalesly@abc.net.au +792,Skillett,Adaline,askillettlz@goo.gl +793,Hiorn,Alexandros,ahiornm0@edublogs.org +794,Parris,Christina,cparrism1@livejournal.com +795,Rosenkranc,Pryce,prosenkrancm2@com.com +796,Dunstan,Sandy,sdunstanm3@hexun.com +797,Hebble,Vivienne,vhebblem4@posterous.com +798,Lane,Lilia,llanem5@cbslocal.com +799,Dewhurst,Roi,rdewhurstm6@wiley.com +800,Dahmke,Valentine,vdahmkem7@yandex.ru +801,Lupton,Eugene,eluptonm8@rambler.ru +802,Maccraw,Dyann,dmaccrawm9@delicious.com +803,Mowling,Kyle,kmowlingma@weibo.com +804,Flag,Davina,dflagmb@fema.gov +805,Venes,Urson,uvenesmc@sohu.com +806,Jeanenet,Zed,zjeanenetmd@toplist.cz +807,Robardley,Fergus,frobardleyme@friendfeed.com +808,Avieson,Ferdinande,faviesonmf@ebay.co.uk +809,Donaho,Deb,ddonahomg@newyorker.com +810,Plak,Terza,tplakmh@uiuc.edu +811,Doumerc,Danyette,ddoumercmi@uol.com.br +812,Windows,Courtnay,cwindowsmj@europa.eu +813,Hardington,Shanie,shardingtonmk@chronoengine.com +814,Burdus,Nollie,nburdusml@so-net.ne.jp +815,Narramor,Thaine,tnarramormm@php.net +816,Slyne,Deny,dslynemn@opera.com +817,Upwood,Conrado,cupwoodmo@nba.com +818,Warburton,Randee,rwarburtonmp@mit.edu +819,Berndsen,Sutherland,sberndsenmq@hud.gov +820,Faers,Isidore,ifaersmr@forbes.com +821,Djurkovic,Linnea,ldjurkovicms@google.com.hk +822,Licciardo,Hugues,hlicciardomt@gnu.org +823,Ninotti,Dore,dninottimu@amazon.co.jp +824,Peterkin,Marisa,mpeterkinmv@toplist.cz +825,Barnet,Lilly,lbarnetmw@wisc.edu +826,Darbey,Hertha,hdarbeymx@ning.com +827,Blackeby,Ricky,rblackebymy@ed.gov +828,MacConnell,Leda,lmacconnellmz@pcworld.com +829,Corballis,Minta,mcorballisn0@biblegateway.com +830,Kearle,Karim,kkearlen1@fastcompany.com +831,Anthill,Dixie,danthilln2@columbia.edu +832,Baggally,Barnabe,bbaggallyn3@elegantthemes.com +833,Winkett,Latashia,lwinkettn4@cisco.com +834,Kleingrub,Gianna,gkleingrubn5@businessinsider.com +835,King,Devina,dkingn6@noaa.gov +836,Abbate,Gelya,gabbaten7@un.org +837,Dickens,Caresse,cdickensn8@canalblog.com +838,Standen,Reggie,rstandenn9@symantec.com +839,Docherty,Francine,fdochertyna@altervista.org +840,Beecham,Darb,dbeechamnb@histats.com +841,Burdon,Dulcine,dburdonnc@lulu.com +842,Kesteven,Nathalia,nkestevennd@sphinn.com +843,Linstead,Carmencita,clinsteadne@shinystat.com +844,Gomme,Keelia,kgommenf@dropbox.com +845,Gaspard,Pearline,pgaspardng@purevolume.com +846,Raeburn,Taryn,traeburnnh@desdev.cn +847,Gooders,L;urette,lgoodersni@cpanel.net +848,Jerram,Dael,djerramnj@nbcnews.com +849,Bertl,Enriqueta,ebertlnk@theguardian.com +850,Monni,Shandie,smonninl@jimdo.com +851,Pointer,Aldridge,apointernm@cbsnews.com +852,Brett,Curran,cbrettnn@fc2.com +853,Antognetti,Tricia,tantognettino@netlog.com +854,Cossentine,Giffard,gcossentinenp@java.com +855,Jonin,Gallard,gjoninnq@google.co.jp +856,Hames,Carlen,chamesnr@list-manage.com +857,Beeken,Dedra,dbeekenns@sohu.com +858,Van den Oord,Chicky,cvandenoordnt@cbc.ca +859,Yashnov,Godard,gyashnovnu@netscape.com +860,Waterland,Arlyne,awaterlandnv@example.com +861,Fairholme,Dulcinea,dfairholmenw@epa.gov +862,Sheepy,Gelya,gsheepynx@bloomberg.com +863,Doige,Byron,bdoigeny@creativecommons.org +864,Spiers,Garald,gspiersnz@sogou.com +865,Maxwaile,Shellie,smaxwaileo0@last.fm +866,Budden,Rivy,rbuddeno1@bloomberg.com +867,Dominique,Jo-ann,jdominiqueo2@npr.org +868,Brunning,Wilmette,wbrunningo3@xrea.com +869,Bouette,Tedi,tbouetteo4@prlog.org +870,Ricardot,Reese,rricardoto5@bluehost.com +871,Ianilli,Mirelle,mianillio6@skyrock.com +872,Piborn,Betty,bpiborno7@quantcast.com +873,Oakenfield,Hamel,hoakenfieldo8@umn.edu +874,Jobb,Neron,njobbo9@examiner.com +875,Burchard,Glyn,gburchardoa@ameblo.jp +876,Kindell,Isabella,ikindellob@cornell.edu +877,Aspenlon,Chaim,caspenlonoc@wiley.com +878,Blonfield,Ilario,iblonfieldod@yellowpages.com +879,Simek,Paquito,psimekoe@hubpages.com +880,Garrioch,Sara-ann,sgarriochof@google.com.br +881,MacKowle,Orton,omackowleog@creativecommons.org +882,Mulberry,Ashli,amulberryoh@sciencedaily.com +883,Portugal,Elvin,eportugaloi@timesonline.co.uk +884,Milton-White,Wandis,wmiltonwhiteoj@netvibes.com +885,Gissop,Reuven,rgissopok@google.pl +886,Chmarny,Vachel,vchmarnyol@tripadvisor.com +887,Greer,Dominica,dgreerom@time.com +888,Peasegod,Quincey,qpeasegodon@nyu.edu +889,De Mattia,Emelia,edemattiaoo@constantcontact.com +890,Cortes,Traver,tcortesop@themeforest.net +891,Tolson,Quentin,qtolsonoq@rakuten.co.jp +892,Webley,Colver,cwebleyor@ask.com +893,Grimestone,Farr,fgrimestoneos@fotki.com +894,Sowrey,Mercy,msowreyot@tuttocitta.it +895,Braizier,Davida,dbraizierou@macromedia.com +896,Barehead,Vinita,vbareheadov@is.gd +897,Beardwell,Welbie,wbeardwellow@ebay.com +898,Hasel,Nevsa,nhaselox@rediff.com +899,Maudling,Faunie,fmaudlingoy@google.pl +900,Harrison,Philippine,pharrisonoz@paginegialle.it +901,Bence,Theadora,tbencep0@soundcloud.com +902,Lacey,Octavia,olaceyp1@nytimes.com +903,Cheke,Jacinda,jchekep2@devhub.com +904,Meddows,Hardy,hmeddowsp3@google.es +905,Nickoles,Maisie,mnickolesp4@earthlink.net +906,McCoughan,Neilla,nmccoughanp5@princeton.edu +907,Smardon,Wynn,wsmardonp6@shop-pro.jp +908,Foulgham,Dugald,dfoulghamp7@ft.com +909,Poone,Jacynth,jpoonep8@unesco.org +910,Conybear,Cazzie,cconybearp9@springer.com +911,Kyttor,Carlynn,ckyttorpa@sohu.com +912,Blackshaw,Donnie,dblackshawpb@flavors.me +913,Olifard,Debby,dolifardpc@newyorker.com +914,Cabble,Darius,dcabblepd@vk.com +915,Wapplington,Ailene,awapplingtonpe@reverbnation.com +916,Grimshaw,Lydie,lgrimshawpf@oracle.com +917,Gaw,Linette,lgawpg@salon.com +918,Balcock,Kristal,kbalcockph@chicagotribune.com +919,Samwyse,Astrix,asamwysepi@drupal.org +920,Weedon,Rosabel,rweedonpj@blogs.com +921,Gherardini,Michal,mgherardinipk@xinhuanet.com +922,Plesing,Gerhardine,gplesingpl@com.com +923,Maginn,Tamera,tmaginnpm@oaic.gov.au +924,Willshire,Urson,uwillshirepn@arizona.edu +925,Cleve,Karl,kclevepo@behance.net +926,Lumley,Susannah,slumleypp@shinystat.com +927,Featherstonehaugh,Arch,afeatherstonehaughpq@behance.net +928,Dalman,Raquel,rdalmanpr@wisc.edu +929,Tarbet,Carree,ctarbetps@addthis.com +930,Rysom,Shadow,srysompt@pinterest.com +931,Seaward,Skell,sseawardpu@army.mil +932,Heister,Alika,aheisterpv@cam.ac.uk +933,Sherwin,Andras,asherwinpw@cmu.edu +934,Gorry,Micah,mgorrypx@tumblr.com +935,Gallaccio,Freida,fgallacciopy@blogs.com +936,Muff,Evelin,emuffpz@bbb.org +937,Kall,Chantalle,ckallq0@aboutads.info +938,Monkleigh,Claretta,cmonkleighq1@plala.or.jp +939,Weeds,Moll,mweedsq2@house.gov +940,Jenny,Cicely,cjennyq3@twitter.com +941,Beaven,Charyl,cbeavenq4@delicious.com +942,Grimwad,Luciano,lgrimwadq5@google.ru +943,Rois,Jacynth,jroisq6@ameblo.jp +944,Yushankin,Erin,eyushankinq7@google.pl +945,Hedditeh,Patricia,phedditehq8@examiner.com +946,Ripper,Katrinka,kripperq9@economist.com +947,Aitken,Willdon,waitkenqa@php.net +948,Vayne,Renae,rvayneqb@livejournal.com +949,Pepperill,Caron,cpepperillqc@feedburner.com +950,Groucock,Zsa zsa,zgroucockqd@tmall.com +951,Mingardi,Crissie,cmingardiqe@privacy.gov.au +952,Drover,Verge,vdroverqf@cam.ac.uk +953,Meadus,Timmy,tmeadusqg@techcrunch.com +954,Chesworth,Reece,rchesworthqh@cpanel.net +955,Ensor,Saunders,sensorqi@amazon.co.uk +956,Dubble,Duff,ddubbleqj@unc.edu +957,Took,Augustine,atookqk@goodreads.com +958,Cotgrove,Horatius,hcotgroveql@furl.net +959,Cabral,Tulley,tcabralqm@reuters.com +960,Furminger,Engracia,efurmingerqn@deviantart.com +961,Etherton,Pate,pethertonqo@jugem.jp +962,Shawcroft,Joey,jshawcroftqp@a8.net +963,Sim,Ardelis,asimqq@miitbeian.gov.cn +964,Mylan,Shandy,smylanqr@sohu.com +965,Dalliwater,Kip,kdalliwaterqs@delicious.com +966,Rime,Den,drimeqt@360.cn +967,Elletson,Junette,jelletsonqu@amazon.de +968,Tonn,Cloris,ctonnqv@pbs.org +969,Brimman,Bibbie,bbrimmanqw@hexun.com +970,Hammerberg,Jodie,jhammerbergqx@google.es +971,Danilchev,Boniface,bdanilchevqy@smugmug.com +972,Ringsell,Diego,dringsellqz@netlog.com +973,Waudby,Juan,jwaudbyr0@fastcompany.com +974,Cornish,Rubina,rcornishr1@php.net +975,Itzakson,Eamon,eitzaksonr2@businessweek.com +976,Kornyshev,Hamid,hkornyshevr3@parallels.com +977,Pettiford,Vittorio,vpettifordr4@google.es +978,Bodicum,Lane,lbodicumr5@edublogs.org +979,Bastide,Nicol,nbastider6@alexa.com +980,Allsep,Suzanne,sallsepr7@pagesperso-orange.fr +981,Jepensen,Joe,jjepensenr8@illinois.edu +982,Aickin,Roseann,raickinr9@merriam-webster.com +983,Delnevo,Gertie,gdelnevora@sciencedirect.com +984,Leadbitter,Jerrilee,jleadbitterrb@hhs.gov +985,Agent,Tammy,tagentrc@dailymotion.com +986,Lettington,Isac,ilettingtonrd@yelp.com +987,Scutt,Garold,gscuttre@usda.gov +988,Warlton,Bailie,bwarltonrf@ifeng.com +989,Insko,Jasper,jinskorg@is.gd +990,Yekel,Ansley,ayekelrh@usnews.com +991,Hallgath,Winnie,whallgathri@mlb.com +992,Alman,Kandace,kalmanrj@w3.org +993,Harroll,Raimondo,rharrollrk@weather.com +994,Prew,Bren,bprewrl@multiply.com +995,Garshore,Karylin,kgarshorerm@adobe.com +996,Kegg,Guenna,gkeggrn@diigo.com +997,Weekes,Rollin,rweekesro@apple.com +998,Hatherill,Seana,shatherillrp@youtu.be +999,Giacubo,Huberto,hgiacuborq@fc2.com +1000,Coltart,Edward,ecoltartrr@sciencedaily.com diff --git a/collection_test.go b/collection_test.go new file mode 100644 index 0000000..ed23d25 --- /dev/null +++ b/collection_test.go @@ -0,0 +1,56 @@ +package collections + +import ( + "embed" + "strconv" + "strings" + "testing" + + "github.com/stretchr/testify/require" +) + +//go:embed collection_test.csv +var testData embed.FS + +type person struct { + ID int + LastName string + FirstName string + Email string +} + +func TestCollection(t *testing.T) { + rawData, _ := testData.ReadFile("collection_test.csv") + data := strings.Split(string(rawData), "\n") + + lines := OfSlice(data).Skip(1).Filter(func(s string) bool { + return strings.Contains(s, ",") + }) + + firstGloryWithComMail := MapCollection( + lines, + func(line string) person { + elements := strings.Split(line, ",") + id, _ := strconv.Atoi(elements[0]) + return person{ + ID: id, + LastName: elements[1], + FirstName: elements[2], + Email: elements[3], + } + }, + ).Filter(func(p person) bool { + return strings.HasSuffix(p.Email, ".com") + }).Filter(func(p person) bool { + return p.FirstName == "Glory" + }).Sorted(func(p1, p2 person) bool { + return p1.ID < p2.ID + }).FindFirst().Get() + + require.EqualValues(t, person{ + ID: 62, + LastName: "Joss", + FirstName: "Glory", + Email: "gjoss1p@taobao.com", + }, firstGloryWithComMail) +} diff --git a/comparators/numeric.go b/comparators/numeric.go new file mode 100644 index 0000000..cda96d3 --- /dev/null +++ b/comparators/numeric.go @@ -0,0 +1,10 @@ +package comparators + +import "pkg.icikowski.pl/collections/functions" + +// CompareNumeric returns comparator for numeric values +func CompareNumeric[T ~int | ~int8 | ~int16 | ~int32 | ~int64 | ~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr | ~float32 | ~float64]() functions.Comparator[T] { + return func(a, b T) bool { + return a < b + } +} diff --git a/comparators/package.go b/comparators/package.go new file mode 100644 index 0000000..df1fefc --- /dev/null +++ b/comparators/package.go @@ -0,0 +1,4 @@ +/* +Handy comparators +*/ +package comparators diff --git a/comparators/string.go b/comparators/string.go new file mode 100644 index 0000000..a91b46c --- /dev/null +++ b/comparators/string.go @@ -0,0 +1,15 @@ +package comparators + +import ( + "golang.org/x/text/collate" + "golang.org/x/text/language" + "pkg.icikowski.pl/collections/functions" +) + +// CompareString returns [functions.Comparator] for string values in given language +func CompareString(lang language.Tag) functions.Comparator[string] { + c := collate.New(lang) + return func(a, b string) bool { + return c.CompareString(a, b) < 0 + } +} diff --git a/functions.go b/functions.go new file mode 100644 index 0000000..68e58b9 --- /dev/null +++ b/functions.go @@ -0,0 +1,39 @@ +package collections + +import "pkg.icikowski.pl/collections/functions" + +// Of creates [Collection] of given items +func Of[T any](data ...T) *Collection[T] { + return &Collection[T]{data, true} +} + +// OfSlice creates [Collection] of given slice elements +func OfSlice[T any](data []T) *Collection[T] { + return &Collection[T]{data, true} +} + +// Iterate creates [Collection] of given number of items generated from given seed and [functions.UnaryOperator] +func Iterate[T any](seed T, u functions.UnaryOperator[T], limit int) *Collection[T] { + if limit <= 0 { + limit = 1 + } + + data := []T{seed} + for i := 1; i < limit; i++ { + data = append(data, u(data[len(data)-1])) + } + return &Collection[T]{data, true} +} + +// Generate creates [Collection] of given number of items generated from given [functions.Supplier] +func Generate[T any](p functions.Supplier[T], limit int) *Collection[T] { + if limit < 0 { + limit = 0 + } + + data := []T{} + for i := 0; i < limit; i++ { + data = append(data, p()) + } + return &Collection[T]{data, true} +} diff --git a/functions/package.go b/functions/package.go new file mode 100644 index 0000000..40f9984 --- /dev/null +++ b/functions/package.go @@ -0,0 +1,4 @@ +/* +Function types +*/ +package functions diff --git a/functions/types.go b/functions/types.go new file mode 100644 index 0000000..a43bf45 --- /dev/null +++ b/functions/types.go @@ -0,0 +1,24 @@ +package functions + +type ( + // Consumer takes an argument of type T and returns nothing + Consumer[T any] func(T) + + // Function takes an argument of type T and returns a result of type U + Function[T, U any] func(T) U + + // Predicate takes an argument of type T and returns a boolean result + Predicate[T any] func(T) bool + + // Supplier takes no argument and returns a result of type T + Supplier[T any] func() T + + // UnaryOperator takes an argument of type T and returns a result of type T + UnaryOperator[T any] func(T) T + + // BinaryOperator takes two arguments of type T and returns a result of type T + BinaryOperator[T any] func(T, T) T + + // Comparator takes two arguments of type T and returns a boolean result + Comparator[T any] func(T, T) bool +) diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..76e30a9 --- /dev/null +++ b/go.mod @@ -0,0 +1,11 @@ +module pkg.icikowski.pl/collections + +go 1.20 + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/stretchr/testify v1.8.4 // indirect + golang.org/x/text v0.11.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..4092e4d --- /dev/null +++ b/go.sum @@ -0,0 +1,11 @@ +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/optional.go b/optional.go new file mode 100644 index 0000000..7a65d8f --- /dev/null +++ b/optional.go @@ -0,0 +1,48 @@ +package collections + +import "pkg.icikowski.pl/collections/functions" + +// Optional represents an optional value of type T +type Optional[T any] struct { + e T + present bool +} + +// IsPresent determines whether the underlying value is present +func (o *Optional[T]) IsPresent() bool { + return o.present +} + +// Get returns the underlying value +func (o *Optional[T]) Get() T { + return o.e +} + +// OrElse returns the underlying value or given value if underlying value is not present +func (o *Optional[T]) OrElse(e T) T { + if !o.present { + return e + } + return o.e +} + +// OrElseGet returns the underlying value or value from given supplier if underlying value is not present +func (o *Optional[T]) OrElseGet(s functions.Supplier[T]) T { + if !o.present { + return s() + } + return o.e +} + +// Transform transforms the underlying value with given [functions.UnaryOperator] if the vale is present +func (o *Optional[T]) Transform(u functions.UnaryOperator[T]) *Optional[T] { + if o.present { + o.e = u(o.e) + } + return o +} + +// MapOptional maps optional of type T to optional of type U using given [functions.Function] +func MapOptional[T, U any](src *Optional[T], mapper functions.Function[T, U]) *Optional[U] { + return &Optional[U]{mapper(src.e), src.present} +} diff --git a/optional_test.go b/optional_test.go new file mode 100644 index 0000000..7409711 --- /dev/null +++ b/optional_test.go @@ -0,0 +1,128 @@ +package collections + +import ( + "strings" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestIsPresent(t *testing.T) { + tests := map[string]struct { + optional Optional[string] + expectedResult bool + }{ + "not present": { + optional: Optional[string]{}, + expectedResult: false, + }, + "present": { + optional: Optional[string]{ + present: true, + }, + expectedResult: true, + }, + } + + for name, tc := range tests { + name, tc := name, tc + t.Run(name, func(t *testing.T) { + require.Equal(t, tc.expectedResult, tc.optional.IsPresent()) + }) + } +} + +func TestGet(t *testing.T) { + tests := map[string]struct { + optional Optional[string] + expectedResult string + }{ + "not present": { + optional: Optional[string]{}, + expectedResult: "", + }, + "present": { + optional: Optional[string]{ + e: "foo", + present: true, + }, + expectedResult: "foo", + }, + } + + for name, tc := range tests { + name, tc := name, tc + t.Run(name, func(t *testing.T) { + require.Equal(t, tc.expectedResult, tc.optional.Get()) + }) + } +} + +func TestOrElse(t *testing.T) { + tests := map[string]struct { + optional Optional[string] + expectedResult string + }{ + "not present": { + optional: Optional[string]{}, + expectedResult: "bar", + }, + "present": { + optional: Optional[string]{ + e: "foo", + present: true, + }, + expectedResult: "foo", + }, + } + + for name, tc := range tests { + name, tc := name, tc + t.Run(name, func(t *testing.T) { + require.Equal(t, tc.expectedResult, tc.optional.OrElse("bar")) + }) + } +} + +func TestOrElseGet(t *testing.T) { + tests := map[string]struct { + optional Optional[string] + expectedResult string + }{ + "not present": { + optional: Optional[string]{}, + expectedResult: "bar", + }, + "present": { + optional: Optional[string]{ + e: "foo", + present: true, + }, + expectedResult: "foo", + }, + } + + for name, tc := range tests { + name, tc := name, tc + t.Run(name, func(t *testing.T) { + require.Equal(t, tc.expectedResult, tc.optional.OrElseGet(func() string { + return "bar" + })) + }) + } +} + +func TestTransform(t *testing.T) { + given := &Optional[string]{ + e: "foo", + present: true, + } + + transformer := func(s string) string { + return strings.ToUpper(s) + } + + result := MapOptional(given, transformer) + + require.Equal(t, "FOO", result.Get()) +} diff --git a/package.go b/package.go new file mode 100644 index 0000000..3a34401 --- /dev/null +++ b/package.go @@ -0,0 +1,4 @@ +/* +Collections-related types and functions +*/ +package collections