adamc@1015: datatype t' = O | S of source t' adamc@1015: type t = source t' adamc@1015: adamc@1015: val zero = source O adamc@1015: adamc@1015: fun inc n = adamc@1015: v <- get n; adamc@1015: case v of adamc@1015: O => adamc@1015: n' <- source O; adamc@1015: set n (S n') adamc@1015: | S n => inc n adamc@1015: adamc@1015: fun dec n = adamc@1015: let adamc@1015: fun dec' last n = adamc@1015: v <- get n; adamc@1015: case v of adamc@1015: O => (case last of adamc@1015: None => return () adamc@1015: | Some n' => set n' O) adamc@1015: | S n' => dec' (Some n) n' adamc@1015: in adamc@1015: dec' None n adamc@1015: end adamc@1015: adamc@1015: fun render [ctx] [inp] [[Body] ~ ctx] (xml : xml ([Body] ++ ctx) inp []) n = adamc@1015: let adamc@1015: fun render n = adamc@1015: n <- signal n; adamc@1015: return (render' n) adamc@1015: adamc@1015: and render' n = adamc@1015: case n of adamc@1015: O => adamc@1015: | S n => adamc@1015: {xml} adamc@1015: adamc@1015: adamc@1015: in adamc@1015: adamc@1015: end