test-interface.c
#include <stdio.h>
#include <assert.h>
#include <llib/str.h>
#include <llib/json.h>
#include <llib/list.h>
#include <llib/map.h>
#include <llib/interface.h>
typedef struct {
    char* (*tostring) (void *o);
    void* (*parse) (const char *s); } Stringer;
static char* list_tostring(void *o) {
    return str_fmt("List[%d]",list_size((List*)o));
}
static Stringer s_list = {
    list_tostring,
    NULL  };
void defining_an_interface() {
        obj_new_type(Stringer,NULL);
        interface_add(interface_typeof(Stringer), interface_typeof(List), &s_list);
    List *ls = list_new_str();
    list_add(ls, "ein");
    list_add(ls, "zwei");
    list_add(ls, "drei");
        Stringer* s = interface_get_by_name(Stringer,ls);
    assert(str_eq(s->tostring(ls),"List[3]"));
}
int main()
{
    char** ss = str_strings("one","two","three",NULL);
    Iterator* it = interface_get_iterator(ss);
    char* s, *t;
    while (it->next(it,&s)) {
        printf("got '%s'\n",s);
    }
    void *smap = VMS("one","1","two","2","three","3");
    it = interface_get_iterator(smap);
    while (it->nextpair(it,&s,&t)) {
        printf("'%s': '%s'\n",s,t);
    }
    ObjLookup L = interface_get_lookup(smap);
    printf("lookup '%s'\n",(char*)L(smap,"two"));
    List *ls = list_new_str();
    list_add(ls, "ein");
    list_add(ls, "zwei");
    list_add(ls, "drei");
    it = interface_get_iterator(ls);
    while (it->next(it,&s)) {
        printf("got '%s'\n",s);
    }
    Map *m = map_new_str_str();
    map_put(m,"one","1");
    map_put(m,"two","2");
    map_put(m,"three","3");
    it = interface_get_iterator(m);
    while (it->nextpair(it,&s,&t)) {
        printf("'%s': '%s'\n",s,t);
    }
    defining_an_interface();
    return 0;
}