quox/lib/Quox/Name.idr

63 lines
1.1 KiB
Idris
Raw Normal View History

2021-07-20 16:05:19 -04:00
module Quox.Name
import public Data.SnocList
2022-05-06 18:57:23 -04:00
import Data.List
2023-03-02 13:52:32 -05:00
import Derive.Prelude
2022-05-13 01:05:55 -04:00
%hide TT.Name
2021-07-20 16:05:19 -04:00
%default total
2022-05-13 01:05:55 -04:00
%language ElabReflection
2021-07-20 16:05:19 -04:00
public export
2022-05-13 01:05:55 -04:00
data BaseName
= UN String -- user-given name
2023-03-02 13:52:32 -05:00
%runElab derive "BaseName" [Eq, Ord]
2021-07-20 16:05:19 -04:00
2022-05-06 18:57:23 -04:00
export
Show BaseName where
show (UN x) = x
2021-07-20 16:05:19 -04:00
export
baseStr : BaseName -> String
baseStr (UN x) = x
export
FromString BaseName where
fromString = UN
public export
record Name where
constructor MakeName
mods : SnocList String
base : BaseName
2023-03-02 13:52:32 -05:00
%runElab derive "Name" [Eq, Ord]
2021-07-20 16:05:19 -04:00
2022-05-06 18:57:23 -04:00
export
Show Name where
show (MakeName mods base) =
concat $ intersperse "." $ toList $ mods :< show base
2021-07-20 16:05:19 -04:00
export
FromString Name where
fromString x = MakeName [<] (fromString x)
2023-02-22 01:40:19 -05:00
public export %inline
unq : BaseName -> Name
unq = MakeName [<]
2021-07-20 16:05:19 -04:00
export
toDots : Name -> String
toDots x = fastConcat $ cast $ map (<+> ".") x.mods :< baseStr x.base
2023-02-28 14:51:54 -05:00
export
fromList : List1 String -> Name
fromList (x ::: xs) = go [<] x xs where
go : SnocList String -> String -> List String -> Name
go mods x [] = MakeName mods (UN x)
go mods x (y :: ys) = go (mods :< x) y ys