@@ -0,0 +1,30 @@
1+module Data.Schematic.Path where
2+
3+import Data.Singletons
4+import Data.Singletons.TypeLits
5+import Data.Schematic.Utils
6+import Data.Singletons.Prelude
7+import Data.Text as T
8+
9+
10+data PathSegment = Key Symbol | Ix Nat
11+
12+data instance Sing (jp :: PathSegment) where
13+ SKey :: (KnownSymbol k, Known (Sing k)) => Sing (k :: Symbol) -> Sing (Key k)
14+ SIx :: (KnownNat n, Known (Sing n)) => Sing (n :: Nat) -> Sing (Ix n)
15+
16+instance (KnownSymbol k, Known (Sing k))
17+ => Known (Sing (Key k)) where
18+ known = SKey known
19+
20+instance (KnownNat n, Known (Sing n))
21+ => Known (Sing (Ix n)) where
22+ known = SIx known
23+
24+pathToText :: Sing (ps :: [PathSegment]) -> Text
25+pathToText = T.pack . go ""
26+ where
27+ go :: String -> Sing (ps :: [PathSegment]) -> String
28+ go acc SNil = acc
29+ go acc (SCons (SKey k) tl) = go (acc ++ "." ++ symbolVal k) tl
30+ go acc (SCons (SIx n) tl) = go (acc ++ "[" ++ show (natVal n) ++ "]") tl