packages feed

tempus-0.1.0: Prelude.tp

-- ------------------------
--    The Tempus Prelude
-- ------------------------


-- * Functions

-- id : a -> a
value id = \ x . x

-- curry : (a * b -> c) -> a -> b -> c
value curry = \ f . \ x . \ y . f (x, y)

-- uncurry : (a -> b -> c) -> a * b -> c
value uncurry = \ f . \ p . f (first p) (second p)


-- * Tuples

-- pair : a -> b -> a * b
value pair = \ x . \ y . (x, y)

-- normalize : (a * b) * c -> a * b * c
value normalize = \ p . (first (first p), second (first p), second p)

-- onFirst : (a -> b) -> (a * c) -> (b * c)
value onFirst = \ f . \ p . (f (first p), second p)

-- onSecond : (a -> b) -> (c * a) -> (c * b)
value onSecond = \ f . \ p . (first p, f (second p))


-- * Booleans

type Bool = 1 + 1

-- false : Bool
value false = left ()

-- true : Bool
value true = right ()

-- branch : a -> a -> Bool -> a
value branch = \ x . \ y . case (\ _ . x) (\ _ . y)

-- not : Bool -> Bool
value not = branch true false

-- and : Bool -> Bool -> Bool
value and = branch (\ _ . false) id

-- or : Bool -> Bool -> Bool
value or = branch id (\ _ . true)

-- xor : Bool -> Bool -> Bool
value xor = branch id not


-- * Extended behaviors

type Behavior a = a * behavior a

-- Behavior : a -> behavior a -> Behavior a
value Behavior = pair

-- head : Behavior a -> a
value head = first

-- tail : Behavior a -> behavior a
value tail = second

-- cut : Behavior a -> event b -> event (Behavior a * b)
value cut = \ b . \ e . const pair <*> expand (tail b) <.> e


-- * Extended events

type Event a = a + event a

-- now : a -> Event a
value now = left

-- later : event a -> Event a
value later = right


-- * Event streams

type EventStream a = nu s . event (a * s)