You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

228 lines
16 KiB

4 years ago
  1. import cats.implicits._
  2. import scala.util.Try
  3. object Main {
  4. def main(args: Array[String]): Unit = {
  5. val emitRecords: () => Seq[RawUser] = Source.emit(Config.current)
  6. val result: Result = go(emitRecords)
  7. // side-effect print to see results
  8. println(result.toString)
  9. }
  10. private def go(emit: () => Seq[RawUser]): Result = {
  11. emit()
  12. .map(transform)
  13. .map(toResult)
  14. .foldLeft(Result.zero)(_ +: _)
  15. }
  16. private def toResult(v: Either[TransformError, DomainUser]): Result = {
  17. v match {
  18. case Right(_) => Result(1, 0)
  19. case Left(e) => {
  20. println(s"Transform Error: ${e.error}")
  21. Result(0, 1)
  22. }
  23. }
  24. }
  25. private def transform(r: RawUser): Either[TransformError, DomainUser] = {
  26. val maybePerson: TransformError Either Person = r.person
  27. val maybePhone: TransformError Either PhoneNumber = PhoneNumber.from(r.phone)
  28. // (maybePerson |@| maybePhone)(DomainUser)
  29. (maybePerson, maybePhone).mapN(DomainUser)
  30. // for {
  31. // mp1 <- r.person
  32. // mp2 <- PhoneNumber.from(r.phone)
  33. // } yield(DomainUser(mp1, mp2))
  34. }
  35. }
  36. object Source {
  37. def emit(conf: Config)(): Seq[RawUser] = RawData.generateRawUsers
  38. }
  39. trait Config
  40. case class FileConfig() extends Config
  41. object Config {
  42. def current: Config = FileConfig()
  43. }
  44. case class Result(successes: Int, failures: Int) {
  45. /**
  46. * Adds the success/failure values of that with this
  47. *
  48. * @param that
  49. * @return Total succuess/failures
  50. * @example
  51. * val res2 = Result(1,1)
  52. * val res1 = Result(0,1)
  53. * res1 +: res2 // (1,2)
  54. */
  55. def +:(that: Result) =
  56. Result(
  57. this.successes + that.successes,
  58. this.failures + that.failures)
  59. }
  60. object Result {
  61. def zero = Result(0, 0)
  62. }
  63. case class TransformError(error: String)
  64. case class DomainUser(
  65. person: Person,
  66. phoneNumber: PhoneNumber)
  67. case class PhoneNumber(
  68. countryCode: Int,
  69. areaCode: Int,
  70. prefix: Int,
  71. lineNumber: Int) {
  72. override def toString = s"$countryCode ($areaCode) $prefix-$lineNumber"
  73. }
  74. object PhoneNumber {
  75. private val pattern = """(\d{1})-(\d{3})-(\d{3})-(\d{4})""".r
  76. private def toInt(s: String): TransformError Either Int =
  77. // Try(s.toInt).toDisjunction.leftMap(e => TransformError(e.getMessage))
  78. Try(s.toInt).toEither.leftMap(e => TransformError(e.getMessage()))
  79. def from(phoneString: String): TransformError Either PhoneNumber = {
  80. phoneString match {
  81. case pattern(code, area, prefix, line) =>
  82. (toInt(code), toInt(area), toInt(prefix), toInt(line)).mapN(PhoneNumber.apply _)
  83. //\/-(PhoneNumber(code.toInt, area.toInt, prefix.toInt, line.toInt))
  84. case _ => Left(TransformError(s"$phoneString didn't match expected phone number pattern"))
  85. }
  86. }
  87. }
  88. case class Person(firstName: String, lastName: String)
  89. case class RawUser(
  90. fullName: String,
  91. email: String,
  92. phone: String,
  93. streetAddress: String,
  94. city: String,
  95. zipCode: String) {
  96. lazy val person: Either[TransformError, Person] = {
  97. fullName.split(" ").toList match {
  98. case first :: last :: Nil => Right(Person(first, last))
  99. case _ => Left(TransformError(s"Failed parsing first and last name from $fullName"))
  100. }
  101. }
  102. }
  103. object RawData {
  104. def generateRawUsers: Seq[RawUser] = Iterator(
  105. RawUser("RothDrake", "vestibulum.nec@eratEtiam.net", "1-230-665-4456", "P.O. Box 980, 4942 Mattis. St.", "Gellik", "10691"),
  106. RawUser("Kevin Kaufman", "sem@necorciDonec.ca", "1-609-284-0788", "Ap #840-3698 Ipsum. Ave", "Ficarolo", "25265"),
  107. RawUser("Isaiah Yang", "Phasellus.libero.mauris@iaculisquispede.edu", "1-721-480-4797", "P.O. Box 701, 2269 Orci. Road", "Limelette", "22598"),
  108. RawUser("Hall Dale", "turpis@Cumsociis.net", "1-153-279-7425", "Ap #682-1860 Vivamus St.", "Oyen", "47919"),
  109. RawUser("Harlan Ferguson", "feugiat.nec.diam@ac.edu", "1-185-179-1491", "Ap #146-2358 Risus, Rd.", "Murdochville", "50832"),
  110. RawUser("Lance Cabrera", "non.sollicitudin@natoquepenatibuset.co.uk", "1-413-858-6331", "Ap #769-4638 In Avenue", "Arvier", "66909"),
  111. RawUser("Yuli Morrow", "nec.metus@loremvehiculaet.ca", "1-151-457-7940", "9847 Tempus Rd.", "Cumbernauld", "13219"),
  112. RawUser("Tiger Gross", "ante@necligula.co.uk", "1-901-938-7309", "7864 Elit Street", "Rimouski", "96348"),
  113. RawUser("Keaton Potts", "ac.turpis.egestas@semper.org", "1-102-599-3807", "P.O. Box 132, 1743 Nulla. St.", "Marburg", "36371"),
  114. RawUser("Jesse Osborne", "enim@Quisque.net", "1-980-466-7654", "5107 Pede, Road", "Petit-Hallet", "11832"),
  115. RawUser("Upton Irwin", "sed.pede.Cum@ipsumnon.com", "1-383-497-6678", "693-9067 Torquent Avenue", "Tournefeuille", "52668"),
  116. RawUser("Tobias Weaver", "velit.Aliquam.nisl@enimgravida.edu", "1-949-174-4248", "P.O. Box 674, 6969 Magna, Rd.", "Genk", "95278"),
  117. RawUser("Salvador Ortega", "sagittis.augue.eu@semperdui.co.uk", "1-272-113-6941", "Ap #133-7721 Sit Rd.", "Cheyenne", "73214"),
  118. RawUser("Noah Mcconnell", "eu.augue.porttitor@Pellentesque.ca", "1-162-835-8039", "Ap #486-6514 Mi, Ave", "Vedrin", "83705"),
  119. RawUser("Herrod Ayers", "Pellentesque.tincidunt.tempus@etnunc.co.uk", "1-620-731-7339", "4114 Libero Avenue", "Chimay", "10530"),
  120. RawUser("Matthew Thornton", "mattis.semper@Pellentesquetincidunt.net", "1-305-810-7982", "P.O. Box 184, 5281 Tempus Rd.", "Atlanta", "21983"),
  121. RawUser("Ira Molina", "morbi.tristique@orci.net", "1-446-359-0581", "229-1417 Dis Av.", "Masullas", "36453"),
  122. RawUser("Dennis Myers", "dictum.Proin@elit.net", "1944-548-3631", "P.O. Box 842, 5423 Tellus. St.", "Freital", "75563"),
  123. RawUser("Wesley Berger", "tincidunt.pede@gravida.edu", "1-149-210-5545", "366-4454 Cursus Street", "Knighton", "42218"),
  124. RawUser("David Donaldson", "ipsum.Curabitur@tellusnon.org", "1-715-362-4668", "P.O. Box 326, 6499 Vel Avenue", "Pointe-du-Lac", "71736"),
  125. RawUser("Wesley Olsen", "et.arcu.imperdiet@tortor.ca", "1-104-808-8877", "877-3284 Sagittis Road", "Seydişehir", "78606"),
  126. RawUser("Jackson Mullins", "ridiculus.mus.Proin@porttitor.net", "1-900-239-8222", "Ap #195-6334 Elit, St.", "Kimberly", "45255"),
  127. RawUser("Cole Wyatt", "molestie.in@vestibulumneceuismod.com", "1-909-908-8040", "5579 Erat. Rd.", "Long Eaton", "78376"),
  128. RawUser("Amery Steele", "nisl.Nulla.eu@sodales.org", "1-123-712-7565", "Ap #208-9324 Quis, Ave", "Chieti", "47143"),
  129. RawUser("Alfonso Delaney", "vitae@egestasAliquam.com", "1-662-715-5307", "3189 Egestas. St.", "Yungay", "48890"),
  130. RawUser("Carl Ruiz", "vestibulum@luctus.co.uk", "1-541-281-8869", "P.O. Box 768, 7920 Molestie Road", "Beauwelz", "89054"),
  131. RawUser("Barry Crosby", "Sed.diam@Nullafacilisis.co.uk", "1-386-251-7964", "P.O. Box 535, 8058 Quis, Rd.", "Panketal", "40171"),
  132. RawUser("Aladdin Guy", "convallis@dictumaugue.net", "1-861-184-5889", "620-4646 Suspendisse St.", "Ambleside", "76885"),
  133. RawUser("Owen Simon", "Lorem@ullamcorperDuisat.com", "1-693-760-4948", "P.O. Box 978, 1686 Arcu. Road", "Shreveport", "62221"),
  134. RawUser("Bevis Fields", "vulputate.nisi@tempus.edu", "1-720-490-6886", "550-6656 Varius Av.", "Graz", "54835"),
  135. RawUser("Edward Meadows", "eu@laciniaat.org", "1-967-882-4533", "5336 Lacus. Rd.", "Belfast", "21345"),
  136. RawUser("Declan Moody", "adipiscing.lobortis@semmollis.co.uk", "1-106-781-1301", "879-4570 In, Rd.", "Rhayader", "21433"),
  137. RawUser("Armand Kramer", "Phasellus.ornare@egetodio.ca", "1-733-438-2633", "106-8521 Nulla Street", "Valtournenche", "77539"),
  138. RawUser("Todd Fisher", "lorem.tristique.aliquet@ornarefacilisiseget.org", "1-571-342-6987", "901-2662 Integer St.", "Pocatello", "63586"),
  139. RawUser("Dante Bird", "mi.Aliquam@magnis.net", "1-748-381-2078", "2286 Suspendisse Av.", "Terneuzen", "76094"),
  140. RawUser("Henry Ford", "quis.arcu.vel@egestas.org", "1-901-753-0825", "7375 Magna. Ave", "Aberdeen", "50176"),
  141. RawUser("Declan Blackburn", "sit.amet.consectetuer@lobortisauguescelerisque.net", "1-646-403-1665", "Ap #352-4988 Sollicitudin Rd.", "Poggio San Marcello", "90459"),
  142. RawUser("Oren Hale", "aliquam.arcu.Aliquam@vel.co.uk", "1-460-615-7976", "P.O. Box 364, 9288 Feugiat Rd.", "Weißenfels", "94634"),
  143. RawUser("Carlos Harris", "consectetuer.adipiscing.elit@ProinultricesDuis.com", "1-628-201-9673", "9629 Egestas Avenue", "Bad Neuenahr-Ahrweiler", "84173"),
  144. RawUser("Malachi Fry", "dignissim.pharetra@felis.edu", "1-777-900-9929", "Ap #487-8208 Sed Rd.", "Soria", "44359"),
  145. RawUser("Gavin Galloway", "Ut.tincidunt.vehicula@Namtempor.com", "1-853-941-9154", "Ap #537-4182 Est. Street", "Rotem", "23312"),
  146. RawUser("Hop Morse", "porttitor.tellus.non@augueid.co.uk", "1-748-885-0297", "7213 Lobortis Av.", "FerriŽres", "19955"),
  147. RawUser("Hayden Ryan", "dignissim@PraesentluctusCurabitur.org", "1-828-150-3220", "8191 Nulla Av.", "Rivière-du-Loup", "88655"),
  148. RawUser("Lewis Fry", "adipiscing@Phasellusfermentumconvallis.edu", "1-265-841-5383", "Ap #308-6249 Proin Avenue", "Boston", "73173"),
  149. RawUser("Julian Buckner", "mollis@mattisvelit.org", "1-539-140-1047", "Ap #420-6540 Tristique St.", "Lakeland County", "85910"),
  150. RawUser("Macon Haney", "nascetur.ridiculus.mus@mattisInteger.edu", "1-806-749-2795", "261-1885 Est. Avenue", "Horsham", "87820"),
  151. RawUser("Joel Foreman", "mi@et.com", "1-812-266-1175", "270-3286 Augue St.", "Buckingham", "70555"),
  152. RawUser("Zephania Tanner", "ipsum.Donec.sollicitudin@nostra.com", "1-536-368-8194", "7282 Egestas Rd.", "Pulle", "63373"),
  153. RawUser("Brandon Turner", "Sed@a.edu", "1-259-237-3821", "255-825 Donec Av.", "Vegreville", "89142"),
  154. RawUser("Driscoll Ewing", "vehicula.risus@ullamcorper.org", "1-147-963-7666", "P.O. Box 727, 4051 Ac Road", "Goderich", "73648"),
  155. RawUser("Simon Goodman", "ornare@erat.net", "1-354-988-7754", "P.O. Box 534, 6462 Pretium Road", "Armo", "26208"),
  156. RawUser("Hu Salas", "Nulla.eu@pretiumaliquet.org", "1-308-644-2896", "1018 Aenean Ave", "Gdynia", "71656"),
  157. RawUser("Abbot Harvey", "vitae.dolor@interdumfeugiat.com", "1-889-357-1589", "3353 Sit St.", "Rivire", "16935"),
  158. RawUser("Garrett Lawson", "Nulla.eget.metus@laoreet.edu", "1-337-513-2732", "6095 Eros Rd.", "Meix-le-Tige", "11157"),
  159. RawUser("Benjamin Levine", "semper@sempertellusid.net", "1-367-371-7771", "512-8900 Donec Road", "Campitello di Fassa", "47430"),
  160. RawUser("Damian Larson", "in@ornareFuscemollis.net", "1-498-843-7062", "P.O. Box 234, 2203 Ligula Ave", "Logroño", "41571"),
  161. RawUser("Ezekiel Prince", "ac.urna.Ut@metusAenean.org", "1-971-203-9102", "386-495 At, Road", "Lairg", "81468"),
  162. RawUser("Vance Buckner", "aliquam@placerataugue.edu", "1-349-600-6268", "P.O. Box 383, 7035 Porttitor Rd.", "Sargodha", "75905"),
  163. RawUser("Charles Ross", "facilisis@libero.co.uk", "1-410-219-4512", "Ap #702-3802 Est Rd.", "Clauzetto", "43154"),
  164. RawUser("Jesse Mcclure", "In.at.pede@tristiqueneque.ca", "1-863-278-8416", "601-3413 Lorem, St.", "Inverurie", "77262"),
  165. RawUser("Robert Garrett", "magna@consectetueradipiscingelit.co.uk", "1-205-513-2144", "9802 Orci, St.", "Mobile", "82448"),
  166. RawUser("Asher Sheppard", "sagittis.felis@et.net", "1-778-105-4304", "Ap #661-2405 Nec, Ave", "Snaaskerke", "16149"),
  167. RawUser("Rudyard Clarke", "sit@penatibus.edu", "1-145-653-2780", "575-8885 Libero. Avenue", "Columbia", "40583"),
  168. RawUser("Len Booth", "Curabitur@arcu.com", "1-258-131-2361", "P.O. Box 102, 2187 Neque Rd.", "Saint-Honor�", "44393"),
  169. RawUser("Stephen Donovan", "ipsum.primis.in@dui.co.uk", "1-432-906-1540", "2571 Velit. Road", "Derby", "62658"),
  170. RawUser("Lyle Crosby", "arcu@Nullamvelitdui.com", "1-367-836-8888", "9047 Odio Street", "Nurallao", "59367"),
  171. RawUser("Lucian Langley", "odio.Nam@massaVestibulumaccumsan.net", "1-410-284-4447", "P.O. Box 489, 1085 Libero Av.", "Henderson", "96821"),
  172. RawUser("Blaze Clay", "vulputate.lacus@volutpatNulladignissim.com", "1-726-294-0579", "858-4043 Vitae, Avenue", "Knoxville", "82277"),
  173. RawUser("Nathaniel Kirby", "Curae@egetmassa.com", "1-356-907-2894", "Ap #519-7722 Phasellus Road", "Lathuy", "91462"),
  174. RawUser("Nasim Bryan", "libero.nec@libero.net", "1-631-655-7295", "543-8590 Aliquam Avenue", "Kanpur Cantonment", "54711"),
  175. RawUser("Malik Scott", "placerat.augue.Sed@Quisqueaclibero.edu", "1-146-778-5936", "P.O. Box 661, 5677 Tincidunt Road", "100 Mile House", "50356"),
  176. RawUser("Jerome May", "molestie.tellus@tellus.edu", "1-269-921-5589", "7883 Parturient St.", "Girifalco", "77262"),
  177. RawUser("Channing White", "erat@semmagna.ca", "1-785-290-9592", "P.O. Box 161, 9738 At Rd.", "Posina", "11216"),
  178. RawUser("Burton Coffey", "arcu@ligulaelit.ca", "1-775-328-5408", "4496 Ac Road", "Sant'Onofrio", "58274"),
  179. RawUser("Russell Rose", "dapibus.quam.quis@purus.net", "1-648-302-0300", "4406 Est, Av.", "Liedekerke", "62749"),
  180. RawUser("Elliott Matthews", "metus.Aenean.sed@PhasellusnullaInteger.ca", "1-135-472-0268", "891-769 Suspendisse Road", "Castello di Godego", "96725"),
  181. RawUser("Amery Holden", "faucibus.lectus@sedturpisnec.net", "1-399-303-8748", "Ap #778-1201 Suspendisse Av.", "Coatbridge", "27973"),
  182. RawUser("Silas Hess", "ultrices.Vivamus.rhoncus@magnamalesuadavel.org", "1-687-821-9906", "1751 Adipiscing. Rd.", "Nanterre", "40201"),
  183. RawUser("Nehru Fitzgerald", "ante.dictum@hendreritconsectetuercursus.edu", "1-540-617-3646", "P.O. Box 492, 6328 Aliquam St.", "Temuka", "96921"),
  184. RawUser("Zachary Barr", "Nullam.lobortis@sociisnatoquepenatibus.com", "1-177-276-4590", "2842 Dictum. St.", "Sanluri", "21345"),
  185. RawUser("Damon Duffy", "Integer.in.magna@ornare.com", "1-990-929-4927", "P.O. Box 747, 5096 Nostra, Street", "Kawawachikamach", "66334"),
  186. RawUser("Zane Shepard", "Donec.nibh@Cum.net", "1-804-762-5946", "2577 Vestibulum Street", "Valpelline", "60429"),
  187. RawUser("Holmes Curry", "ultricies.sem.magna@imperdietnon.org", "1-336-633-9986", "539-5910 Dictum Ave", "Charny", "33521"),
  188. RawUser("Wing Potter", "consequat@Quisqueimperdiet.edu", "1-669-735-2219", "4252 Commodo Av.", "Malbaie", "35623"),
  189. RawUser("Keith Chavez", "Etiam.ligula@Curabitur.edu", "1-112-107-6174", "Ap #298-7976 Lectus St.", "Stene", "34636"),
  190. RawUser("Aladdin Estrada", "metus.urna@id.net", "1-413-459-2087", "Ap #576-8241 Id Road", "Camrose", "11723"),
  191. RawUser("Amos Carey", "sed.dui@Pellentesqueutipsum.co.uk", "1-285-437-0752", "784-4170 Neque Road", "Fort Smith", "39950"),
  192. RawUser("Ian Wood", "Sed.eu@estmaurisrhoncus.co.uk", "1-726-611-4659", "521-1785 Egestas Rd.", "Belcarra", "73779"),
  193. RawUser("Kadeem Jensen", "eros.Proin.ultrices@Donecsollicitudinadipiscing.org", "1-677-934-6135", "295-8084 At Avenue", "Indore", "43175"),
  194. RawUser("Jasper Powers", "Mauris.quis@Donec.org", "1-840-428-8519", "133-650 Cras Av.", "Ludwigsburg", "15305"),
  195. RawUser("Channing Welch", "Suspendisse.tristique.neque@etmagnis.com", "1-576-492-0869", "348-6059 Hendrerit St.", "Tiruchirapalli", "33843"),
  196. RawUser("Shad Everett", "erat.in@lacusCrasinterdum.com", "1-827-766-1966", "478 Velit Street", "Geest-GŽrompont-Petit-RosiŽre", "98937"),
  197. RawUser("Martin Kelly", "dolor.dolor.tempus@maurisanunc.edu", "1-568-234-4421", "960-6068 Eu, Street", "Los Vilos", "51181"),
  198. RawUser("Ivan Nguyen", "turpis@Suspendisseseddolor.net", "1-259-745-0261", "Ap #407-4780 Erat. St.", "Columbia", "85220"),
  199. RawUser("Joshua Oliver", "ut.pellentesque.eget@laoreetlectus.edu", "1-861-894-5360", "668-6348 Lobortis Ave", "Kingston", "60073"),
  200. RawUser("Beau Bond", "ipsum@Integer.net", "1-697-366-5554", "Ap #693-1876 Sed St.", "Te Awamutu", "34212"),
  201. RawUser("Oren Leach", "Mauris.non@consectetuerrhoncusNullam.com", "1-648-405-0040", "2977 Mi Ave", "Redwater", "22566"),
  202. RawUser("Wade Gross", "eget.tincidunt@seddictum.net", "1-628-791-9838", "Ap #935-3677 Fringilla Rd.", "Glossop", "87479"),
  203. RawUser("Sebastian Lindsey", "egestas.Duis@fermentum.net", "1-152-874-2732", "Ap #660-8944 Mauris. Rd.", "Lithgow", "82283"),
  204. RawUser("Daniel Crane", "semper@convallisligula.ca", "1-757-678-2972", "1395 Ac Rd.", "Castel Colonna", "90935")).toSeq
  205. }