inch-0.1.0: src/Language/Inch/Kit.lhs
> {-# LANGUAGE TypeOperators, GADTs, DeriveFunctor, DeriveFoldable, DeriveTraversable,
> RankNTypes, TypeFamilies #-}
> module Language.Inch.Kit where
> import Control.Applicative
> import Data.Foldable hiding (foldr)
> import Data.List
> import Data.Monoid
> import Data.Traversable
> import Debug.Trace
> (<.>) :: Monoid a => a -> a -> a
> (<.>) = mappend
> data Ex f where
> Ex :: f a -> Ex f
> unEx :: Ex t -> (forall a . t a -> b) -> b
> unEx (Ex t) f = f t
> unEx2 :: (forall a . t a -> b) -> Ex t -> b
> unEx2 f (Ex t) = f t
> mapEx :: (forall a . f a -> g a) -> Ex f -> Ex g
> mapEx f (Ex t) = Ex (f t)
> travEx :: Functor t => (forall a . f a -> t (g a)) -> Ex f -> t (Ex g)
> travEx f (Ex t) = Ex <$> f t
> class HetEq t where
> hetEq :: t a -> t b -> (a ~ b => x) -> x -> x
> (=?=) :: t a -> t b -> Bool
> s =?= t = hetEq s t True False
> instance HetEq t => Eq (Ex t) where
> Ex s == Ex t = s =?= t
> hetElem :: HetEq t => t a -> [Ex t] -> Bool
> hetElem _ [] = False
> hetElem x (Ex y:ys) = x =?= y || hetElem x ys
> class HetOrd t where
> (<?=) :: t a -> t b -> Bool
> data S a where
> S :: a -> S a
> Z :: S a
> deriving (Eq, Ord, Show, Functor, Foldable, Traversable)
> bind :: (Functor f, Eq a) => a -> f a -> f (S a)
> bind x = fmap inS
> where inS y | x == y = Z
> | otherwise = S y
> unbind :: Functor f => a -> f (S a) -> f a
> unbind x = fmap unS
> where unS Z = x
> unS (S a) = a
> subst :: (Monad m, Eq a) => a -> m a -> m a -> m a
> subst a t = (>>= f)
> where f b | a == b = t
> | otherwise = return b
> wk :: Applicative f => (a -> f b) -> (S a -> f (S b))
> wk _ Z = pure Z
> wk g (S a) = fmap S (g a)
Really we want g to be a pointed functor!
> wkwk :: (Applicative f, Functor g) =>
> (S b -> g (S b)) -> (a -> f (g b)) -> (S a -> f (g (S b)))
> wkwk p _ Z = pure $ p Z
> wkwk _ g (S a) = fmap S <$> g a
> data a := b = a := b
> deriving (Eq, Show, Functor, Foldable, Traversable)
> data a ::: b = a ::: b
> deriving (Eq, Show, Functor, Foldable, Traversable)
> infix 3 :=
> infix 4 :::
> tmOf :: a ::: b -> a
> tmOf (a ::: _) = a
> tyOf :: a ::: b -> b
> tyOf (_ ::: b) = b
> unzipAsc :: [(a ::: b)] -> ([a] ::: [b])
> unzipAsc xs = map tmOf xs ::: map tyOf xs
> mtrace :: Monad m => String -> m ()
> mtrace s = trace s (return ()) >>= \ () -> return ()
> newtype Id a = Id {unId :: a}
> deriving (Functor, Foldable, Traversable)
> instance Applicative Id where
> pure = Id
> Id f <*> Id s = Id (f s)
> unions :: Eq a => [[a]] -> [a]
> unions = foldr union []