-
Notifications
You must be signed in to change notification settings - Fork 0
/
Char.purs
50 lines (35 loc) · 1.09 KB
/
Char.purs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
module Type.Char
( Char'
, UnsafeMkChar
, class IsEmptyOrFail
, class SymIsChar
, symIsChar
)
where
import Prelude
import Prim.Symbol as Sym
import Prim.TypeError (class Fail, Beside, Doc, Text)
foreign import data Char' :: Type
foreign import data UnsafeMkChar :: Symbol -> Char'
type CharError s = Text "Expected a single character, got: \"" <> Text s <> Text "\""
infixr 6 type Beside as <>
--------------------------------------------------------------------------------
class SymIsChar (s :: Symbol) (char :: Char') | s -> char
symIsChar :: forall @sym @char. SymIsChar sym char => Unit
symIsChar = unit
instance symIsCharEmpty ::
( Fail (CharError "")
) =>
SymIsChar "" char
else instance symIsCharNonEmpty ::
( Sym.Cons head tail sym
, IsEmptyOrFail (CharError sym) tail
) =>
SymIsChar sym (UnsafeMkChar head)
--------------------------------------------------------------------------------
class IsEmptyOrFail (err :: Doc) (s :: Symbol)
instance isEmptyOrFailEmpty :: IsEmptyOrFail err ""
else instance isEmptyOrFailError ::
( Fail err
) =>
IsEmptyOrFail err s