/** @file ObjectPrimitives.cpp * * @author Roland Conybeare, Mar 2026 **/ #include "ObjectPrimitives.hpp" #include #include #include #include #include #include namespace xo { using xo::scm::ASequence; using xo::print::APrintable; using xo::mm::AAllocator; using xo::mm::AGCObject; using xo::facet::FacetRegistry; using xo::facet::TypeRegistry; namespace scm { // ----- nth ----- // TODO: seq_gc -> obj // n_gco -> obj // obj xfer_nth(obj rcx, obj seq_gco, obj n_gco) { (void)rcx; obj seq = seq_gco.to_facet(); auto n = obj::from(n_gco); return seq.at(n->value()); } DPrimitive_gco_2_gco_gco * ObjectPrimitives::make_nth_pm(obj mm) { return DPrimitive_gco_2_gco_gco::_make(mm, "nth", &xfer_nth); } // ----- cons ----- obj xfer_cons(obj rcx, obj car, obj cdr) { (void)rcx; auto cdr_list = obj::from(cdr); return DList::cons(rcx.allocator(), car, cdr_list.data()); } DPrimitive_gco_2_gco_gco * ObjectPrimitives::make_cons_pm(obj mm) { return DPrimitive_gco_2_gco_gco::_make(mm, "cons", &xfer_cons); } // ----- dict_make ----- obj xfer_dict_make(obj rcx) { return obj(DDictionary::empty(rcx.allocator(), 8 /*cap*/)); } DPrimitive_gco_0 * ObjectPrimitives::make_dict_make_pm(obj mm) { return DPrimitive_gco_0::_make(mm, "dict_make", &xfer_dict_make); } // ----- dict_upsert ----- obj xfer_dict_upsert(obj rcx, obj dict, obj key, obj value) { scope log(XO_DEBUG(true)); log && log(xtag("dict.tseq", dict._typeseq()), xtag("dict.tname", TypeRegistry::id2name(dict._typeseq()))); log && log(xtag("key.tseq", key._typeseq()), xtag("key.tname", TypeRegistry::id2name(key._typeseq()))); log && log(xtag("value.tseq", value._typeseq()), xtag("value.tname", TypeRegistry::id2name(value._typeseq()))); auto value_pr = FacetRegistry::instance().variant(value); log && log(xtag("value", value_pr)); dict->upsert(rcx.allocator(), DDictionary::pair_type(key.data(), value)); return dict; } DPrimitive_gco_3_dict_string_gco * ObjectPrimitives::make_dict_upsert_pm(obj mm) { return DPrimitive_gco_3_dict_string_gco::_make(mm, "dict_upsert", &xfer_dict_upsert); } } /*namespace scm*/ } /*namespace xo*/ /* end ObjectPrimitives.cpp */