My Optimized Adam & Eve

Posted by MarkPearl on Geeks with Blogs See other posts from Geeks with Blogs or by MarkPearl
Published on Fri, 04 Jun 2010 15:19:12 GMT Indexed on 2010/06/05 6:03 UTC
Read the original article Hit count: 634

Filed under:

 

Today I had a few minutes in the evening to go over my original Adam and Eve code… what I wanted to see tonight was if I could optimize the code any further… which I was pretty sure could be done. Ultimately what I wanted to find from the experiment was a balance between optimized code an reusable code.

On the one hand I can put everything into a single function and end up with a totally unusable function that is extremely compressed, which would have big comebacks when making modifications at a later stage. Alternatively I could have many single line functions that are extremely loosely coupled but sparsely spaced and so would almost be to fragmented to grok.

Ultimately I found with my current iteration something that I consider readable, yet compressed.

Code below…

// Learn more about F# at http://fsharp.net
open System

let people = [ ("Adam", None);
               ("Eve", None);
               ("Cain", Some("Adam", "Eve"));
               ("Abel", Some("Adam", "Eve")) ]               

//
// Prints the details
//
let showDetails(person : string * (string * string) option) =             
    let ParentsName =
        let parents = snd(person)
        match parents with
            | Some(dad, mum) ->  "Father " + dad + " and Mother " + mum
            | None -> "Has no parents!"

    let result = fst(person) + Environment.NewLine + ParentsName
    result
            
//
// Searches an array of people and looks for a match of names
//
let findPerson(name : string, people : (string * (string * string) option) list) =        
    
    // Try and find a match of the name
    let o = Seq.tryFind(fun person -> 
        match name with
            | firstName when firstName = fst(person) -> true
            | _ -> false) people              
    
    // Show the details based on the match result
    match o with
        | Option.Some(x) -> showDetails(Option.get(o))        
        | _ -> "Not Found"

        
Console.WriteLine(findPerson("Cains", people))
Console.ReadLine()

© Geeks with Blogs or respective owner