@@ -8,7 +8,7 @@
9module Rel8.Kind.Labels
9module Rel8.Kind.Labels
11− , SLabels( SLabel, SLabels )
11+ , SLabels( SNil, SCons )
12 , KnownLabels( labelsSing )
12 , KnownLabels( labelsSing )
13 , renderLabels
13 , renderLabels
@@ -16,7 +16,8 @@ where
18import Data.Kind ( Constraint, Type )
18import Data.Kind ( Constraint, Type )
19−import Data.List.NonEmpty ( NonEmpty( (:|) ), (<|) )
19+import Data.List.NonEmpty ( NonEmpty, nonEmpty )
20+import Data.Maybe ( fromMaybe )
20import Data.Proxy ( Proxy( Proxy ) )
21import Data.Proxy ( Proxy( Proxy ) )
21import GHC.TypeLits ( KnownSymbol, Symbol, symbolVal )
22import GHC.TypeLits ( KnownSymbol, Symbol, symbolVal )
22import Prelude
23import Prelude
@@ -28,8 +29,8 @@ type Labels = [Symbol]
29type SLabels :: Labels -> Type
30type SLabels :: Labels -> Type
30data SLabels labels where
31data SLabels labels where
31− SLabel :: KnownSymbol label => Proxy label -> SLabels '[label]
32+ SNil :: SLabels '[]
32− SLabels :: KnownSymbol label => Proxy label -> SLabels labels -> SLabels (label ': labels)
33+ SCons :: KnownSymbol label => Proxy label -> SLabels labels -> SLabels (label ': labels)
35type KnownLabels :: Labels -> Constraint
36type KnownLabels :: Labels -> Constraint
@@ -37,25 +38,20 @@ class KnownLabels labels where
37 labelsSing :: SLabels labels
38 labelsSing :: SLabels labels
40−instance KnownSymbol label => KnownLabels (label ': '[]) where
41+instance KnownLabels '[] where
41− labelsSing = SLabel Proxy
42+ labelsSing = SNil
44−instance (KnownSymbol label, KnownLabels (label_ ': labels)) =>
45+instance (KnownSymbol label, KnownLabels labels) =>
45− KnownLabels (label ': (label_ ': labels))
46+ KnownLabels (label ': labels)
47− labelsSing = SLabels Proxy labelsSing
48+ labelsSing = SCons Proxy labelsSing
50renderLabels :: SLabels labels -> NonEmpty String
51renderLabels :: SLabels labels -> NonEmpty String
51−renderLabels = cleanup . go
52+renderLabels = fromMaybe (pure "anon") . nonEmpty . go
53− go :: SLabels labels -> NonEmpty String
54+ go :: SLabels labels -> [String]
54 go = \case
55 go = \case
55− SLabel label -> pure (symbolVal label)
56+ SNil -> []
56− SLabels label labels -> symbolVal label <| go labels
57+ SCons label labels -> symbolVal label : go labels
58− cleanup ("" :| []) = "anon" :| []
59− cleanup (a :| []) = a :| []
60− cleanup (a :| [""]) = a :| []
61− cleanup (a :| (b : c)) = a <| cleanup (b :| c)