module Chapter8.IDesc.FreeMonad.Examples.FileSystem where
open import Level hiding (zero ; suc)
open import Data.Unit
open import Data.Nat hiding (_*_)
open import Data.Fin hiding (lift)
open import Data.Vec hiding (_>>=_)
open import Data.Product
open import Data.String
open import Relation.Binary.PropositionalEquality
open import Chapter2.Logic
open import Chapter6.IDesc
open import Chapter6.IDesc.Tagged
open import Chapter6.IDesc.Fixpoint
open import Chapter8.IDesc.FreeMonad
open import Chapter8.IDesc.FreeMonad.IMonad
open import Chapter8.IDesc.FreeMonad.Monad
data State : Set where
Closed Open : State
infix 50 _⊢_
_⊢_ : {I : Set}(X : Set)(k : I) → Pow I
X ⊢ k = λ k' → k' ≡ k × X
ΣFS : tagDesc _ State
ΣFS = (0 , (λ _ → [])) ,
(λ { Closed → 1
; Open → 2 }) ,
(λ { Closed →
(`Σ String λ _ →
(`Π State λ s →
`Π ⊤ λ _ →
`var s) `× `1) ∷ []
; Open →
(`Π State λ s →
`Π (s ≡ Open × String) λ _ →
`var s) `× `1 ∷
(`Π State λ s →
`Π (s ≡ Closed × ⊤) λ _ →
`var s) `× `1 ∷ [] })
FS : (State → Set) → State → Set
FS = _*_ ΣFS
return : ∀{X} → X ⇒ FS X
return = `v {D = ΣFS}
openFile : (fname : String) → FS (λ _ → ⊤) Closed
openFile fname = ⟨ lift (suc zero) , fname , (λ s → return {X = λ _ → ⊤}) , lift tt ⟩
readFile : FS (λ s → s ≡ Open × String) Open
readFile = ⟨ lift (suc zero) , (λ s → return {X = String ⊢ Open}) , lift tt ⟩
closeFile : FS (λ s → s ≡ Closed × ⊤) Open
closeFile = ⟨ lift (suc (suc zero)) , (λ s → return {X = ⊤ ⊢ Closed}) , lift tt ⟩
example : FS (λ s → s ≡ Closed × String) Closed
example = openFile "test.txt" >>= λ {
{Closed} tt →
return (refl , "") ;
{Open} tt →
readFile >>= λ {
{Closed} (() , _) ;
{Open} (refl , str) →
closeFile >>= λ {
{Open} (() , _) ;
{Closed} (refl , tt) →
return (refl , str) }}}
where open RawIMonad (monad ΣFS) hiding (return)