Working functionally with third party libraries

ZombineDev via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu Jul 16 13:41:18 PDT 2015


On Thursday, 16 July 2015 at 20:17:54 UTC, Jarl André Hübenthal 
wrote:
> On Thursday, 16 July 2015 at 20:00:38 UTC, Ali Çehreli wrote:
>> On 07/16/2015 12:35 PM, "Jarl 
>> =?UTF-8?B?QW5kcsOpIEjDvGJlbnRoYWwi?= <jarl.andre at gmail.com>" 
>> wrote:
>>> Hi
>>>
>>> using mongo with vibe.d is easy. But I would like to skip the 
>>> foreach on
>>> MongoCursor?
>>>
>>> I mean, I want to use map!, filter! and reduce! on the 
>>> resulting docs.
>>> Is there a fast way to convert MongoCursor to an array 
>>> without resolving
>>> to ugly for loops with appender! ?
>>
>> I've never used MongoCursor but judging from the fact that it 
>> has empty, front, and popFront(), it is an InputRange:
>>
>>   http://vibed.org/api/vibe.db.mongo.cursor/MongoCursor
>>
>> Have you tried using it with map and others? What errors do 
>> you get?
>>
>> Ali
>
> Ah well I got another error now. Using the following code:
>
> 	Resource[] getResource() {
> 		auto coll = client.getCollection("app.resource");
> 		return coll.find().map!(doc => deserialize!(BsonSerializer, 
> Resource)(doc));
> 	}
>
> I get this error:
>
> src/app.d(51,21): Error: cannot implicitly convert expression 
> (map(coll.find())) of type MapResult!(__lambda1, 
> MongoCursor!(Bson, Bson, typeof(null))) to Resource[]

Most of the functions from std.algorithm and std.range return a 
lazy range which you need to iterate over go get its elements.
To turn those ranges to an array you need add a .array at the end 
(http://dlang.org/phobos/std_array#array). Here's a larger 
example: http://d.readthedocs.org/en/latest/introduction.html.

Another option is to return the elements as a range (by making 
return type of your function auto), instead of putting them into 
a newly allocated array (with .array). This way may be a bit more 
work (delaying the call to .array), but it can be quite efficient 
because it removes the need to allocate memory.



More information about the Digitalmars-d-learn mailing list