úÎfZdW&      !"#$%tested on GHC only experimental#Noam Lewis <jones.noamle@gmail.com> TODO: What's the semantic model for  a?  a b6 is the type of time-dependent processors, such that:  ' [[ 'IOSource' a b ]] = (a, Time) -> b lThus, it is ok to implement a processing action that outputs arbitrary time-dependent values during runtime ^ regardless of input. (Although the more useful case is to calculate something from the input a that is  also time-dependent. The a0 input is often not required and in those cases a = () is used. *Notice that this means that IOSource doesn't qualify as an . However, currently the  implementation does NOT4 enforce this, i.e. IOSource is not a newtype; I don't know how to implement it : correctly. Also, one question is whether primitives like chain will have to disallow placing  H as the second element in a chain. Maybe they should, maybe they shouldn't. The semantic model for  is a function:  " [[ 'IOProcessor' a b ]] = a -> b And the following laws:   The processing function ( a -> x -> m x>) must act as if purely, so that indeed for a given input the m output is always the same. One particular thing to be careful with is that the output does not depend ( on time (for example, you shouldn'5t use IOProcessor to implement an input device). The IOSource type m is defined exactly for time-dependent processors. For pointer typed inputs and outputs, see next law. ' For processors that work on pointers,  [[ Ptr t ]] = t&. This is guaranteed by the following & implementation constraints for IOProcessor a b:  If a is a pointer type ( a = Ptr pC), then the processor must NOT write (modify) the referenced data.  If b] is a pointer, the memory it points to (and its allocation status) is only allowed to change f by the processor that created it (in the processing and releasing functions). In a way this , generalizes the first constraint. Note, that unlike Yampa8, this model does not allow transformations of the type (Time -> a) -> (Time ->  b)f. The reason is that I want to prevent arbitrary time access (whether causal or not). This limitation & means that everything is essentially  point-wise5 in time. To allow memory-full operations under this  model,  is defined. See  5http://www.ee.bgu.ac.il/~noamle/_downloads/gaccum.pdf for more about  arbitrary time access. The type of Processors C a, b = the input and output types of the processor (think a -> b) 7 x = type of internal state (existentially quantified) &The arguments to the constructor are: V Processing function: Takes input and internal state, and returns new internal state. | Allocator for internal state (this is run only once): Takes (usually the first) input, and returns initial internal state. R Convertor from state x to output b: Takes internal state and returns the output. { Releaser for internal state (finalizer, run once): Run after processor is done being used, to release the internal state. TODO: do we need this? we'Are exporting the data constructor anyway for now, so maybe we don't. 7Chains two processors serially, so one feeds the next. jA processor that represents two sub-processors in parallel (although the current implementation runs them 2 sequentially, but that may change in the future) jConstructs a processor that: given two processors, gives source as input to both processors and runs them S independently, and after both have have finished, outputs their combined outputs. Semantic meaning, using Arrow's (&&& ) operator:  [[ forkJoin ]] = &&& i Or, considering the Applicative instance of functions (which are the semantic meanings of a processor):  [[ forkJoin ]] = liftA2 (,) + Alternative implementation to consider: f &&& g = (,)  & f  * g ?The identity processor: output = input. Semantically, [[ empty ]] = id JSplits (duplicates) the output of a functor, or on this case a processor. 'f --< g'H means: split f and feed it into g. Useful for feeding parallelized (***'d) processors.  For example, a --  (b *** c) = a >> (b &&& c) TRuns the processor once: allocates, processes, converts to output, and deallocates. YKeeps running the processing function in a loop until a predicate on the output is true. \ Useful for processors whose main function is after the allocation and before deallocation. ^Runs the processor once, but passes the processing + conversion action to the given function. rscanlT provides the primitive for performing memory-full operations on time-dependent processors, as described in  5http://www.ee.bgu.ac.il/~noamle/_downloads/gaccum.pdf. Untested. eDifferentiate using scanlT. TODO: test, and also generalize for any monad (trivial change of types). &A few tricks by Saizan from #haskell to perhaps use here:  first f = (,)  $ (arr fst >>> f)  * arr snd  arr f = f  $ id  f *** g = (arr fst >>> f) &&& (arr snd >>> g)    tested on GHC only experimental#Noam Lewis <jones.noamle@gmail.com>BSome general utility functions for use with Processors and OpenCV Predicate for pressed keys cRuns the processor until a predicate is true, for predicates, and processors that take () as input , (such as chains that start with a camera). Name (and type) says it all. A capture device, using OpenCV' s HighGui lib's cvCreateCameraCapture + should work with most webcames. See OpenCV's docs for information. M This processor outputs the latest image from the camera at each invocation. A window that displays images. J Note: windows with the same index will be the same window....is this ok? dA convenience function for constructing a common type of processors that work exclusively on images !OpenCV' s cvResize "OpenCV' s cvDilate #OpenCV's cvCanny  Threshold 1  Threshold 2 Size $Wrapper for OpenCV'_s cvHaarDetectObjects and the surrounding required things (mem storage, cascade loading, etc). PCascade filename (OpenCV comes with several, including ones for face detection) scale factor min neighbors flags  min size %OpenCV'Cs cvRectangle, currently without width, color or line type control  !"#$% !"#$% !"#$%'      !"#$%&'()cv-combinators-0.1.2AI.CV.ProcessorAI.CV.ImageProcessorsClockDTimeIOSinkIOSource IOProcessor Processor processorchainparallelforkJoinemptysplit--<runrunUntilrunWithscanlT differentiate integratemax_min_ImageProcessor ImageSource ImageSink keyPressedrunTillrunTillKeyPressedcapturecamera videoFilewindowimageProcessorresizedilatecanny haarDetect drawRects$fArrowProcessor