packages feed

uAgda-1.0.0.0: Basics.hs

{-# LANGUAGE OverloadedStrings, GeneralizedNewtypeDeriving #-}
module Basics
       (module Data.Monoid, (<>),
        module Control.Applicative,
        Irr(..), 
        Sort(..), prettySortNam, prettyRel,
        above, oneLev, next, oneRel, zero,
        Ident, Identifier(..), DisplayContext,
        Position, dummyPosition, identPosition, 
        isDummyId, modId, synthId, dummyId, idString,
        Relevance(..), (+.),
        Lattice(..)) where

import Display
import qualified RawSyntax as A
import RawSyntax (Identifier(..))
import Control.Applicative
import Data.Monoid
import Data.Sequence (Seq)


(<>) :: Monoid a => a -> a -> a
(<>) = mappend

-----------
-- Irr

newtype Irr a = Irr {fromIrr :: a}
    deriving Show

instance Eq (Irr a) where
    x == y = True

instance Pretty x => Pretty (Irr x) where
    pretty (Irr x) = pretty x

--------------
-- Ident
instance Pretty Identifier where
    pretty (Identifier (_,x)) = text x


type Ident = Irr Identifier

isDummyId (Irr (Identifier (_,"_"))) = True
isDummyId _ = False 

synthId :: String -> Ident
synthId x = Irr (Identifier (fromIrr $ dummyPosition,x))

dummyId = synthId "_"

idString :: Ident -> String
idString (Irr (Identifier (_,name))) = name

type DisplayContext = Seq Ident

----------------
-- Position

type Position = (Int,Int)

identPosition (Irr (Identifier (p,_))) = Irr p

dummyPosition = Irr (0,0)

modId :: (String -> String) -> Ident -> Ident
modId f (Irr (Identifier (pos ,x)))  = (Irr (Identifier (pos,f x)))

------------------
-- Sort

instance Lattice Int where
    (⊔) = max

newtype Relevance = Relevance {fromRel :: Int}
  deriving (Real,Enum,Integral,Num,Ord,Eq,Show,Lattice)

class Lattice a where
    (⊔) :: a -> a -> a


data Sort = Sort {sortLevel :: Int, sortRelevance :: Relevance}
  deriving Eq

instance Show Sort where
    show s = render (prettySortNam s)


instance Pretty Relevance where
    pretty (Relevance 0) = mempty
    pretty (Relevance r) = superscriptPretty r

instance Pretty Sort where
    pretty s = "∗" <> prettySortNam s  -- ⋆★*∗
    
prettySortNam s = prettyLev s <> prettyRel s

prettyRel (Sort _ r) = pretty r

prettyLev (Sort 0 _) = mempty
prettyLev (Sort l _) = subscriptPretty l

instance Num Sort where
    Sort l1 r1 + Sort l2 r2 = Sort (l1 + l2) (r1 + r2)
    negate (Sort l r) = Sort (negate l) (negate r)

above (Sort l r) = Sort (l + 1) r
oneLev = Sort 1 0

oneRel = Sort 0 1
next :: Relevance -> Relevance
next = (+ 1)

zero = Sort 0 0 

(+.) :: Relevance -> Sort -> Relevance
r +. (Sort _ r') = r + r'