Last active
December 24, 2015 05:49
-
-
Save shadeglare/6753371 to your computer and use it in GitHub Desktop.
F sharp passenger tattoo assignment concept
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
open System | |
type PassengerType = | |
| Adult | |
| Children | |
| Infant | |
type Passenger = { | |
FirstName: String; | |
LastName: String; | |
Type: PassengerType; | |
} | |
let passengers = [ | |
{ FirstName = "first1"; LastName = "last1"; Type = Adult }; | |
{ FirstName = "first2"; LastName = "last2"; Type = Infant }; | |
{ FirstName = "first3"; LastName = "last3"; Type = Adult }; | |
{ FirstName = "first4"; LastName = "last4"; Type = Children }; | |
{ FirstName = "first5"; LastName = "last5"; Type = Children }; | |
{ FirstName = "first6"; LastName = "last6"; Type = Infant }; | |
{ FirstName = "first7"; LastName = "last7"; Type = Adult }; | |
] | |
let adults, children, infants = | |
let FilterPassenger passengerType = | |
List.filter (fun p -> p.Type = passengerType) passengers | |
FilterPassenger Adult, FilterPassenger Children, FilterPassenger Infant | |
let pairs, freeAdults = | |
let rec Pairwise pairs frees = function | |
| adult::adults, infant::infants -> | |
let pair = adult, infant | |
Pairwise (pair::pairs) frees (adults, infants) | |
| adults, _ -> pairs, frees @ adults | |
Pairwise [][] (adults, infants) | |
let childWithTattoo, freeAdultsWithTattoo, pairsWithTattoo = | |
let offsetRef = ref 1 | |
let TattooWithGap gap = | |
let currentOffset = !offsetRef | |
List.mapi (fun i v -> | |
incr offsetRef | |
currentOffset + i * gap, v) | |
TattooWithGap 1 children, TattooWithGap 1 freeAdults, TattooWithGap 2 pairs | |
for tatoo, child in childWithTattoo do | |
printfn "%i %s" tatoo child.FirstName | |
printfn "" | |
for tatoo, adult in freeAdultsWithTattoo do | |
printfn "%i %s" tatoo adult.FirstName | |
printfn "" | |
for tatoo, (adult, infant) in pairsWithTattoo do | |
printfn "%i %s %s" tatoo adult.FirstName infant.FirstName |
Fixed according to the best practice!
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
without noise