Filter items from a list

Remove specific items from lists using fold in Clarity

(define-read-only (filter-item (l (list 100 uint)) (remove uint))
(get newList (fold remove-value l { compareTo: remove, newList: (list) }))
)
(define-private (remove-value (listValue uint) (trackerTuple { compareTo: uint, newList: (list 100 uint) }))
(merge trackerTuple {newList:
(if (is-eq listValue (get compareTo trackerTuple))
(get newList trackerTuple)
(unwrap-panic (as-max-len? (append (get newList trackerTuple) listValue) u100))
)
})
)
;; Example usage
(filter-item (list u1 u2 u3 u2 u4) u2) ;; Returns (u1 u3 u4)

Use cases

  • Removing blacklisted addresses from access lists
  • Filtering out completed tasks from todo lists
  • Excluding specific tokens from portfolios
  • Data cleanup in smart contracts

Key concepts

This pattern uses fold to iterate through a list and build a new list:

  • Accumulator: Tracks the value to remove and builds the new list
  • Conditional append: Only adds items that don't match the filter
  • Type safety: Maintains list type and maximum length