import Control.Linear.LIO foo : LinearIO io => L io () foo = do putStrLn "Hello" putStrLn "World" data DoorState = CLOSED | OPEN data OpenResult = Jammed | OK data Door : DoorState -> Type where newDoor : LinearIO io => (1 _ : (1 _ : Door CLOSED) -> L io ()) -> L io () openDoor : LinearIO io => (1 _ : Door CLOSED) -> L io {use=1} (Res OpenResult (\case Jammed => Door CLOSED OK => Door OPEN)) closeDoor : LinearIO io => (1 _ : Door OPEN) -> L io {use=1} (Door CLOSED) deleteDoor : LinearIO io => (1 _ : Door CLOSED) -> L io () doorProg : LinearIO io => L io () doorProg = newDoor $ \d => do ok # d <- openDoor d case ok of Jammed => deleteDoor d OK => do d <- closeDoor d putStrLn "Yay" deleteDoor d