{-# LANGUAGE PolyKinds, StandaloneDeriving #-}
#if __GLASGOW_HASKELL__ < 806
{-# LANGUAGE TypeInType #-}
#endif
module Data.SOP.Sing
(
SList(..)
, SListI
, sList
, para_SList
, case_SList
, Shape(..)
, shape
, lengthSList
) where
import Data.Kind (Type)
import Data.Proxy (Proxy(..))
import Data.SOP.Constraint
data SList :: [k] -> Type where
SNil :: SList '[]
SCons :: SListI xs => SList (x ': xs)
deriving instance Show (SList (xs :: [k]))
deriving instance Eq (SList (xs :: [k]))
deriving instance Ord (SList (xs :: [k]))
para_SList ::
SListI xs
=> r '[]
-> (forall y ys . (SListI ys) => r ys -> r (y ': ys))
-> r xs
para_SList :: r '[]
-> (forall (y :: k) (ys :: [k]). SListI ys => r ys -> r (y : ys))
-> r xs
para_SList r '[]
nil forall (y :: k) (ys :: [k]). SListI ys => r ys -> r (y : ys)
cons =
Proxy Top
-> r '[]
-> (forall (y :: k) (ys :: [k]).
(Top y, All Top ys) =>
r ys -> r (y : ys))
-> r xs
forall k (c :: k -> Constraint) (xs :: [k])
(proxy :: (k -> Constraint) -> *) (r :: [k] -> *).
All c xs =>
proxy c
-> r '[]
-> (forall (y :: k) (ys :: [k]).
(c y, All c ys) =>
r ys -> r (y : ys))
-> r xs
cpara_SList (forall k. Proxy Top
forall k (t :: k). Proxy t
Proxy :: Proxy Top) r '[]
nil forall (y :: k) (ys :: [k]).
(Top y, All Top ys) =>
r ys -> r (y : ys)
forall (y :: k) (ys :: [k]). SListI ys => r ys -> r (y : ys)
cons
{-# INLINE para_SList #-}
case_SList ::
SListI xs
=> r '[]
-> (forall y ys . (SListI ys) => r (y ': ys))
-> r xs
case_SList :: r '[]
-> (forall (y :: k) (ys :: [k]). SListI ys => r (y : ys)) -> r xs
case_SList r '[]
nil forall (y :: k) (ys :: [k]). SListI ys => r (y : ys)
cons =
Proxy Top
-> r '[]
-> (forall (y :: k) (ys :: [k]). (Top y, All Top ys) => r (y : ys))
-> r xs
forall k (c :: k -> Constraint) (xs :: [k])
(proxy :: (k -> Constraint) -> *) (r :: [k] -> *).
All c xs =>
proxy c
-> r '[]
-> (forall (y :: k) (ys :: [k]). (c y, All c ys) => r (y : ys))
-> r xs
ccase_SList (forall k. Proxy Top
forall k (t :: k). Proxy t
Proxy :: Proxy Top) r '[]
nil forall (y :: k) (ys :: [k]). (Top y, All Top ys) => r (y : ys)
forall (y :: k) (ys :: [k]). SListI ys => r (y : ys)
cons
{-# INLINE case_SList #-}
sList :: SListI xs => SList xs
sList :: SList xs
sList = Proxy Top
-> SList '[]
-> (forall (y :: k) (ys :: [k]).
(Top y, All Top ys) =>
SList (y : ys))
-> SList xs
forall k (c :: k -> Constraint) (xs :: [k])
(proxy :: (k -> Constraint) -> *) (r :: [k] -> *).
All c xs =>
proxy c
-> r '[]
-> (forall (y :: k) (ys :: [k]). (c y, All c ys) => r (y : ys))
-> r xs
ccase_SList (forall k. Proxy Top
forall k (t :: k). Proxy t
Proxy :: Proxy Top) SList '[]
forall k. SList '[]
SNil forall (y :: k) (ys :: [k]). (Top y, All Top ys) => SList (y : ys)
forall k (xs :: [k]) (x :: k). SListI xs => SList (x : xs)
SCons
data Shape :: [k] -> Type where
ShapeNil :: Shape '[]
ShapeCons :: SListI xs => Shape xs -> Shape (x ': xs)
deriving instance Show (Shape xs)
deriving instance Eq (Shape xs)
deriving instance Ord (Shape xs)
shape :: forall k (xs :: [k]). SListI xs => Shape xs
shape :: Shape xs
shape = case SList xs
forall k (xs :: [k]). SListI xs => SList xs
sList :: SList xs of
SList xs
SNil -> Shape xs
forall k. Shape '[]
ShapeNil
SList xs
SCons -> Shape xs -> Shape (x : xs)
forall k (xs :: [k]) (x :: k).
SListI xs =>
Shape xs -> Shape (x : xs)
ShapeCons Shape xs
forall k (xs :: [k]). SListI xs => Shape xs
shape
lengthSList :: forall k (xs :: [k]) proxy. SListI xs => proxy xs -> Int
lengthSList :: proxy xs -> Int
lengthSList proxy xs
_ = Shape xs -> Int
forall k (xs' :: [k]). Shape xs' -> Int
lengthShape (Shape xs
forall k (xs :: [k]). SListI xs => Shape xs
shape :: Shape xs)
where
lengthShape :: forall xs'. Shape xs' -> Int
lengthShape :: Shape xs' -> Int
lengthShape Shape xs'
ShapeNil = Int
0
lengthShape (ShapeCons Shape xs
s) = Int
1 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Shape xs -> Int
forall k (xs' :: [k]). Shape xs' -> Int
lengthShape Shape xs
s