(ns transducerpres.slides.how (:require [transducerpres.slides.util :refer [defslide defmarkdownslide clj-code markdown-slide markdown-part]])) (defslide intro-slide [:h3 "How do we create transducers?"] [:h3 "How do we use transducers?"]) (defn- func-link-bullet [name] (str "* `" name "`")) (def transducer-functions (clojure.string/split "map cat mapcat filter remove take take-while take-nth drop drop-while replace partition-by partition-all keep keep-indexed map-indexed distinct interpose dedupe random-sample" #" ")) (defn transducer-function-list [] (clojure.string/join "\n" (map func-link-bullet transducer-functions))) (defmarkdownslide how-to-create "#### How to create transducers?" "" "The majority of data processing method implement an arity that returns" "a transducer. The following functions produce a transducer when the " "input collection is omitted:" "" (transducer-function-list)) (defmarkdownslide how-to-use "#### How to use a transducer?" "" "* **transduce** is can be use like reduce" "* **eduction** is used to create reducible/iterable" "* **into** is used to append data to an existing collection" "* **sequence** can create a sequence from transducer") (defslide example-1 (markdown-part "#### example 1") (clj-code "(def xform (map #(* 2 %)))" "" "(transduce xform + 0 (range 10))" ";; 90" "" "(eduction xform (range 10))" ";; (0 2 4 6 8 10 12 14 16 18) ; an eduction" "")) (defslide example-2 (markdown-part "#### example 1... part 2") (clj-code "(def xform (map #(* 2 %)))" "" "(into [1 2] xform (range 10))" ";; [1 2 0 2 4 6 8 10 12 14 16 18]" "" "(into (list 1 2) xform (range 10))" ";; (18 16 14 12 10 8 6 4 2 0 1 2)" "" "(sequence xform (range 10))" ";; (0 2 4 6 8 10 12 14 16 18) ; lazy sec")) (defslide how-to-create-slides intro-slide how-to-create how-to-use example-1 example-2)