Task 6 done
authorNeil Smith <neil.git@njae.me.uk>
Tue, 2 Oct 2018 09:14:14 +0000 (10:14 +0100)
committerNeil Smith <neil.git@njae.me.uk>
Tue, 2 Oct 2018 09:14:14 +0000 (10:14 +0100)
data/06-friendships.txt [new file with mode: 0644]
data/06-small.txt [new file with mode: 0644]
data/06-smaller.txt [new file with mode: 0644]
src/task6/task6-monad.hs [new file with mode: 0644]
src/task6/task6.hs [new file with mode: 0644]

diff --git a/data/06-friendships.txt b/data/06-friendships.txt
new file mode 100644 (file)
index 0000000..ef26e76
--- /dev/null
@@ -0,0 +1,1140 @@
+Fatimah Rhiannon
+Stan Akeel
+Edgar Ace
+Inayah Iona
+Talitha Halima
+Troy Lindsay
+Stacie Maciej
+Elvis Muhammed
+Fiza Ralphy
+Jacqueline Elliott
+Kendrick Macauley
+Miller Michalina
+Cerys Riaz
+Toyah Leonard
+Stan Adyan
+Rogan Darcie
+Rory Chay
+Sachin Jordyn
+Mark Demi
+Elisabeth Nadeem
+Kain Sulaiman
+Jordyn Jorden
+Letitia Sanjay
+Riaz Reid
+Neil Haya
+Darrell Abby
+Anabella Ella-Louise
+Ellenor Tamanna
+Jasmine Izabelle
+Derek Reid
+Nathalie Kaan
+Jordan Harvie
+Amos Emile
+Ebonie Evie
+Ned Rosanna
+Muhammed Nelson
+Cara Ameera
+Ellisha Darrell
+Theia Ameera
+Jacqueline Summer
+Jaimee Caspian
+Nabil Zishan
+Alvin Ethan
+Lani Maariyah
+Kristian Devan
+Maira Halima
+Terri Bertram
+Fiza Woody
+Anabelle Bryn
+Clara Ismael
+Hallie Sulaiman
+Eren Keelan
+Maciej Ellisha
+Bryn Holli
+Sultan Jez
+Danyaal Dafydd
+Harrison Killian
+Shaan Baxter
+Anita Vinnie
+Jaeden Maira
+Bert Maja
+Corben Nadeem
+Jamelia Alvin
+Mehreen Fiza
+Izabelle Kellie
+Caspar Emile
+Holly Annie
+Nelson Maddie
+Ophelia Adrienne
+Zoey Marjorie
+Amos Cody
+Zackery Leja
+Shaquille Sanjay
+Nyla Clara
+Allegra Kaitlyn
+Jaeden Micheal
+Rohit Josephine
+Zishan Bruno
+Tamika Oliver
+August Kajus
+Annabell Alessio
+Billie Jevan
+Bert Nyla
+Kaycee Darcie
+Cyrus Suman
+Mariah Anabella
+Chloe-Louise Sebastian
+Caspian Alys
+Kaycee Shanai
+Natasha Daria
+Ralphy Kajus
+Aryan Jaeden
+Rhiannon Alfie-Lee
+Poppy-Mae Bruno
+Christos Avery
+Sameera Holly
+Lilah Sanaa
+Cerys Eryk
+Prisha Zachariah
+Caspian Ishaan
+Sulaiman Phillipa
+Cayden Freddy
+Maja Kier
+Grayson Emerson
+Emerson Isabella
+Isaak Zarah
+Gregg Prisha
+Kain Ayaz
+Christos Angel
+Lorelai Herbie
+Mahdi Rohit
+Asim Mariah
+Zishan Kaycee
+Jorge Devonte
+Haya Valentino
+Demi Chloe-Louise
+Zarah Lilian
+Misbah Ophelia
+Cayden Frida
+Harlow Vivian
+Rehan Emanuel
+Fallon Jordan
+Roberta Tyler-Jay
+Mary Cadence
+Aryaan Liberty
+Stacie Zachariah
+Savanna Haidar
+Camilla Leja
+Roberta Kendrick
+Eamonn Marley
+Valentino Allegra
+Ophelia Vinnie
+Oran Isla-Mae
+Inayah Cayden
+Ralphy Ophelia
+Rueben Jaimee
+Poppy-Mae Osman
+Alina Rueben
+Aarron Preston
+Ellisha Elle
+Brogan Ismael
+Izabelle Baxter
+Ralphy Zachariah
+Kaydan Kacper
+Rehan Madeleine
+Emerson Ocean
+Lillie-Rose Rohan
+Roberta Ishaan
+Cadence Annaliese
+Fallon Reyansh
+Erika Camilla
+Darcie Ace
+Ameera Joanna
+Irfan Darsh
+Lani Can
+Kobe Fathima
+Kendal Lacey
+Manisha Ayaan
+Toyah Hudson
+Tessa Sulaiman
+Nabil Michaela
+Isha Amos
+Fatema Luka
+Lindsay Menaal
+Ibraheem Jevan
+Asmaa Mahir
+Rudra Devonte
+Muhammed Avni
+Rahma Mohammod
+Jessica Shaan
+Umer Valentino
+Natasha Kye
+Marlene Hassan
+Liberty Avery
+Ishaan Veronica
+Shaquille Alys
+Mckenzie Kerri
+Tanisha Haya
+Mariyam Lilly-Rose
+Gerald Natan
+Madison Herbie
+Ainsley Madeleine
+Jevan Annabell
+Ebonie Emma-Louise
+Jorden Victoria
+Marissa Maddie
+Ayaan Reid
+Mahek Niall
+Evie-Mai Zoey
+Nadeem Elyas
+Lani Tessa
+Ira Emile
+Ibraheem Mohammod
+Leonard Jevon
+Gerald Naeem
+Dustin Isla-Mae
+Maira Aryan
+Derek Zaara
+Lillie-Rose Jennie
+Shanai Siena
+Saira Vivien
+Terri Cloe
+Reyansh Nicholas
+Harvie Kenan
+Keelan Xena
+Bronwyn Tonya
+Skye Zacharias
+Marjorie Aditya
+Shuaib Kaitlyn
+Ebonie Bertram
+Poppy-Mae Asim
+Kristian Rosemary
+Milla Evie-Mai
+Darrell Rogan
+Ross Olli
+Killian Naima
+Aryan Sebastian
+Amos Salma
+Letitia Nadia
+Stan Abdul
+Sameera Zander
+Stan Rory
+Skye Camilla
+Kerri Ishaan
+Kaydan Prisha
+Jayden Sophie-Louise
+Maryam Viola
+Emerson Kai
+Huma Javier
+Alejandro Elle
+Ayaz Nicholas
+Leena Fathima
+Holli Anabelle
+Preston Naeem
+Rudra Preston
+Madison Katya
+Maja Jez
+Alfie-Lee Eilidh
+Amos Bertha
+Tanisha Sameera
+Jordan Miller
+Angel Emily
+Zachariah Woody
+Bruno Letitia
+Ross Avery
+Laurie Bruno
+Saira Aryan
+Poppy-Mae Tonya
+Killian Carlie
+Bob Dustin
+Cerys Anastasia
+Hector Usama
+Talha Sonya
+Hassan Ayaan
+Heath Zunaira
+Nyla Kiefer
+Toby Jacqueline
+Corben Marissa
+Mustafa Keelan
+Talha Cassia
+Haya Holly
+Poppy-Mae Kendal
+Reanne Elliott
+Alastair Whitney
+Mariyam Shaan
+Reyansh Freddy
+Christos Liberty
+Theo Anabella
+Harlow Nabil
+Winifred Fearne
+Kain Fallon
+Arham Ronald
+Jez Nyla
+Jayden Zac
+Fenton Ace
+Cadence Fearne
+Indie Alessio
+Nadeem Tillie
+Mylie Jordan
+Kristopher Anastasia
+Ross Liberty
+Sebastian Salman
+Kennedy Ebonie
+Micheal Halima
+Jacqueline Nahla
+Jordyn Bert
+Ophelia Anabella
+Zarah Rogan
+Javier Anabia
+Dolores Talitha
+Liya Aryaan
+Summer Leena
+Elle Stacie
+Rory Harper
+Kuba Amos
+Connar Theo
+Rosina Cory
+Josie Elisabeth
+Lilah Emile
+Leyla Akeel
+Can Kieron
+Shaan Viola
+Michaela Shaquille
+Mustafa Aisling
+Fiza Kaydan
+Mysha Anabella
+Nojus Lillie-Rose
+Milla Aditya
+Otis Anabella
+Jez Victoria
+Marlene Eryk
+Madison Theo
+Tre Fiza
+Annabell Ibraheem
+Zander Shuaib
+Aminah Cosmo
+Phillipa Haidar
+Momina Crystal
+Kobe Mariana
+Isaak Rachelle
+Keelan Anastasia
+Jimi Hal
+Amanah Yaseen
+Mohammod Jennie
+Iman Amira
+Avery Fannie
+Stacey Ayaz
+Sonya Irfan
+Reyansh Abdi
+Tanisha Allegra
+Reanne Danyaal
+Jessica Finlay
+Zaara Jayden
+Karina Ronald
+Kiefer Mahir
+Maddie Alastair
+Hector Ned
+Halima Sebastian
+Leyla Harper
+Bertram Gerard
+Salman Halima
+Kai Ann-Marie
+Jayden Zackery
+Ronan Lani
+Jaeden Mark
+Herbie Veronica
+Rachelle Madeleine
+Vinnie Shaan
+Josephine Adem
+Otis Letitia
+Laurie Vinnie
+Eamonn Alfred
+Dustin Winifred
+Leja Eryk
+Avery Emile
+Kristopher Leja
+Maciej Fiza
+Mariah Stacie
+Shuaib Tamar
+Isla-Mae Ronald
+Marissa Rea
+Jordan Luka
+Whitney Josie
+Shanai Rehan
+Shuaib Annie
+Gregg Sanjay
+Prisha Woody
+Kier Asmaa
+Holly Ozan
+Kai Faizah
+Yusef Pollyanna
+Mustafa Jayden
+Zakk Nahla
+Sophie-Louise Leona
+Harvie Freddy
+Annie Otto
+Shanai Caspian
+Merlin Aarron
+Vienna Fearne
+Mariana Rogan
+Anabella Lilli
+Anabella Raj
+Rosina Bryn
+Mahdi Mariah
+Jasleen Dustin
+Liana Rosina
+Lilian Mckenzie
+Ariana Nahla
+Stacie Lorelai
+Talha Darsh
+Alexandros Kai
+Evie Sid
+Vivian Fathima
+Grayson Lilah
+Madison Leonie
+Nabil Javier
+Caiden Gregg
+Faizah Amos
+Jo Ellisha
+Ronan Luka
+Milla Marjorie
+Kaydan Lilian
+Theia Charli
+Luci Leonard
+Maisy Ella-Louise
+Kaitlyn Millie
+Jaime Karina
+Maisy Lilli
+Osman Alina
+Liberty Liya
+Ellisha Zishan
+Reagan Momina
+Emanuel Kelly
+August Mariah
+Ammaar Amira
+Cerys Eren
+Ann-Marie Salma
+Benito Aizah
+Avni Macauly
+Storm Eilidh
+Shuaib Neil
+Sila Jasleen
+Angel Lucille
+Leja Anastasia
+Erika Kristopher
+Bertha Sidney
+Sabiha Prisha
+Allegra Ozan
+Dylan Tamanna
+Phillipa Kain
+Rhodri Crystal
+Kellie Nabil
+Aarron Leonardo
+Deniz Mika
+Camilla Humzah
+Reyansh Austen
+Otis Aizah
+Iram Victoria
+Cosmo Manisha
+Kier Mahek
+Halima Jaeden
+Miller Beck
+Kiefer Ismael
+Demi Ethan
+Rogan Shanai
+Eren Zacharias
+Marley Naima
+Colleen Tori
+Tillie Alastair
+Aleah Yaqub
+Leonardo Devan
+Jaimee Sanjay
+Rachelle Kellie
+Manav Reid
+Saira Mark
+Amira Mahdi
+Arjun Reagan
+Nyla Mahir
+Umer Cyrus
+Fannie Pollyanna
+Corben Elyas
+Ira Emerson
+Abby Kajus
+Tre Finlay
+Abdulrahman Nazifa
+August Zakk
+Dafydd Rohit
+Talitha Ethan
+Ethan Connagh
+Hal Tamika
+Tahir Aditya
+Annalise Diego
+Sila Leonardo
+Rea Corben
+Cyrus Tamar
+Beck Ronan
+Maira Salman
+Maciej Ophelia
+Mark Talitha
+Cara Amanah
+Nadia Rohit
+Adem Caiden
+Stacey Savanna
+Osman Aizah
+Ira Ocean
+Connagh Demi
+Billie Zakariah
+Aminah Troy
+Iman Fiza
+Emanuel Mehreen
+Perry Kaan
+Isaak Asim
+Rosina Anabelle
+Salma Ira
+Fenton Mariana
+Laurie Adem
+Joanna Eilidh
+Finlay Rohit
+Fenton Ainsley
+Tre Rehan
+Zakk Stacie
+Zachariah Alejandro
+Fatema Sulaiman
+Kendal Bronwyn
+Shaan Darrell
+Rosemary Isla-Mae
+Shanai Ophelia
+Yaqub Nabil
+Bryn Ellesse
+Alessandra Leena
+Suman Otto
+Marjorie Evie-Mai
+Horace Evie-Mai
+Gerard Evie
+Whitney Tillie
+Mikolaj Momina
+Jessica Raj
+Sophie-Louise Abdulrahman
+Ammaar Fenton
+Fallon Michalina
+Winifred Leonardo
+Shania Frida
+Rhiannon Amanah
+Salma Grayson
+Roberta Izabelle
+Maciej Finlay
+Jacqueline Otis
+Ralphy Rogan
+Naeem Ronald
+Heath Gia
+Mysha Emanuel
+Samson Jacqueline
+Cerys Xena
+Madison Jacqueline
+Liana Astrid
+Chante Jo
+Fearne Devonte
+Caspian Toby
+Abdul Vinay
+Allegra Marek
+Iman Gregg
+Mohammod Lynsey
+Umer Shuaib
+Lilian Danyaal
+Zishan Rueben
+Emanuel Fiza
+Rohan Rosa
+Mehreen Vivian
+Adyan Akeel
+Riaz Reanna
+Lacey Woody
+Alessio Nojus
+Aizah Samson
+Victoria Sachin
+Abdulrahman Keelan
+Tamar Allegra
+Niall Mahir
+Charli Rhiannon
+Annalise Mysha
+Otis Ellisha
+Mylee Cyrus
+Osman Vinnie
+Marek Mylee
+Gary Kaycee
+Evie-Mai Hal
+Jennie Jevan
+Jez Kier
+Holly Allegra
+Liya Tilly
+Cara Rhiannon
+Kacper Fenton
+Menaal Ayaan
+Ned Usama
+Marlene Reanna
+Marek Sameera
+Ella-Louise Zachariah
+Sachin Clara
+Salman Chloe-Louise
+Sanjay Chante
+Zakk Rachelle
+Kobe Ella-Louise
+Maira Mark
+Elisabeth Nelson
+Tahir Hal
+Nabil Anita
+Asim Connar
+Jordyn Iram
+Ayaz Shania
+Ella-Louise Elliott
+Lani Kenan
+Toyah Bertram
+Sid Luci
+Mylie Luka
+Merlin Rudra
+Kelly Luqman
+Aleah Ariana
+Baxter Benito
+Neil Ozan
+Iona Beck
+Letitia Diego
+Mariah Herbie
+Lilly-Rose Fiza
+Rohit Viola
+Liya Emily
+Lynsey Ibraheem
+Dafydd Darcie
+Rueben Emanuel
+Eren Hassan
+Kellie Bronwyn
+Brogan Jorden
+Micheal Chloe-Louise
+Glyn Billie
+Zackery Hassan
+Akbar Lacey
+Ralphy Kellie
+Zac Humzah
+Viola Edgar
+Woody Mariana
+Ebonie Hudson
+Ethan Chloe-Louise
+Kieron Jordan
+Alessandra Summer
+Deniz Dante
+Talha Ellenor
+Laurie Rehan
+Luqman Zakk
+Millie Zander
+Shakira Ella-Louise
+Huma August
+Shania Miller
+Kerri Daisy-May
+Preston Annaliese
+Leyla Adyan
+Leona Abdulrahman
+Cadence Kristian
+Shaan Alys
+Avni Corben
+Troy Abdulrahman
+Finlay Izabelle
+Baxter Jasmine
+Mustafa Eren
+Brogan Sultan
+Alessio Lillie-Rose
+Zakk Kelly
+Kier Ismael
+Tori Hector
+Zakariah Mohammod
+Elvis Elisabeth
+Jarvis Ellesse
+Troy Maisie
+Nadeem Elvis
+Ismael Jordyn
+Lucille Dionne
+Rochelle Menaal
+Cyrus Shuaib
+Akbar Zakk
+Alvin Salman
+Bronwyn Zarah
+Kennedy Gerard
+Elle Misbah
+Mylie Cayden
+Vivien Aryan
+Poppy-Mae Mikayla
+Iman Kendrick
+Osman Herbie
+Dustin Ella-Mae
+Tilly Liberty
+Micheal Demi
+Anabia Mckenzie
+Baxter Tre
+Eryk Maisie
+Isaak Nadia
+Amanah Charli
+Haidar Beck
+Liya Olli
+Iona Hallie
+Viola Josephine
+Shuaib Holly
+Rosanna Usama
+Tilly Lucille
+Anabella Lilly-Rose
+Jordyn Mahek
+Natan Isla-Mae
+Can Miller
+Ocean Tommy
+Grayson Ann-Marie
+Manav Marlene
+Maariyah Nicholas
+Javier Zakk
+Rohan Alessio
+Lacey Isma
+Lacey Kajus
+Prisha Stacie
+Phillipa Shania
+Sidney Tilly
+Devonte Aarron
+Lucille Ross
+Caspar Salma
+Ammaar Lorelai
+Demi Maira
+Rohit Kelly
+Cara Charli
+Ira Liya
+Raj Chante
+Tanisha Kaitlyn
+Tyrell Harvie
+Summer Isaak
+Sid Jevon
+Maja Mahir
+Aarron Monica
+Finlay Adrienne
+Maariyah Can
+Samson Laurie
+Nyla Mahek
+Lynsey Rohan
+Kobe Kelly
+Lilly-Rose Mariana
+Eren Jayden
+Josie Marissa
+Letitia Danyaal
+Sid Toyah
+Maja Iram
+Vinay Akeel
+Cloe Evie
+Zarah Mysha
+Angel Ann-Marie
+Rosanna Hector
+Niall Keaton
+Michalina Jordan
+Asmaa Sachin
+Nahla Izabelle
+Vinnie Aizah
+Liana Emmie
+Billie Alessio
+Jessica Connar
+Jorden Bert
+Kieron Freddy
+Rhiannon Ameera
+Maisie Keelan
+Gia Maisy
+Deniz Cassia
+Alessandra Isaak
+Millie Mylee
+Emile Isha
+Rhydian Alfie-Lee
+Tyrell Luka
+Kellie Amira
+Maariyah Jordan
+Kellie Fathima
+Zachariah Isaak
+Maciej Ammaar
+Liberty Grayson
+Leyla Stan
+Tyler-Jay Bruno
+Mark Halima
+Lani Luka
+Horace Oliver
+Tyrell Shania
+Daria Kye
+Elisabeth Marissa
+Shanai Lorelai
+Kieron Kain
+Poppy Vinnie
+Cory Liana
+Sameera Shuaib
+Diego Luqman
+Roberta Elle
+Reyansh Can
+Yusef Lucille
+Harlow Tyler-Jay
+Alvin Connagh
+Laurie Stacie
+Summer Adrienne
+Prisha Leena
+Ozan Tamar
+Fatema Cayden
+Madeleine Mariah
+Poppy Shanai
+Madeleine Darrell
+Nazifa Mustafa
+Kai Pollyanna
+Oliver Milla
+Clara Jez
+Keaton Iram
+Ira Dionne
+Tommy Ross
+Kier Sachin
+Sanaa Emerson
+Maisie Kristopher
+Rahma Rohan
+Baxter Otis
+Gary Raj
+Sonya Darsh
+Rehan Lilly-Rose
+Anabia Lilian
+Manisha Maisie
+Glyn Rahma
+Michal Marissa
+Amira Kaycee
+Shanai Alina
+Leja Aisling
+Marjorie Hal
+Bernadette Amira
+Mehreen Bernadette
+Lacey Baxter
+Devan Rudra
+Anita August
+Leona Leja
+Kuba Lucille
+Millie Holly
+Christos Caspar
+Kuba Liya
+Corben Elvis
+Leonie Bruno
+Laurie Veronica
+Tanisha Millie
+Stan Vinay
+Maja Nyla
+Annie Haya
+Mckenzie Jaimee
+Tamanna Darsh
+Leonie Lilian
+Stacey Jordan
+Karson Akeel
+Mahir Victoria
+Maja Keaton
+Alessandra Fathima
+Sanaa Alexandros
+Michaela Yaqub
+Mariah Ammaar
+Laurie Michaela
+Mikolaj Rhodri
+Halima Demi
+Jasmine Connar
+Ronald Jaime
+Astrid Holli
+Leonardo Merlin
+Aryaan Dionne
+Gia Javier
+Sanaa Ann-Marie
+Austen Shania
+Otto Shuaib
+Macauley Herbie
+Hudson Jevon
+Maja Niall
+Manisha Zaara
+Ellesse Anabelle
+Kier Nyla
+Alina Gregg
+Elliott Leena
+Tyrell Maariyah
+Rohit Lilian
+Arham Mary
+Terri Jevon
+Vivien Jamelia
+Alexandros Liya
+Caprice Zaara
+Riaz Muhamed
+Kaycee Katya
+Stan Chay
+Zander Umer
+Yusef Tilly
+Rueben Leena
+Isabella Tilly
+Ocean Yusef
+Troy Jayden
+Ronan Jordan
+Sameera Allegra
+Winifred Gerald
+Jessica Viola
+Osman Ariana
+Leona Caprice
+Tommy Ann-Marie
+Faizah Ira
+Ellenor Dante
+Danyaal Veronica
+Liya Sidney
+Viola Elle
+Chay Akeel
+Ella-Mae Fearne
+Emmie Bryn
+Leyla Abdul
+Heath Edgar
+Harlow Lilian
+Kennedy Jevon
+Frida Kain
+Isma Ralphy
+Ella-Mae Naeem
+Freddy Can
+Toby Madison
+Harlow Poppy-Mae
+Tommy Isabella
+Elif Colleen
+Nelson Macauly
+Kenan Stacey
+Rahma Zakariah
+Sachin Keaton
+Veronica Bernadette
+Dustin Devonte
+Tanisha Umer
+Rosemary Annaliese
+Camilla Leona
+Lindsay Eren
+Alvin Talitha
+Rahma Billie
+Harvie Kain
+Alastair Macauly
+Ismael Mahek
+Rhodri Momina
+Avni Elisabeth
+Sabiha Bronwyn
+Toyah Gerard
+Zackery Reanna
+Osman Bronwyn
+Izabelle Sabiha
+Connagh Salman
+Ariana Rueben
+Valentino Annie
+Rea Muhammed
+Fathima Luqman
+Keaton Nyla
+Iona Ronan
+Vienna Preston
+Bronwyn Fenton
+Alessandra Asim
+Jevan Zakariah
+Izabelle Asim
+Marlene Zacharias
+Lindsay Jamel
+Annabell Lillie-Rose
+Abdul Chay
+Sommer Fatimah
+Reid Lindsay
+Glyn Jevan
+Devonte Vienna
+Erika Humzah
+Macauley Bronwyn
+Kai Isabella
+Mika Tamanna
+Javier Gregg
+Ibraheem Rahma
+Aditya Zoey
+Siena Rachelle
+Macauley Toby
+Rosina Jarvis
+Demi Salman
+Inayah Abdi
+Isaak Yaqub
+Raj Summer
+Anabella Aizah
+Oran Natan
+Ned Colleen
+Cayden Stacey
+Nicholas Miller
+Freddy Michalina
+Ozan Suman
+Mikayla Darcie
+Kain Fatema
+Toby Lilian
+Michalina Kenan
+Camilla Marlene
+Ibraheem Lillie-Rose
+Fiza Raj
+Akbar Kacper
+Amira Dafydd
+Zakk Lilian
+Xena Derek
+August Jo
+Lucille Lilah
+Zackery Eren
+Tyler-Jay Kendrick
+Jacqueline Aizah
+Jordyn Victoria
+Sebastian Talitha
+Samson Jo
+Javier Kacper
+Rohit Aizah
+Adyan Vinay
+Connar Danyaal
+Fatema Freddy
+Mahdi Josephine
+Jaime Jasleen
+Ella-Mae Jorge
+Naeem Devonte
+Reid Keelan
+Aminah Ayaan
+Joanna Yaseen
+Charli Joanna
+Mckenzie Rehan
+Lilah Yusef
+Indie Jevan
+Eren Erika
+Saira Connagh
+Jo Lilian
+Eryk Menaal
+Eilidh Rhiannon
+Zackery Caprice
+Dafydd Izabelle
+Lorelai Sanjay
+Holli Emmie
+Faizah Aryaan
+Vinnie Zishan
+Summer August
+Kerri Mariah
+Heath Rueben
+Kendrick Lilly-Rose
+Marek Ozan
+Micheal Maira
+Emanuel Woody
+Misbah Siena
+Karson Stan
+Otis Aleah
+Lani Fallon
+Adyan Rory
+Danyaal Misbah
+Shania Hallie
+Steffan Fatema
+Fannie Lucille
+Daisy-May Kellie
+Abby Michaela
+Crystal Arjun
+Amira Nahla
+Kelly Aizah
+Baxter Asim
+Michal Muhammed
+Bronwyn Anabia
+Eren Nazifa
+Ellisha Alys
+Vinnie Maciej
+Rhydian Charli
+Menaal Eren
+Marissa Nelson
+Yaseen Storm
+Adrienne Bernadette
+Zacharias Caprice
+Fatema Miller
+Alastair Muhammed
+Ainsley Kendal
+Anabella Summer
+Jessica Kendal
+Cory Jarvis
+Javier Kerri
+Yusef Angel
+Ace Woody
+Rehan Gary
+Asmaa Clara
+Kain Haidar
+Talitha Salman
+Mehreen Kajus
+Demi Saira
+Muhammed Corben
+Izabelle Amira
+Ella-Louise Kajus
+Chloe-Louise Vivien
+Lilian Kellie
+Rea Macauly
+Mckenzie Jo
+Theia Fatimah
+Cadence Oran
+Otis Danyaal
+Maryam Luqman
+Jamelia Ethan
+Iman Gia
+Rogan Mahdi
+Rogan Ace
+Akeel Rory
+Elif Ned
+Mark Salman
+Christos Kai
+Jevan Rahma
+Mariah Huma
+Hassan Cerys
+Faizah Lucille
+Jez Brogan
+Beck Mylie
+Dionne Sidney
+Menaal Cerys
+Liya Lucille
+Reyansh Luka
+Cristian Marley
+Luka Kain
+Perry Nathalie
+Zishan Heath
+Karina Cadence
+Indie Jennie
+Edgar Ralphy
+Yusef Tommy
+Nicholas Kieron
+Corben Nelson
+Otis Annabel
+Nazifa Jamel
+Nabil Annabel
+Woody Madison
+Danyaal Emanuel
+Valentino Areeba
+Gerard Ebonie
+Micheal Alvin
+Elyas Avni
+Daisy-May Mariyam
+Maisy Ainsley
+Oran Ronald
+Austen Abdi
+Caiden Alejandro
+Zakariah Jennie
+Keaton Mahir
+Inayah Kain
+Leonie Aizah
+Aleah Mysha
+Caiden Madison
+Mckenzie Poppy
+Lani Michalina
+Rachelle Benito
+Izabelle Kendrick
+Caiden Connar
+Luqman Caspian
+Akeel Harper
+Anabelle Emmie
+Indie Annabell
+Tillie Maddie
+Jo Benito
+Charli Eilidh
+Prisha Zarah
+Alastair Michal
+Vienna Bob
+Vivien Micheal
+Fatema Inayah
+Macauley Rehan
+Shakira Theo
+Billie Nojus
+Jaime Natan
+Iman Nadia
+Shaquille Mikayla
+Otto Umer
+Rhodri Reagan
+Alessio Zakariah
+Tilly Olli
+Reyansh Haidar
+Zunaira Anita
+Lilly-Rose Kacper
+Umer Sameera
\ No newline at end of file
diff --git a/data/06-small.txt b/data/06-small.txt
new file mode 100644 (file)
index 0000000..0356e24
--- /dev/null
@@ -0,0 +1,15 @@
+Jacqueline Edgar
+Abby Edgar
+Anita Harlow
+Raj Edgar
+Bronwyn Sanjay
+Caiden Anita
+Raj Finlay
+Raj Jacqueline
+Ella-Louise Abby
+Samson Sanjay
+Samson Alessandra
+Ella-Louise Raj
+Edgar Finlay
+Finlay Jacqueline
+Bronwyn Samson
diff --git a/data/06-smaller.txt b/data/06-smaller.txt
new file mode 100644 (file)
index 0000000..b2d9067
--- /dev/null
@@ -0,0 +1,2 @@
+Jacqueline Edgar
+Abby Edgar
diff --git a/src/task6/task6-monad.hs b/src/task6/task6-monad.hs
new file mode 100644 (file)
index 0000000..df52ed1
--- /dev/null
@@ -0,0 +1,122 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+import Control.Monad (foldM_, ap, liftM)
+
+import Data.Text (Text)
+import qualified Data.Text as T
+import qualified Data.Text.IO as TIO
+
+import qualified Data.HashMap.Strict as M
+import Data.HashMap.Strict ((!))
+
+type Name = Text
+
+data Group = Group { parent :: Name
+                   , size :: Int
+                   } deriving (Show, Eq)
+
+
+type FriendGroups = M.HashMap Name Group
+
+newtype State a = State (FriendGroups -> (FriendGroups, a))
+
+instance Monad State where 
+    return x = State (\groups -> (groups, x))
+    (State st) >>= f 
+        = State (\groups -> let 
+                            (newGroups, y) = st groups
+                            (State trans)  = f y
+                            in
+                            trans newGroups 
+                )
+
+instance Applicative State where
+    pure = return
+    (<*>) = ap
+
+instance Functor State where
+    fmap = liftM
+
+
+
+
+main :: IO ()
+main = do 
+        friendship_text <- TIO.readFile "data/06-friendships.txt"
+        let friendships = map enpair $ T.lines friendship_text
+        let groups = execGroups $ mergeFriendships friendships
+        print $ part1 groups
+        print $ part2 groups
+
+
+part1 :: FriendGroups -> Int
+part1 = M.size . M.filterWithKey (\k a -> k == parent a)
+
+part2 :: FriendGroups -> Int
+part2 = maximum . (map size) . M.elems
+
+
+enpair friendText = (this, that)
+    where (this:that:[]) = T.words friendText
+
+
+-- run a state monad, extract the groups
+execGroups :: State a -> FriendGroups
+execGroups (State st) = fst $ st M.empty
+
+-- including all the friendships is just a monadic fold
+mergeFriendships :: [(Name, Name)] -> State ()
+mergeFriendships pairs = foldM_ includeFriendshipM () pairs
+
+includeFriendshipM :: () -> (Name, Name) -> State ()
+includeFriendshipM _ (thisPerson, thatPerson) = do
+    include thisPerson
+    include thatPerson
+    thisExemplar <- exemplar thisPerson
+    thatExemplar <- exemplar thatPerson
+    if thisExemplar /= thatExemplar
+    then do
+          let thisSize = size thisExemplar
+          let thatSize = size thatExemplar
+          let (absorber, absorbed) = if thisSize > thatSize 
+                                     then (thisExemplar, thatExemplar)
+                                     else (thatExemplar, thisExemplar)
+          absorb absorber absorbed
+          updateSize absorber (thisSize + thatSize)
+    else
+          return ()
+
+
+exemplar :: Name -> State Group 
+exemplar name = State (exemplar' name)
+    where exemplar' person groups = 
+              let person' = parent (groups!person)
+              in if person' == person
+                 then (groups, groups!person)
+                 else exemplar' person' groups
+
+include :: Name -> State ()
+include name = State (\groups -> 
+                  if name `M.member` groups
+                  then (groups, () )
+                  else (M.insert name (Group {parent = name, size = 1}) groups, ())
+                  )
+
+absorb :: Group -> Group -> State ()
+absorb absorberG absorbedG = 
+    let absorber = parent absorberG
+        absorbed = parent absorbedG
+    in State (\groups ->
+      ( M.insert absorbed ((groups!absorbed) {parent = absorber}) groups
+      , ()
+      ) 
+    )
+
+updateSize :: Group -> Int -> State ()
+updateSize exemplarG newSize = 
+    let name = parent exemplarG
+    in State (\groups -> 
+      ( M.insert name ((groups!name) {size = newSize}) groups,
+        ()
+      )
+    )
\ No newline at end of file
diff --git a/src/task6/task6.hs b/src/task6/task6.hs
new file mode 100644 (file)
index 0000000..355bd96
--- /dev/null
@@ -0,0 +1,75 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+import Data.List (foldl')        -- import the strict fold
+-- import Data.List
+
+import Data.Text (Text)
+import qualified Data.Text as T
+import qualified Data.Text.IO as TIO
+
+import qualified Data.HashMap.Strict as M
+import Data.HashMap.Strict ((!))
+
+type Name = Text
+
+data Group = Group { parent :: Name
+                   , size :: Int
+                   } deriving (Show, Eq)
+
+
+type FriendGroups = M.HashMap Name Group
+
+main :: IO ()
+main = do 
+        friendship_text <- TIO.readFile "data/06-friendships.txt"
+        let friendships = map enpair $ T.lines friendship_text
+        let groups = mergeFriendships friendships
+        print $ part1 groups
+        print $ part2 groups
+
+
+part1 :: FriendGroups -> Int
+part1 = M.size . M.filterWithKey (\k a -> k == parent a)
+
+part2 :: FriendGroups -> Int
+part2 = maximum . (map size) . M.elems
+
+
+enpair friendText = (this, that)
+    where (this:that:[]) = T.words friendText
+
+
+mergeFriendships :: [(Name, Name)] -> FriendGroups
+mergeFriendships = foldl' includeFriendship M.empty
+
+exemplar :: FriendGroups -> Name -> Name
+exemplar groups person
+    | person' == person = person
+    | otherwise         = exemplar groups person'
+    where person' = parent (groups!person)
+
+
+include :: FriendGroups -> Name -> FriendGroups
+include groups person = 
+    if person `M.member` groups
+    then groups
+    else M.insert person (Group {parent = person, size = 1}) groups
+
+
+includeFriendship :: FriendGroups -> (Name, Name) -> FriendGroups
+includeFriendship groups0 (thisPerson, thatPerson) =
+    if thisExemplar == thatExemplar
+    then groups
+    else groups''
+    where groups1 = include groups0 thisPerson
+          groups = include groups1 thatPerson
+          thisExemplar = exemplar groups thisPerson
+          thatExemplar = exemplar groups thatPerson
+          thisSize = size $ groups!thisExemplar
+          thatSize = size $ groups!thatExemplar
+          (absorber, absorbed) = if thisSize > thatSize 
+                                 then (thisExemplar, thatExemplar)
+                                 else (thatExemplar, thisExemplar)
+          groups'  = M.insert absorbed ((groups!absorbed) {parent = absorber}) groups 
+          groups'' = M.insert absorber ((groups!absorber) {size = thisSize + thatSize}) groups'
+