module Choreography.Locations where
import Data.Proxy (Proxy (..))
import GHC.TypeLits (KnownSymbol, Symbol, symbolVal)
type LocTm = String
type LocTy = Symbol
data Member (x :: k) (xs :: [k]) where
First :: forall xs x xs'. (xs ~ (x ': xs')) => Member x (x ': xs')
Later :: Member x xs -> Member x (y ': xs)
newtype Subset xs ys = Subset
{
forall {k} (xs :: [k]) (ys :: [k]).
Subset xs ys -> forall (x :: k). Member x xs -> Member x ys
inSuper :: forall x. Member x xs -> Member x ys
}
refl :: Subset xs xs
refl :: forall {k} (xs :: [k]). Subset xs xs
refl = (forall (x :: k). Member x xs -> Member x xs) -> Subset xs xs
forall {k} (xs :: [k]) (ys :: [k]).
(forall (x :: k). Member x xs -> Member x ys) -> Subset xs ys
Subset Member x xs -> Member x xs
forall (x :: k). Member x xs -> Member x xs
forall a. a -> a
id
transitive :: Subset xs ys -> Subset ys zs -> Subset xs zs
transitive :: forall {k} (xs :: [k]) (ys :: [k]) (zs :: [k]).
Subset xs ys -> Subset ys zs -> Subset xs zs
transitive Subset xs ys
sxy Subset ys zs
syz = (forall (x :: k). Member x xs -> Member x zs) -> Subset xs zs
forall {k} (xs :: [k]) (ys :: [k]).
(forall (x :: k). Member x xs -> Member x ys) -> Subset xs ys
Subset ((forall (x :: k). Member x xs -> Member x zs) -> Subset xs zs)
-> (forall (x :: k). Member x xs -> Member x zs) -> Subset xs zs
forall a b. (a -> b) -> a -> b
$ Subset ys zs -> forall (x :: k). Member x ys -> Member x zs
forall {k} (xs :: [k]) (ys :: [k]).
Subset xs ys -> forall (x :: k). Member x xs -> Member x ys
inSuper Subset ys zs
syz (Member x ys -> Member x zs)
-> (Member x xs -> Member x ys) -> Member x xs -> Member x zs
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Subset xs ys -> forall (x :: k). Member x xs -> Member x ys
forall {k} (xs :: [k]) (ys :: [k]).
Subset xs ys -> forall (x :: k). Member x xs -> Member x ys
inSuper Subset xs ys
sxy
nobody :: Subset '[] ys
nobody :: forall {k} (ys :: [k]). Subset '[] ys
nobody = (forall (x :: k). Member x '[] -> Member x ys) -> Subset '[] ys
forall {k} (xs :: [k]) (ys :: [k]).
(forall (x :: k). Member x xs -> Member x ys) -> Subset xs ys
Subset \case {}
consSet :: forall xs x xs'. (xs ~ (x ': xs')) => Subset xs' (x ': xs')
consSet :: forall {a} (xs :: [a]) (x :: a) (xs' :: [a]).
(xs ~ (x : xs')) =>
Subset xs' (x : xs')
consSet = (forall (x :: a). Member x xs' -> Member x (x : xs'))
-> Subset xs' (x : xs')
forall {k} (xs :: [k]) (ys :: [k]).
(forall (x :: k). Member x xs -> Member x ys) -> Subset xs ys
Subset Member x xs' -> Member x (x : xs')
forall (x :: a). Member x xs' -> Member x (x : xs')
forall {k} (x :: k) (h :: [k]) (ts :: k).
Member x h -> Member x (ts : h)
Later
consSuper :: forall xs ys y. Subset xs ys -> Subset xs (y ': ys)
consSuper :: forall {a} (xs :: [a]) (ys :: [a]) (y :: a).
Subset xs ys -> Subset xs (y : ys)
consSuper Subset xs ys
sxy = Subset xs ys -> Subset ys (y : ys) -> Subset xs (y : ys)
forall {k} (xs :: [k]) (ys :: [k]) (zs :: [k]).
Subset xs ys -> Subset ys zs -> Subset xs zs
transitive Subset xs ys
sxy Subset ys (y : ys)
forall {a} (xs :: [a]) (x :: a) (xs' :: [a]).
(xs ~ (x : xs')) =>
Subset xs' (x : xs')
consSet
(@@) :: Member x ys -> Subset xs ys -> Subset (x ': xs) ys
infixr 5 @@
Member x ys
mxy @@ :: forall {k} (x :: k) (ys :: [k]) (xs :: [k]).
Member x ys -> Subset xs ys -> Subset (x : xs) ys
@@ Subset xs ys
sxy = (forall (x :: k). Member x (x : xs) -> Member x ys)
-> Subset (x : xs) ys
forall {k} (xs :: [k]) (ys :: [k]).
(forall (x :: k). Member x xs -> Member x ys) -> Subset xs ys
Subset \case
Member x (x : xs)
First -> Member x ys
Member x ys
mxy
Later Member x xs
mxxs -> Subset xs ys -> forall (x :: k). Member x xs -> Member x ys
forall {k} (xs :: [k]) (ys :: [k]).
Subset xs ys -> forall (x :: k). Member x xs -> Member x ys
inSuper Subset xs ys
sxy Member x xs
Member x xs
mxxs
toLocTm ::
forall (l :: LocTy) (ps :: [LocTy]).
(KnownSymbol l) =>
Member l ps ->
LocTm
toLocTm :: forall (l :: LocTy) (ps :: [LocTy]).
KnownSymbol l =>
Member l ps -> LocTm
toLocTm Member l ps
_ = Proxy l -> LocTm
forall (n :: LocTy) (proxy :: LocTy -> *).
KnownSymbol n =>
proxy n -> LocTm
symbolVal (forall {k} (t :: k). Proxy t
forall (t :: LocTy). Proxy t
Proxy @l)
toLocs :: forall (ls :: [LocTy]) (ps :: [LocTy]). (KnownSymbols ls) => Subset ls ps -> [LocTm]
toLocs :: forall (ls :: [LocTy]) (ps :: [LocTy]).
KnownSymbols ls =>
Subset ls ps -> [LocTm]
toLocs Subset ls ps
_ = case forall (ls :: [LocTy]). KnownSymbols ls => TySpine ls
tySpine @ls of
TySpine ls
TyNil -> []
TySpine ls
TyCons -> Member h (h : ts) -> LocTm
forall (l :: LocTy) (ps :: [LocTy]).
KnownSymbol l =>
Member l ps -> LocTm
toLocTm (forall (h :: [LocTy]) (x :: LocTy) (ts :: [LocTy]).
(h ~ (x : ts)) =>
Member x (x : ts)
forall {a} (h :: [a]) (x :: a) (ts :: [a]).
(h ~ (x : ts)) =>
Member x (x : ts)
First @ls) LocTm -> [LocTm] -> [LocTm]
forall a. a -> [a] -> [a]
: Subset ts (h : ts) -> [LocTm]
forall (ls :: [LocTy]) (ps :: [LocTy]).
KnownSymbols ls =>
Subset ls ps -> [LocTm]
toLocs (forall (xs :: [LocTy]) (x :: LocTy) (xs' :: [LocTy]).
(xs ~ (x : xs')) =>
Subset xs' (x : xs')
forall {a} (xs :: [a]) (x :: a) (xs' :: [a]).
(xs ~ (x : xs')) =>
Subset xs' (x : xs')
consSet @ls)
data TySpine ps where
TyCons :: (KnownSymbol h, KnownSymbols ts) => TySpine (h ': ts)
TyNil :: TySpine '[]
class KnownSymbols ls where
tySpine :: TySpine ls
instance KnownSymbols '[] where
tySpine :: TySpine '[]
tySpine = TySpine '[]
TyNil
instance (KnownSymbols ls, KnownSymbol l) => KnownSymbols (l ': ls) where
tySpine :: TySpine (l : ls)
tySpine = TySpine (l : ls)
forall (h :: LocTy) (ts :: [LocTy]).
(KnownSymbol h, KnownSymbols ts) =>
TySpine (h : ts)
TyCons