pavone@84: #{ pavone@84: llProperty: size withType: uint32_t pavone@84: llProperty: storage withType: uint32_t pavone@84: llProperty: data withType: ((object ptr) ptr) pavone@84: llMessage: get withVars: { pavone@84: index <- obj_int32 ptr pavone@84: } andCode: :index { pavone@84: if: (index num) >= 0 && (index num) < size { pavone@84: (self data) get: (index num) pavone@84: } else: { pavone@84: false pavone@84: } pavone@84: } pavone@144: pavone@84: llMessage: set withVars: { pavone@84: index <- obj_int32 ptr pavone@84: value <- object ptr pavone@84: } andCode: :index value { pavone@84: if: (index num) >= 0 && (index num) < size { pavone@84: data set: (index num) value pavone@84: } pavone@84: self pavone@84: } pavone@144: pavone@84: llMessage: foreach withVars: { pavone@84: clos <- lambda ptr pavone@84: i <- uint32_t pavone@84: index <- obj_int32 ptr pavone@84: } andCode: :clos { pavone@84: i <- 0 pavone@84: while: { i < size } do: { pavone@84: index <- make_object: (addr_of: obj_int32_meta) NULL 0 pavone@84: index num!: i pavone@84: ccall: clos 2 index (data get: i) pavone@84: i <- i + 1 pavone@84: } pavone@84: self pavone@84: } pavone@144: pavone@84: llMessage: append withVars: { pavone@84: value <- object ptr pavone@84: tmp <- (object ptr) ptr pavone@84: } andCode: :value { pavone@84: if: storage = size { pavone@84: storage <- storage * 2 pavone@84: tmp <- GC_REALLOC: data storage * (sizeof: (object ptr)) pavone@84: if: (not: tmp) { pavone@84: fputs: "Failed to increase array size\n" stderr pavone@84: exit: 1 pavone@84: } pavone@84: data <- tmp pavone@84: } pavone@84: data set: size value pavone@84: size <- size + 1 pavone@84: self pavone@84: } pavone@144: pavone@249: llMessage: resize withVars: { pavone@249: newsize <- obj_uint32 ptr pavone@249: tmp <- (object ptr) ptr pavone@249: } andCode: :newsize { pavone@249: self storage!: (newsize num) pavone@249: tmp <- GC_REALLOC: data storage * (sizeof: (object ptr)) pavone@249: if: (not: tmp) { pavone@249: fputs: "Failed to adjust array size\n" stderr pavone@249: exit: 1 pavone@249: } pavone@249: data <- tmp pavone@249: if: size > storage { pavone@249: size <- storage pavone@249: } pavone@249: self pavone@249: } pavone@249: pavone@84: llMessage: length withVars: { pavone@84: intret <- obj_int32 ptr pavone@84: } andCode: { pavone@84: intret <- make_object: (addr_of: obj_int32_meta) NULL 0 pavone@84: intret num!: size pavone@84: intret pavone@84: } pavone@144: pavone@84: fold:with <- :acc :fun { pavone@84: foreach: self :idx el { pavone@144: acc <- fun: acc el pavone@84: } pavone@144: acc pavone@84: } pavone@144: pavone@84: foldr:with <- :acc :fun { pavone@84: idx <- length - 1 pavone@84: while: {idx >= 0} do: { pavone@144: acc <- fun: acc (get: idx) pavone@84: } pavone@144: acc pavone@84: } pavone@144: pavone@84: map <- :fun { pavone@84: new <- #[] pavone@84: foreach: self :idx el { pavone@84: new append: (fun: el) pavone@84: } pavone@144: new pavone@84: } pavone@144: pavone@260: filter <- :fun { pavone@260: new <- #[] pavone@260: foreach: self :idx el { pavone@260: if: (fun: el) { pavone@260: new append: el pavone@260: } pavone@260: } pavone@260: new pavone@260: } pavone@260: pavone@84: find:withDefault <- :pred :default{ pavone@84: idx <- 0 pavone@84: l <- length pavone@84: ret <- default pavone@84: while: {idx < l} do: { pavone@84: v <- get: idx pavone@84: if: (pred: v) { pavone@84: ret <- #{ pavone@84: key <- idx pavone@84: value <- v pavone@84: } pavone@84: idx <- l pavone@84: } pavone@84: } pavone@84: ret pavone@84: } pavone@184: pavone@184: join <- :sep { pavone@184: if: length > 0 { pavone@186: str <- string: (get: 0) pavone@184: idx <- 1 pavone@184: l <- length pavone@184: while: { idx < l } do: { pavone@184: str <- str . sep . (get: idx) pavone@191: idx <- idx + 1 pavone@184: } pavone@184: str pavone@184: } else: { pavone@184: "" pavone@184: } pavone@184: } pavone@84: }