---
title: "Utility Functions"
output: rmarkdown::html_vignette
author: Zhengjia Wang
vignette: >
  %\VignetteIndexEntry{Utility Functions}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)
```

```{r setup}
library(dipsaus)
```


#### 1. Cat strings with levels: `DEBUG`, `INFO`, `WARNING`, `ERROR`, and `FATAL`

```{r, eval=FALSE}
cat2('Debug passed!', level = 'DEBUG')
#> ✔ Debug passed!

cat2('You are all set.', level = 'INFO')
#> ♥ You are all set.

cat2('Wait a second...', level = 'WARNING')
#> âš  Wait a second...

cat2('Ooops', level = 'ERROR')
#> ✖ Ooops

cat2('Bi--Doop---', level = 'FATAL')
#> ✖ Bi--Doop---
#> Error: 
#> ...
```

*Level `FATAL` will raise errors.*

#### 2. `parse_svec` and `deparse_svec`

`parse_svec` converts characters like `"7-10,14-15"` to numeric vectors

```{r}
parse_svec("7-10,14-15")
```

`deparse_svec` reverse the process

```{r}
deparse_svec(c(2,5,3,1,7))
```

Parameter `max_lag` in `deparse_svec` changes the threshold of integers collapsed together:

```{r}
deparse_svec(c(1,2,4,7,11))

deparse_svec(c(1,2,4,7,11), max_lag = 2)

deparse_svec(c(1,2,4,7,11), max_lag = 3)
```

#### 3. System Information

The goal is to work as an alternative to retrieve system information. For example, 
R doesn't provide functions to get memory limits, or CPU chip-set information on Linux or MacOS. 

```{r}
# Total RAM in bytes
get_ram()

# Print-friendly
to_ram_size(get_ram(), 1024)

# WARNING: $free is the total RAM - R usage, is no the actual free RAM
mem_limit2()
```

#### 4. Interactive Questions

`askYesNo` comes with `utils` package allows to ask yes/no questions and returns logical value. If `cancel` is entered, then the function returns `NA`, if answers other than `yes`, `no` or `cancel` is given, it raise an error. `dipsaus::ask_yesno` will ask the question again and again until the user actually say `yes` or `no`

```{r, eval=FALSE}
> ask_yesno('Please answer an yes/no question, ok?')
## ♥ Please answer an yes/no question, ok? (Yes/no): 
> qweee
## âš  Please answer Y/yes, N/no, or c to cancel. (Yes/no): 
> ttt
## âš  Please answer Y/yes, N/no, or c to cancel. (Yes/no): 
> y
## [1] TRUE
```

`ask_or_default` instead of asking a yes/no question, it asks a question with default answer. User don't have to type the answers if the they accept defaults:

```{r, eval=FALSE}
> ask_or_default("What is your password", default = 'I will not tell you!')
## ♥ What is your password
##   [default is ‘I will not tell you!’] 
>
## [1] "I will not tell you!"
```