# Use Cases

The following examples demonstrate using `chars` objects inside functions, no longer needing to spell out `strsplit(x, "")[[1]]` every time.

    library(charcuterie)

## Test Membership

Which letters are vowels (aeiou)?

    vowels <- function(word) {
      ch <- chars(word)
      setNames(ch %in% chars("aeiou"), ch)
    }
    vowels("string")
    #>     s     t     r     i     n     g
    #> FALSE FALSE FALSE  TRUE FALSE FALSE
    vowels("banana")
    #>     b     a     n     a     n     a
    #> FALSE  TRUE FALSE  TRUE FALSE  TRUE

Since `%in%` is vectorised, it works nicely with a `chars` object

    banana <- chars("banana")
    banana[which(banana %in% chars("aeiou"))]
    #> [1] "aaa"

    onomatopoeia <- chars("onomatopoeia")
    onomatopoeia[which(onomatopoeia %in% chars("aeiou"))]
    #> [1] "ooaooeia"

## Iterate

“Strings” are finally iterable

    for (x in chars("ABC")) {
      print(paste("Appendix", x))
    }
    #> [1] "Appendix A"
    #> [1] "Appendix B"
    #> [1] "Appendix C"

## Identify Palindromes

Is a word a palindrome (spelled the same forwards and backwards)?

    palindrome <- function(a, ignore_spaces = FALSE) {
      a <- chars(a)
      if (ignore_spaces) a <- except(a, " ")
      all(rev(a) == a)
    }
    palindrome("palindrome")
    #> [1] FALSE
    palindrome("racecar")
    #> [1] TRUE
    palindrome("never odd or even", ignore_spaces = TRUE)
    #> [1] TRUE
    palindrome("go hang a salami im a lasagna hog", ignore_spaces = TRUE)
    #> [1] TRUE

## Find Anagrams

Are two words just rearrangements of their letters?

    anagram <- function(a, b) {
      is_anagram <- function(a, b) {
        length(a) == length(b) && all(sort(a) == sort(b))
      }
      sapply(candidates, \(x) is_anagram(chars(a), chars(x)))
    }
    target <- "stressed"
    candidates <- c("started", "desserts", "rested")
    anagram(target, candidates)
    #>  started desserts   rested
    #>    FALSE     TRUE    FALSE

## Spongebob Case

Make every second letter uppercase

    spongebob <- function(phrase) {
      x <- chars(phrase)
      odds <- seq(1, length(x), 2)
      x[odds] <- toupper(x[odds])
      string(x)
    }
    spongebob("you can't do anything useful with this package")
    #> [1] "YoU CaN'T Do aNyThInG UsEfUl wItH ThIs pAcKaGe"