2 | module Data.FilePath.Body
15 | check : (b : Bool) -> Maybe (b === True)
16 | check False = Nothing
17 | check True = Just Refl
19 | 0 unAnd : {x,y : Bool} -> (x && y) === True -> (x === True, y === True)
20 | unAnd {x = True} {y = True} _ = (Refl,Refl)
21 | unAnd {x = True} {y = False} _ impossible
22 | unAnd {x = False} {y = _} _ impossible
24 | 0 unAnd1 : {x,y : Bool} -> (x && y) === True -> x === True
25 | unAnd1 = fst . unAnd
27 | 0 unAnd2 : {x,y : Bool} -> (x && y) === True -> y === True
28 | unAnd2 = snd . unAnd
30 | 0 and : {x,y : Bool} -> x === True -> y === True -> (x && y) === True
31 | and {x = True} {y = True} _ _ = Refl
32 | and {x = True} {y = False} _ _ impossible
33 | and {x = False} {y = _} _ _ impossible
40 | public export %inline
51 | isBodyChar : Char -> Bool
52 | isBodyChar '/' = False
53 | isBodyChar '\\' = False
54 | isBodyChar c = not (isControl c)
57 | 0 BodyChar : Char -> Type
58 | BodyChar c = isBodyChar c === True
61 | 0 notBodyCharTab : BodyChar '\t' -> Void
62 | notBodyCharTab prf impossible
65 | 0 notBodyCharRet : BodyChar '\r' -> Void
66 | notBodyCharRet prf impossible
69 | 0 notBodyCharNL : BodyChar '\n' -> Void
70 | notBodyCharNL prf impossible
73 | 0 notBodyCharB : BodyChar '\b' -> Void
74 | notBodyCharB prf impossible
77 | 0 notBodyChar0 : BodyChar '\0' -> Void
78 | notBodyChar0 prf impossible
86 | isEndChar : Char -> Bool
87 | isEndChar c = isBodyChar c && c /= ' '
90 | 0 EndChar : Char -> Type
91 | EndChar c = isEndChar c === True
94 | Uninhabited (EndChar ' ') where
95 | uninhabited prf impossible
98 | 0 notEndCharSpace : EndChar ' ' -> Void
99 | notEndCharSpace prf impossible
107 | isSingleChar : Char -> Bool
108 | isSingleChar c = isEndChar c && c /= '.'
111 | 0 SingleChar : Char -> Type
112 | SingleChar c = isSingleChar c === True
115 | 0 notSingleCharDot : SingleChar '.' -> Void
116 | notSingleCharDot prf impossible
125 | isBodyInner : List Char -> Bool
126 | isBodyInner [] = False
127 | isBodyInner (x :: []) = isEndChar x
128 | isBodyInner (x :: xs) = isBodyChar x && isBodyInner xs
131 | 0 BodyInner : List Char -> Type
132 | BodyInner xs = isBodyInner xs === True
136 | isBodyChars : List Char -> Bool
137 | isBodyChars [] = False
138 | isBodyChars (x :: []) = isSingleChar x
139 | isBodyChars (x :: xs) = isEndChar x && isBodyInner xs
142 | 0 BodyChars : List Char -> Type
143 | BodyChars xs = isBodyChars xs === True
145 | 0 notBodyCharsEmpty : BodyChars [] -> Void
146 | notBodyCharsEmpty refl impossible
148 | 0 notBodyCharsDot : BodyChars ['.'] -> Void
149 | notBodyCharsDot refl impossible
156 | 0 toInner : (xs : List Char) -> BodyChars xs -> BodyInner xs
157 | toInner (x :: []) prf = unAnd1 prf
158 | toInner (x :: y :: ys) prf =
159 | let (p1,p2) = unAnd prf in and (unAnd1 p1) p2
160 | toInner [] prf impossible
163 | 0 appendInnerChars :
164 | (xs,ys : List Char)
167 | -> BodyInner (xs ++ ys)
168 | appendInnerChars (h :: []) (y :: ys) prf1 prf2 =
169 | and (unAnd1 prf1) prf2
170 | appendInnerChars (h :: t@(x :: xs)) ys prf1 prf2 =
171 | and (unAnd1 prf1) (appendInnerChars t ys (unAnd2 prf1) prf2)
172 | appendInnerChars [] _ _ _ impossible
173 | appendInnerChars _ [] _ _ impossible
176 | 0 appendBodyChars :
177 | (xs,ys : List Char)
180 | -> BodyChars (xs ++ ys)
181 | appendBodyChars (h :: []) (y :: ys) prf1 prf2 =
182 | and (unAnd1 prf1) (toInner (y :: ys) prf2)
183 | appendBodyChars (h :: x :: xs) ys prf1 prf2 =
184 | and (unAnd1 prf1) (appendInnerChars _ _ (unAnd2 prf1) $
toInner _ prf2)
185 | appendBodyChars [] _ _ _ impossible
186 | appendBodyChars _ [] _ _ impossible
189 | 0 preDotBodyChars : (cs : List Char) -> BodyChars cs -> BodyChars ('.' :: cs)
190 | preDotBodyChars (h :: t) prf = toInner _ prf
191 | preDotBodyChars [] prf impossible
203 | 0 prf : BodyChars body
205 | public export %inline
207 | MkBody x _ == MkBody y _ = x == y
209 | public export %inline
211 | compare (MkBody x _) (MkBody y _) = compare x y
215 | showPrec p (MkBody b _) = showCon p "MkBody" $
showArg b ++ " _"
217 | public export %inline
218 | Interpolation Body where
219 | interpolate (MkBody b _) = pack b
222 | Semigroup Body where
223 | MkBody x px <+> MkBody y py = MkBody (x ++ y) (appendBodyChars _ _px py)
228 | fromChars : List Char -> Maybe Body
229 | fromChars cs = case check (isBodyChars cs) of
230 | Just prf => Just $
MkBody cs prf
234 | public export %inline
235 | parse : String -> Maybe Body
236 | parse = fromChars . unpack
239 | fromString : (s : String) -> {auto 0 p : BodyChars (unpack s)} -> Body
240 | fromString s = MkBody (unpack s) p
243 | preDot : Body -> Body
244 | preDot (MkBody cs p) = MkBody ('.' :: cs) (preDotBodyChars _ p)
246 | export infixr 7 <.>
250 | (<.>) : Body -> Body -> Body
251 | x <.> y = x <+> preDot y
255 | split : Body -> Maybe (Body,Body)
256 | split (MkBody b _) =
257 | let ss := split ('.' ==) b
259 | (fromChars $
join $
intersperse ['.'] (init ss))
260 | (fromChars $
last ss) |]
264 | fileStem : Body -> Maybe Body
265 | fileStem = map fst . split
269 | isHidden : Body -> Bool
270 | isHidden (MkBody ('.' :: _) _) = True
275 | extension : Body -> Maybe Body
276 | extension = map snd . split
287 | "sdfljlsjdfsdfjl_kklsdfkj2320398wejjkwe0r9u23__02394oweijwjf"
288 | ++ "sdfljlsjdfsdfjl_kklsdfkj2320398wejjkwe0r9u23__02394oweijwjf"
289 | ++ "sdfljlsjdfsdfjl_kklsdfkj2320398wejjkwe0r9u23__02394oweijwjf"
290 | ++ "sdfljlsjdfsdfjl_kklsdfkj2320398wejjkwe0r9u23__02394oweijwjf"