|
7 | 7 | -- Portability : GHC |
8 | 8 | -- |
9 | 9 | -- Return pathe with any leading directory components removed. |
10 | | --- If specified, also remove a trailing suffix (.extension). |
| 10 | +-- If specified, also remove a trailing suffix. |
11 | 11 |
|
12 | 12 | module Streamly.Coreutils.Basename |
13 | 13 | ( basename |
| 14 | + , basenameWith |
14 | 15 |
|
15 | 16 | -- * Options |
16 | 17 | , Basename |
| 18 | + , Suffix(..) |
17 | 19 | , suffix |
18 | 20 | ) |
19 | 21 | where |
20 | 22 |
|
21 | | -import System.FilePath (takeBaseName, takeFileName) |
22 | | -import Streamly.Coreutils.Common (Switch(..)) |
| 23 | +import Data.List (stripPrefix) |
23 | 24 |
|
24 | | -newtype Basename = Basename {keepSuffix :: Switch} |
| 25 | +data Suffix = None | Suffix [Char] |
25 | 26 |
|
26 | | -suffix :: Switch -> Basename -> Basename |
27 | | -suffix opt cfg = cfg {keepSuffix = opt} |
| 27 | +newtype Basename = Basename {removeSuffix :: Suffix} |
| 28 | + |
| 29 | +suffix :: Suffix -> Basename -> Basename |
| 30 | +suffix opt cfg = cfg {removeSuffix = opt} |
28 | 31 |
|
29 | 32 | defaultConfig :: Basename |
30 | | -defaultConfig = Basename On |
| 33 | +defaultConfig = Basename None |
31 | 34 |
|
32 | | -basename :: (Basename -> Basename) -> FilePath -> String |
33 | | -basename f path = |
| 35 | +basenameWith :: (Basename -> Basename) -> FilePath -> String |
| 36 | +basenameWith f path = |
34 | 37 | let opt = f defaultConfig |
35 | | - in case keepSuffix opt of |
36 | | - Off -> takeBaseName path |
37 | | - On -> takeFileName path |
| 38 | + base = reverse $ takeWhile (/= '/') $ reverse path |
| 39 | + in case removeSuffix opt of |
| 40 | + None -> base |
| 41 | + Suffix x -> |
| 42 | + let suf = reverse x |
| 43 | + val0 = stripPrefix suf $ takeWhile (/= '/') $ reverse path |
| 44 | + val = maybe base reverse val0 |
| 45 | + in val |
| 46 | + |
| 47 | +basename :: FilePath -> String |
| 48 | +basename = basenameWith id |
0 commit comments