67 lines
2.0 KiB
Elm
67 lines
2.0 KiB
Elm
|
module ResultFiltering exposing (FilterState, Filter, Msg(..), initFilterState, filterUpdate, postProcess)
|
|||
|
|
|||
|
import Regex as R
|
|||
|
import Tuple exposing (first, second)
|
|||
|
import List exposing (filter, head)
|
|||
|
import Maybe as M
|
|||
|
import List exposing (foldl)
|
|||
|
|
|||
|
type alias CharRange = String
|
|||
|
type alias Filter = (Bool, CharRange)
|
|||
|
|
|||
|
type alias FilterState = {
|
|||
|
kanji : Filter
|
|||
|
, hiragana : Filter
|
|||
|
, katakana : Filter
|
|||
|
, all : Filter
|
|||
|
}
|
|||
|
|
|||
|
initFilterState : FilterState
|
|||
|
initFilterState = {
|
|||
|
kanji = (True, "一-龯")
|
|||
|
, hiragana = (True, "ぁ–ゟ")
|
|||
|
, katakana = (True, "゠-ヿ")
|
|||
|
, all = (False, ".+")
|
|||
|
}
|
|||
|
|
|||
|
toggleFilterState : Filter -> Filter
|
|||
|
toggleFilterState (b, r) = (not b, r)
|
|||
|
|
|||
|
type Msg = Kanji
|
|||
|
| Hiragana
|
|||
|
| Katakana
|
|||
|
| All
|
|||
|
| Reset
|
|||
|
|
|||
|
{-| Handle updates regarding the filter -}
|
|||
|
filterUpdate : Msg -> FilterState -> FilterState
|
|||
|
filterUpdate msg filters=
|
|||
|
case msg of
|
|||
|
Kanji -> { filters | kanji = toggleFilterState filters.kanji }
|
|||
|
Hiragana -> { filters | hiragana = toggleFilterState filters.hiragana }
|
|||
|
Katakana -> { filters | katakana = toggleFilterState filters.katakana }
|
|||
|
All -> { filters | all = toggleFilterState filters.all }
|
|||
|
Reset -> initFilterState
|
|||
|
|
|||
|
{-| Filter out different kanji based on the current filters -}
|
|||
|
postProcess : List String -> FilterState -> List String
|
|||
|
postProcess xs filterState =
|
|||
|
let
|
|||
|
regex =
|
|||
|
(if first filterState.all
|
|||
|
then second filterState.all
|
|||
|
else [ filterState.kanji, filterState.hiragana, filterState.katakana ]
|
|||
|
|> List.map (\(b,r) -> if b then r else "")
|
|||
|
|> foldl (++) ""
|
|||
|
|> \s -> "^[" ++ s ++ "]*$")
|
|||
|
|> R.fromString
|
|||
|
|> M.withDefault R.never
|
|||
|
|
|||
|
matchesRegex : String -> Bool
|
|||
|
matchesRegex x = head (R.find regex x)
|
|||
|
|> Maybe.map .match
|
|||
|
|> Maybe.withDefault ""
|
|||
|
|> (==) x
|
|||
|
in
|
|||
|
filter matchesRegex xs
|