import Control
. Monad . Trans
. State
import Data. List ( intercalate)
import Control
. Monad . IO . Class
( liftIO
)
type TodoState a
= StateT
[ Todo
] IO a
data Todo
= Todo
{ text
:: String , categories :: [ Category]
addItem
:: String -> [ Category
] -> TodoState
( ) addItem txt cs = modify ( Todo txt cs:)
updateItem old new
= modify
( map ( \x
-> if text x
== old
then x
{ text
= new
} else x
) )
viewList :: [ Category] -> TodoState ( )
viewList cs = do list <- get
liftIO $ do
filterCategory :: [ Category] -> [ Todo] -> [ Todo]
runTodo
:: TodoState
( ) -> IO ( ) runTodo
= flip evalStateT
[ ]
main = runTodo $ do
addItem "Go to work" [ "Programming" ]
addItem "Create Sine Waves in C" [ "Music" , "Programming" ]
addItem "Play my synth" [ "Music" ]
viewList [ "Music" ]
updateItem "Create Sine Waves in C" "Create Sine Waves in Python"
viewList [ "Programming" ]
viewList [ "Programming" , "Music" ]
aW1wb3J0IENvbnRyb2wuTW9uYWQuVHJhbnMuU3RhdGUKaW1wb3J0IERhdGEuTGlzdCAoaW50ZXJjYWxhdGUpCmltcG9ydCBDb250cm9sLk1vbmFkLklPLkNsYXNzIChsaWZ0SU8pCgp0eXBlIFRvZG9TdGF0ZSBhID0gU3RhdGVUIFtUb2RvXSBJTyBhCnR5cGUgQ2F0ZWdvcnkgPSBTdHJpbmcKCmRhdGEgVG9kbyA9IFRvZG8geyB0ZXh0IDo6IFN0cmluZwogICAgICAgICAgICAgICAgICwgY2F0ZWdvcmllcyA6OiBbQ2F0ZWdvcnldCiAgICAgICAgICAgICAgICAgfSBkZXJpdmluZyAoU2hvdykKCmFkZEl0ZW0gOjogU3RyaW5nIC0+IFtDYXRlZ29yeV0gLT4gVG9kb1N0YXRlICgpCmFkZEl0ZW0gdHh0IGNzID0gbW9kaWZ5IChUb2RvIHR4dCBjczopCgp1cGRhdGVJdGVtIDo6IFN0cmluZyAtPiBTdHJpbmcgLT4gVG9kb1N0YXRlICgpCnVwZGF0ZUl0ZW0gb2xkIG5ldyA9IG1vZGlmeSAobWFwIChceCAtPiBpZiB0ZXh0IHggPT0gb2xkIHRoZW4geCB7dGV4dCA9IG5ld30gZWxzZSB4KSkKCnZpZXdMaXN0IDo6IFtDYXRlZ29yeV0gLT4gVG9kb1N0YXRlICgpCnZpZXdMaXN0IGNzID0gZG8gbGlzdCA8LSBnZXQKICAgICAgICAgICAgICAgICBsaWZ0SU8gJCBkbwogICAgICAgICAgICAgICAgIHB1dFN0ckxuICQgIiMgIiArKyBpbnRlcmNhbGF0ZSAiICYgIiBjcwogICAgICAgICAgICAgICAgIG1hcE1fIChwdXRTdHJMbiAuICgiLSAiICsrKSAuIHRleHQpICQgZmlsdGVyQ2F0ZWdvcnkgY3MgbGlzdAogICAgICAgICAgICAgICAgIHB1dFN0ciAiXG4iCgpmaWx0ZXJDYXRlZ29yeSA6OiBbQ2F0ZWdvcnldIC0+IFtUb2RvXSAtPiBbVG9kb10KZmlsdGVyQ2F0ZWdvcnkgY3MgPSBmaWx0ZXIgKGFueSAoYGVsZW1gIGNzKSAuIGNhdGVnb3JpZXMpCgpydW5Ub2RvIDo6IFRvZG9TdGF0ZSAoKSAtPiBJTyAoKQpydW5Ub2RvID0gZmxpcCBldmFsU3RhdGVUIFtdCgptYWluIDo6IElPICgpCm1haW4gPSBydW5Ub2RvICQgZG8KICAgIGFkZEl0ZW0gIkdvIHRvIHdvcmsiIFsiUHJvZ3JhbW1pbmciXQogICAgYWRkSXRlbSAiQ3JlYXRlIFNpbmUgV2F2ZXMgaW4gQyIgWyJNdXNpYyIsICJQcm9ncmFtbWluZyJdCiAgICBhZGRJdGVtICJQbGF5IG15IHN5bnRoIiBbIk11c2ljIl0KICAgIHZpZXdMaXN0IFsiTXVzaWMiXQogICAgdXBkYXRlSXRlbSAiQ3JlYXRlIFNpbmUgV2F2ZXMgaW4gQyIgIkNyZWF0ZSBTaW5lIFdhdmVzIGluIFB5dGhvbiIKICAgIHZpZXdMaXN0IFsiUHJvZ3JhbW1pbmciXQogICAgdmlld0xpc3QgWyJQcm9ncmFtbWluZyIsICJNdXNpYyJdCg==