packages feed

jni-0.7.0: src/linear-types/Data/Singletons.hs

{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE QuantifiedConstraints #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}

module Data.Singletons where

import Data.Kind (Type)
import GHC.TypeLits (KnownSymbol)

type family Sing :: k -> Data.Kind.Type

class SingI ty  where
  sing :: Sing ty

instance SingI ('[] :: [k]) where
  sing = SNil
instance (SingI x, SingI xs) => SingI (x ': xs) where
  sing = SCons (sing @x) (sing @xs)

type instance Sing = SSymbol

data SSymbol n = KnownSymbol n => SSym

instance KnownSymbol n => SingI n where
  sing = SSym

type instance Sing = SList

data SList (xs :: [k]) where
  SNil :: SList '[]
  SCons :: Sing x -> SList xs -> SList (x ': xs)

data SomeSing k where
  SomeSing :: Sing (a :: k) -> SomeSing k

instance ShowSing k => Show (SList(a :: [k])) where
  showsPrec _ SNil = showString "SNil"
  showsPrec d sxs@(SCons ty tys) =
    case sxs of
      (_ :: SList (x : ys)) -> showParen (d > 10) $
        showString "SCons " . showsPrec 11 ty . showChar ' ' . showsPrec 11 tys
        :: (ShowSing' x, ShowSing' ys) => ShowS

class    (forall (z :: k). ShowSing' z) => ShowSing k
instance (forall (z :: k). ShowSing' z) => ShowSing k

class    Show (Sing z) => ShowSing' (z :: k)
instance Show (Sing z) => ShowSing' z