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) %>% # drop geometry and hierarchy components
  mutate(.vx0 = vertex_,   ## specify in segment terms 
         .vx1 = vertex_ + 1L) %>% 
  group_by(path_)  %>% # group by path hierarchy
  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, vertex_), "vertex_") %>% 
  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.33    0.30    1.62
system.time({plot(SC(inlandwaters))})

##    user  system elapsed 
##    1.20    0.37    1.58