espial/purs/src/Component/BList.purs
Jon Schoning 2e3e7097e6 init
2019-01-30 20:54:47 -06:00

49 lines
1.3 KiB
Plaintext

module Component.BList where
import Prelude
import Component.BMark (BMessage(..), BQuery, bmark)
import Model (Bookmark, BookmarkId)
import Data.Array (filter)
import Data.Maybe (Maybe(..))
import Effect.Aff (Aff)
import Halogen as H
import Halogen.HTML as HH
import Halogen.HTML.Events as HE
type BSlot = BookmarkId
data LQuery a =
HandleBMessage BSlot BMessage a
blist :: Array Bookmark -> H.Component HH.HTML LQuery Unit Void Aff
blist st =
H.parentComponent
{ initialState: const st
, render
, eval
, receiver: const Nothing
}
where
render :: Array Bookmark -> H.ParentHTML LQuery BQuery BSlot Aff
render bms =
HH.div_ (map renderBookmark bms)
where
renderBookmark :: Bookmark -> H.ParentHTML LQuery BQuery BSlot Aff
renderBookmark b =
HH.slot
b.bid
(bmark b)
unit
(HE.input (HandleBMessage b.bid))
eval :: LQuery ~> H.ParentDSL (Array Bookmark) LQuery BQuery BSlot Void Aff
eval (HandleBMessage p BNotifyRemove next) = do
H.modify_ (removeBookmark p)
pure next
where
removeBookmark :: BookmarkId -> Array Bookmark -> Array Bookmark
removeBookmark bookmarkId = filter (\b -> b.bid /= bookmarkId)