(template (list-T (T)) (struct list-T ((T value) ((* list-T) next)))) (template (make-list-T (T) is-public?) (,@(if is-public? '(pub) '()) fn (* list-T) make-list-T () (var (* list-T) list (cast (* list-T) (malloc (sizeof list-T)))) (= (-> list next) NULL) list)) (template (add-value-list-T (T) is-public?) (,@(if is-public? '(pub) '()) fn void add-value-list-T ((list-T *list) (T value)) (while (!= (-> list next) NULL) (= list (-> list next))) (= (-> list next) (make-list-T)) (= (-> list value) value))) (template (length-list-T (T) is-public?) (,@(if is-public? '(pub) '()) fn size-t length-list-T ((list-T *list)) (var size-t n 0) (while (!= (-> list next) NULL) (= list (-> list next)) (++ n)) n)) (template (is-empty-list-T (T) is-public?) (,@(if is-public? '(pub) '()) fn bool is-empty-list-T ((list-T *list)) (== (-> list next) NULL))) (template (list-for-each (what-do list-var elt-var)) (var int elt-var (-> list-var value)) (while (!= (-> list-var next) NULL) what-do (= list-var (-> list-var next)) (= elt-var (-> list-var value))))