take -package:base -is:exact -package:vector -package:filepath package:pipes

(take n) only allows n values to pass through
take 0 = return ()

take (m + n) = take m >> take n
take <infinity> = cat

take (min m n) = take m >-> take n
(takeWhile p) allows values to pass downstream so long as they satisfy the predicate p.
takeWhile (pure True) = cat

takeWhile (liftA2 (&&) p1 p2) = takeWhile p1 >-> takeWhile p2
(takeWhile' p) is a version of takeWhile that returns the value failing the predicate.
takeWhile' (pure True) = cat

takeWhile' (liftA2 (&&) p1 p2) = takeWhile' p1 >-> takeWhile' p2