USING: accessors arrays assocs bson.constants classes classes.tuple combinators continuations fry kernel mongodb.driver sequences strings vectors words combinators.smart ; IN: mongodb.tuple SINGLETONS: +transient+ +load+ ; IN: mongodb.tuple.collection FROM: mongodb.tuple => +transient+ +load+ ; MIXIN: mdb-persistent SLOT: _id SLOT: _mfd TUPLE: mdb-tuple-collection < mdb-collection { classes } ; GENERIC: tuple-collection ( object -- mdb-collection ) GENERIC: mdb-slot-map ( tuple -- string ) assoc ( seq -- assoc ) [ dup assoc? [ 1array { "" } append ] unless ] map ; : optl>map ( seq -- map ) H{ } clone tuck '[ split-optl opt>assoc swap _ set-at ] each ; inline PRIVATE> : MDB_ADDON_SLOTS ( -- slots ) [ MDB_OID_FIELD MDB_META_FIELD ] output>array ; inline : link-class ( collection class -- ) over classes>> [ 2dup member? [ 2drop ] [ push ] if ] [ 1vector >>classes ] if* drop ; inline : link-collection ( class collection -- ) [ swap link-class ] [ MDB_COLLECTION set-word-prop ] 2bi ; inline : mdb-check-slots ( superclass slots -- superclass slots ) over all-slots [ name>> ] map [ MDB_OID_FIELD ] dip member? [ ] [ MDB_ADDON_SLOTS prepend ] if ; inline : set-slot-map ( class options -- ) '[ _ optl>map MDB_SLOTDEF_LIST set-word-prop ] keep dup tuple-collection link-collection ; inline M: tuple-class tuple-collection ( tuple -- mdb-collection ) (mdb-collection) ; M: mdb-persistent tuple-collection ( tuple -- mdb-collection ) class (mdb-collection) ; M: mdb-persistent mdb-slot-map ( tuple -- string ) class (mdb-slot-map) ; M: tuple-class mdb-slot-map ( class -- assoc ) (mdb-slot-map) ; M: mdb-collection mdb-slot-map ( collection -- assoc ) classes>> [ mdb-slot-map ] map assoc-combine ; GENERIC: ( name -- mdb-tuple-collection ) M: string ( name -- mdb-tuple-collection ) collection-map [ ] [ key? ] 2bi [ at ] [ [ mdb-tuple-collection new dup ] 2dip [ [ >>name ] keep ] dip set-at ] if ; inline M: mdb-tuple-collection ( mdb-tuple-collection -- mdb-tuple-collection ) ; M: mdb-collection ( mdb-collection -- mdb-tuple-collection ) [ name>> ] keep { [ capped>> >>capped ] [ size>> >>size ] [ max>> >>max ] } cleave ; : transient-slot? ( tuple slot -- ? ) +transient+ slot-option? ; : load-slot? ( tuple slot -- ? ) +load+ slot-option? ;