Idris2/tests/idris2/linear001/Door.idr
2021-01-21 11:33:03 +00:00

44 lines
1.1 KiB
Idris

import Stuff
data Usage = Once | Many
data Unrestricted : Type -> Type where
Un : (x : a) -> Unrestricted a
data Use : Usage -> (Type -> Type) -> Type -> Type where
MkUse : m a -> Use l m a
contType : (Type -> Type) -> Usage -> Usage -> Type -> Type -> Type
contType m Once q a b = ((1 x : a) -> Use q m b)
contType m Many q a b = ((x : a) -> Use q m b)
(>>=) : (1 f : Use p m a) -> (1 k : contType m p q a b) -> Use q m b
pure : a -> Use u m a
One : (Type -> Type) -> Type -> Type
One = Use Once
Any : (Type -> Type) -> Type -> Type
Any = Use Many
data DoorState = Open | Closed
data Door : DoorState -> Type where
MkDoor : (isOpen : Bool) -> Door doorstate
newDoor : One m (Door Closed)
knock : (1 d : Door Closed) -> One m (Door Closed)
openDoor : (1 d : Door Closed) -> One m (Either (Door Closed) (Door Open))
closeDoor : (1 d : Door Open) -> One m (Door Closed)
deleteDoor : (1 d : Door Closed) -> Any m ()
doorProg : Any m ()
doorProg
= do d <- newDoor
Right d <- openDoor d
| Left d => deleteDoor d
d <- closeDoor d
deleteDoor d