On Monday, 13 April 2020 at 23:59:20 UTC, Adnan wrote:
I want to keep an ordered set of records and the standard provides me with RedBlackTree. The record is of type Tuple!(string, uint). Here's what it looks like:

import std.json : parseJSON;

        uint[string] wordTable;
        import std.datetime.stopwatch : StopWatch, AutoStart;

        auto sw = StopWatch(AutoStart.yes);
        const auto j = parseJSON(get(link));
        const long downloadTime = sw.peek.total!"msecs";

        import std.typecons : Tuple, tuple;
        import std.container.rbtree : RedBlackTree;
        import std.functional : binaryFun;

RedBlackTree!(Tuple!(string, uint), binaryFun!("a[1] > b[1]")) records;

        foreach (node; j["posts"].array()) {
                import std.stdio : writeln;
                import std.utf : decode;

                if ("com" in node) {
                        import std.algorithm : splitter;

                        foreach (word; getStr(node["com"].str()).splitter(' ')) 
{
                                import std.string : strip;

                                if (word.strip().length > 0)
                                        wordTable.require(word, 0)++;

                                records ~= (tuple(word, wordTable[word])); // 
error
                        }
                }
        }

Now primarily I used `insert()` method to add a record to the records but it causes segfault in runtime. So I decided to use ~= to see what's going on. Here's what the compiler says:

Error: cannot append type Tuple!(string, uint) to type std.container.rbtree.RedBlackTree!(Tuple!(string, uint), binaryFun, false)


So the gist of the question is, if I have an RedBlackTree with a custom binaryFun, how can I add tuples to it?

I also tried creating a new type:
                struct Record {
                string k;
                uint v;

                int opCmp(ref const Record other) const {
                        return v - other.v;
                }
        }
        
        bool less(Record a, Record b) {
            return a < b;
    }

        RedBlackTree!(Record) records;

        foreach (node; j["posts"].array()) {
                import std.utf : decode;

                if ("com" in node) {
                        import std.algorithm : splitter;

                        foreach (word; getStr(node["com"].str()).splitter(' ')) 
{
                                import std.string : strip;

                                if (word.strip().length > 0)
                                        wordTable.require(word, 0)++;

                                records ~= Record(word, wordTable[word]);
                        }
                }
        }

Compiler says:

Error: cannot append type Record to type std.container.rbtree.RedBlackTree!(Recor
d, "a < b", false)
source/app.d(153,18): Error: no [] operator overload for type Record source/app.d(157,58): Error: no [] operator overload for type Record source/app.d(158,40): Error: no [] operator overload for type Record

Reply via email to