library(sf)
## Linking to GEOS 3.6.1, GDAL 2.2.3, proj.4 4.9.3
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(silicate)
library(ggplot2)

system.time({
  
  
d <- st_coordinates(inlandwaters) %>% tibble::as_tibble() %>% 
  mutate(vertex_ = row_number(), path_ = paste(L1, L2, L3, sep = "-")) %>% 
  group_by(path_) %>% mutate(row_per_path = row_number()) %>% ungroup()
## sf L1/L2/L3 are backwards (L3 only in multipolygon, but it's the feature there)
 
## here the vertex-within-group-thing needs to be fixed
segs <- d %>% select(-X, -Y, -L3, -L2, -L1, -vertex_, -row_per_path) %>% # drop geometry and hierarchy components
  group_by(path_)  %>% # group by path hierarchy
  mutate(.vx0 = row_number(),   ## specify in segment terms 
         .vx1 = row_number() %% n() + 1L) %>% 
  slice(-n()) %>% ## now drop final closing (polygon only)
  ungroup() %>% mutate(edge_ = row_number())
g <- segs %>% #dplyr::select(-path_) %>% 
  tidyr::gather(node_, vertex_,  -edge_, -path_) %>% 
  inner_join(d %>% dplyr::select(X, Y, row_per_path, path_), c("vertex_" = "row_per_path",  "path_" = "path_")) %>% 
  dplyr::select(-vertex_) %>% 
  tidyr::gather(coord, val, -edge_, -node_, -path_) %>% 
  transmute(path_, edge_,  val, .v = paste(node_, coord, sep = '')) %>% 
  tidyr::spread(.v, val) %>% 
  ggplot() + 
    geom_segment(aes(.vx0X, .vx0Y, xend = .vx1X, yend = .vx1Y, colour = path_)) + 
  guides(colour = FALSE) 
print(g)
 
  
})

##    user  system elapsed 
##    1.20    0.36    1.58
system.time({plot(SC(inlandwaters))})

##    user  system elapsed 
##    1.29    0.33    1.62