private static TaxiTripEntry SingleFromBinary(BinaryReader binaryReader)
        {
            var pickupLongtitude  = binaryReader.ReadSingle();
            var pickupLatitude    = binaryReader.ReadSingle();
            var dropoffLongtitude = binaryReader.ReadSingle();
            var dropoffLatitude   = binaryReader.ReadSingle();
            var numOfPassangers   = binaryReader.ReadInt32();
            var pickupTime        = DateTime.FromBinary(binaryReader.ReadInt64());
            var dropoffTime       = DateTime.FromBinary(binaryReader.ReadInt64());
            var paymentType       = PaymentTypeUtils.FromBinary(binaryReader.ReadByte()).ValueUnsafe;
            var taxiVendor        = TaxiVendorUtils.FromBinary(binaryReader.ReadByte()).ValueUnsafe;
            var tripDistance      = binaryReader.ReadSingle();
            var tripTime          = binaryReader.ReadSingle();
            var tip          = binaryReader.ReadSingle();
            var fareAmount   = binaryReader.ReadSingle();
            var totalPayment = binaryReader.ReadSingle();

            return(new TaxiTripEntry(pickupLongtitude, pickupLatitude, dropoffLongtitude, dropoffLatitude,
                                     numOfPassangers, pickupTime, dropoffTime, paymentType, taxiVendor, tripDistance,
                                     tripTime, tip, fareAmount,
                                     totalPayment));
        }
        public static Maybe <TaxiTripEntry> TryParse(string tripDataCsvLine, string tripFareCsvLine)
        {
            var dataTokens = tripDataCsvLine.SplitCsv();
            var fareTokens = tripFareCsvLine.SplitCsv();

            return
                ((dataTokens.Length == 14)
                 .BindMaybe(() => (fareTokens.Length == 11)
                            .BindMaybe(() => dataTokens[0].Equals(fareTokens[0])
                                       .BindMaybe(() => TaxiVendorUtils.TryParse(dataTokens[2])
                                                  .Bind(vendor => dataTokens[5].TryParseDateTime()
                                                        .Bind(pickupDateTime => dataTokens[6].TryParseDateTime()
                                                              .Bind(dropoffDateTime => dataTokens[7].TryParseInt()
                                                                    .Bind(passengerCount => dataTokens[8].TryParseFloat()
                                                                          .Bind(tripTime => dataTokens[9].TryParseFloat()
                                                                                .Bind(tripDistance => dataTokens[10].TryParseFloat()
                                                                                      .Bind(pickupLongtitude => dataTokens[11].TryParseFloat()
                                                                                            .Bind(pickupLatitude => dataTokens[12].TryParseFloat()
                                                                                                  .Bind(dropoffLongtitude => dataTokens[13].TryParseFloat()
                                                                                                        .Bind(dropoffLatitude => pickupLongtitude.InRange(-75f, -70f)
                                                                                                              .BindMaybe(() => dropoffLongtitude.InRange(-75f, -70f)
                                                                                                                         .BindMaybe(() => pickupLatitude.InRange(35f, 45f)
                                                                                                                                    .BindMaybe(() => dropoffLatitude.InRange(35f, 45f)
                                                                                                                                               .BindMaybe(() => PaymentTypeUtils.TryParse(fareTokens[4])
                                                                                                                                                          .Bind(paymentType => fareTokens[5].TryParseFloat()
                                                                                                                                                                .Bind(fareAmount => fareTokens[8].TryParseFloat()
                                                                                                                                                                      .Bind(tipAmount => fareTokens[10].TryParseFloat()
                                                                                                                                                                            .Map(totalAmount => new TaxiTripEntry(pickupLongtitude, pickupLatitude, dropoffLongtitude, dropoffLatitude, passengerCount, pickupDateTime, dropoffDateTime, paymentType, vendor, tripDistance, tripTime, tipAmount, fareAmount, totalAmount)))))))))))))))))))))));
        }