Brace expansion: Difference between revisions

(→‎{{header|Haskell}}: Specified Parsec imports, tidied showExpansion.)
Line 3,070:
{}} some }{,{\\ edge \,}{ cases, {here} \\\\\}
{}} some }{,{\\ edge \,}{ cases, {here} \\\\\}
</pre>
 
{{trans|Python}}
<lang rust>
fn main() {
let input = "~/{Downloads,Pictures}/*.{jpg,gif,png}
It{{em,alic}iz,erat}e{d,}, please.
{,{,gotta have{ ,\\, again\\, }}more }cowbell!
{}} some }{,{\\\\{ edge, edge} \\,}{ cases, {here} \\\\\\\\\\}";
 
for line in input.split("\n") {
println!("{}", line);
for line in get_item(line, 0).0 {
println!("\t{}", line);
}
}
}
 
fn get_item(s: &str, depth: usize) -> (Vec<String>, &str) {
let mut out = vec![String::new()];
let mut s = s;
while !s.is_empty() {
let mut c = s.chars().nth(0).unwrap().to_string();
if depth > 0 && (c == "," || c == "}") {
return (out, s);
}
if c == "{" {
let x = get_group(&s[1..], depth + 1);
if x.is_some() {
let (items, s_new) = x.unwrap();
out = out
.iter()
.map(|out_item| {
items
.iter()
.map(|item| format!("{}{}", out_item, item))
.collect::<Vec<String>>()
})
.flatten()
.collect();
s = s_new;
continue;
}
}
if c == "\\" && s.len() > 1 {
s = &s[1..];
c.push(s.chars().nth(0).unwrap());
}
out = out
.iter()
.map(|o| [o, &c[..]].concat())
.collect::<Vec<String>>();
s = &s[1..];
}
(out, s)
}
 
fn get_group(s: &str, depth: usize) -> Option<(Vec<String>, &str)> {
let mut out: Vec<String> = vec![];
let mut comma = false;
let mut s = s;
while !s.is_empty() {
let (g, new_s) = get_item(s, depth);
s = new_s;
if s.is_empty() {
break;
}
out.extend(g);
if s.chars().nth(0).unwrap() == '}' {
if comma {
return Some((out, &s[1..]));
}
return Some((
out.iter().map(|item| format!("{{{}}}", item)).collect(),
&s[1..],
));
}
if s.chars().nth(0).unwrap() == ',' {
comma = true;
s = &s[1..];
}
}
None
}
</lang>
 
{{out}}
<pre>
~/{Downloads,Pictures}/*.{jpg,gif,png}
~/Downloads/*.jpg
~/Downloads/*.gif
~/Downloads/*.png
~/Pictures/*.jpg
~/Pictures/*.gif
~/Pictures/*.png
It{{em,alic}iz,erat}e{d,}, please.
Itemized, please.
Itemize, please.
Italicized, please.
Italicize, please.
Iterated, please.
Iterate, please.
{,{,gotta have{ ,\, again\, }}more }cowbell!
cowbell!
more cowbell!
gotta have more cowbell!
gotta have\, again\, more cowbell!
{}} some }{,{\\{ edge, edge} \,}{ cases, {here} \\\\\}
{}} some }{,{\\ edge \,}{ cases, {here} \\\\\}
{}} some }{,{\\ edge \,}{ cases, {here} \\\\\}
</pre>
 
Anonymous user