packages feed

espial-0.0.7: purs/src/Component/BList.purs

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)