! Copyright (C) 2009, 2011 Doug Coleman, John Benediktsson. ! See http://factorcode.org/license.txt for BSD license. USING: accessors arrays assocs combinators effects fry generalizations kernel macros math math.order memoize sequences sequences.generalizations sequences.private stack-checker stack-checker.backend stack-checker.errors stack-checker.values stack-checker.visitor words ; IN: combinators.smart GENERIC: infer-known* ( known -- effect ) : infer-known ( value -- effect ) known dup (literal-value?) [ (literal) [ infer-literal-quot ] with-infer drop ] [ infer-known* ] if ; IDENTITY-MEMO: inputs/outputs ( quot -- in out ) infer [ in>> ] [ out>> ] bi [ length ] bi@ ; : inputs ( quot -- n ) inputs/outputs drop ; inline : outputs ( quot -- n ) inputs/outputs nip ; inline \ inputs/outputs [ peek-d infer-known [ [ pop-d 1array #drop, ] [ [ in>> ] [ out>> ] bi [ length apply-object ] bi@ ] bi* ] [ \ inputs/outputs dup required-stack-effect apply-word/effect pop-d pop-d swap [ [ input-parameter swap set-known ] [ push-d ] bi ] bi@ ] if* ] "special" set-word-prop M: curried infer-known* quot>> infer-known dup [ curry-effect ] [ drop f ] if ; M: composed infer-known* [ quot1>> ] [ quot2>> ] bi [ infer-known ] bi@ 2dup and [ compose-effects ] [ 2drop f ] if ; M: declared-effect infer-known* known>> infer-known* ; M: input-parameter infer-known* drop f ; M: object infer-known* drop f ; : drop-inputs ( quot -- ) inputs ndrop ; inline : drop-outputs ( quot -- ) [ call ] [ outputs ndrop ] bi ; inline : keep-inputs ( quot -- ) [ ] [ inputs ] bi nkeep ; inline : output>sequence ( quot exemplar -- seq ) [ [ call ] [ outputs ] bi ] dip nsequence ; inline : output>array ( quot -- array ) { } output>sequence ; inline : cleave>array ( obj quots -- array ) '[ _ cleave ] output>array ; inline : cleave>sequence ( x seq exemplar -- array ) [ '[ _ cleave ] ] dip output>sequence ; inline : input