import { filter } from '@januswel/object-utilities' ; import { assert } from '../../lib/assert' ; import * as Todo from './todo' ; export interface Model { [ id ] : Todo . Model ; } export function factory ( newValues ? ) { if ( ! newValues ) { return { } ; } return newValues . reduce < Model > ( ( result , newValue ) => { const newTodo = Todo . factory ( newValue ) ; result [ newTodo . id ] = newTodo ; return result ; } , { } ) ; } export function add ( todos , newTodo ) { return { ... todos , [ newTodo . id ] : newTodo , } ; } export function remove ( todos , targetId ) { return filter ( todos , id => id !== targetId ) ; } export function update ( todos , id , values ) { assert ( id in todos ) ; return { ... todos , [ id ] : Todo . change ( todos [ id ] , values ) , } ; } export function toggle ( todos , id ) { assert ( id in todos ) ; return { ... todos , [ id ] : Todo . toggle ( todos [ id ] ) , } ; } export function getNumof ( todos ) { return Object . keys ( todos ) . length ; } export function findByTitle ( todos , title ) { return Object . values ( todos ) . filter ( todo => todo . title === title ) ; }