## Licensed to the Apache Software Foundation (ASF) under one
## or more contributor license agreements.  See the NOTICE file
## distributed with this work for additional information
## regarding copyright ownership.  The ASF licenses this file
## to you under the Apache License, Version 2.0 (the
## "License"); you may not use this file except in compliance
## with the License.  You may obtain a copy of the License at
##
##   http://www.apache.org/licenses/LICENSE-2.0
##
## Unless required by applicable law or agreed to in writing,
## software distributed under the License is distributed on an
## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
## KIND, either express or implied.  See the License for the
## specific language governing permissions and limitations
## under the License.
#title( 'LoopTool' )
<p>
$text.demo.thisPage.insert("#doclink( 'LoopTool' true )").
</p>
<p>
$text.loop.intro
</p>

#set( $fullDemo =
'#set( $numbers = [1..5] )
#set( $letters = ["A","B","C"] )
#set( $symbols = ["!", "@"] )
#foreach( $l in $loop.watch($letters, "l").sync($symbols, "s") )
  #foreach( $n in $loop.watch($numbers).exclude(3) )
#if( $loop.first )$l$loop.s[#end##
$n##
#if( $loop.last )]  #else, #end##
#if( $l == "B" )$loop.stop("l")#end## stop the letter loop after B
  #end
#end'
)

#parse( 'fullDemo.vm' )
