1 # src/paths: what a path names, read by its segments, never by a suffix or a 2 # substring. A law file is one whose last segment is exactly LAWS.bend or 3 # PROOF.bend, so OUTLAWS.bend is not one; a test is one with a directory 4 # segment exactly `tests`, so contests/ is not one. Pure. 5 import Base 6 import ./lazy/lazy.bend as Lazy 7 8 # the last of the segments, or the one before when there are none 9 def base.go(segs: List<&2, String>, last: String) -> String: 10 match segs: 11 case Nil{}: 12 last 13 case Con{s, rest}: 14 base.go(rest, s) 15 16 # a path's last segment 17 def base(path: String) -> String: 18 base.go(String.split(path, '/'), "") 19 20 # is some segment but the last exactly `tests`? 21 def tested(segs: List<&2, String>) -> Bool: 22 match segs: 23 case Nil{}: 24 False{} 25 case Con{+s, +rest}: 26 Lazy.or_else(Bool.and(String.eq(s, "tests"), Bool.not(List.is_empty(&2, String, rest))), _u => tested(rest)) 27 28 # is the file under a `tests` directory? 29 def is_test(path: String) -> Bool: 30 tested(String.split(path, '/')) 31 32 # is it a LAWS.bend? 33 def is_laws(path: String) -> Bool: 34 String.eq(base(path), "LAWS.bend") 35 36 # is it a PROOF.bend? 37 def is_proof(path: String) -> Bool: 38 String.eq(base(path), "PROOF.bend") 39 40 # is it a LAWS.bend or a PROOF.bend? 41 def is_law_file(+path: String) -> Bool: 42 Bool.or(is_laws(path), is_proof(path))