Howdy,

I'm a clojure fan but quite new to writing clojure.  I'm writing my first 
app and had a few style questions.

I'm doing a web service call to the lastfm api.  It returns some json like:

{
    "results": {
        "albummatches": {
            "album": [
                {
                    "name": "In The Future",
                    "artist": "Black Mountain",
                    "image": [{
                        "size": "small",
                        "#text": "http://example.com/image/url.jpg";
                    }]
                }
            ]
        }
    }
}


One notes is that the 'album' key in the json can either be missing (0 
results) a map itself (1 result) or the array (2+ results).

I then want to turn it into structure like:

{
    "albums": [{
        "name": "In The Future",
        "artist": "Black Mountain",
        "images": {
            "small": "http://example.com/image/url.jpg";
        }
    }]
}


Here is the clojure code I came up with:

(defn- transform-album-images [images]
    (into {} (map (fn [image] [(:size image) (:#text image)]) images)))
 
(defn- transform-album [album]
  (let [album (select-keys album [:name :artist :image])
        album (update-in album [:image] transform-album-images)
        album (clojure.set/rename-keys album { :image :images })]
    album))
 
(defn search [term]
  (let [albums (api/get {:method "album.search" :album term})
        albums (get-in albums [:results :albummatches :album] [])
        albums (if (vector? albums) albums (vector albums))
        albums (map transform-album albums)]
    {:albums albums}))



My main question is whether this is at all 'idomatic' clojure.  I have a 
few specific questions too.

- I broke out two functions -- transform-album-images and transform-album 
-- because I wasn't sure how to squeeze them into the first function.  They 
really have no purpose outside of the 'search' function though.  I don't 
know why, but it kinda bugs me because it seems to detract from the main 
function 'search' as they have to appear above 'search'.

- the (api/get ...) call talks to an external webservice.  Everything else 
is a 'pure' function.  Is including the (api/get) call inside the 'search' 
function bad?  I'm a bit hazy on the write split from pure / non-pure code.

I feel like transforming data between two representations with a side 
effect at each end is like 90% of code I write so I'd like to get a good 
feel for doing this in clojure :)

Thanks for any tips.

-- 
-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to