Input 모나드는 먼저 저기 wait에서 주는 EraConsoleResponse 타입을 적절히 처리해주는 모나드입니다





먼저 YmInput trait를 만들고 출력처리와 Request획득 그리고 응답을 파싱하는 메소드를 만듭니다



그리고 이 YmInput의 함수들로 직접 T를 얻는 핸들러가 바로





YmValidInput trait 입니다 저기에 console만 넣으면 알아서 YmResult T를 뽑아줍니다




이제 이 모나드들을 활용할 타입들을 만들어봅시다


먼저 YmInput들을 엮을 combinator를 만들었습니다






and_then과 map입니다


and_then은 하스켈로치면 bind와 같습니다



그리고 YmInput을 YmValidInput으로 만들어줄 validator입니다





DefaultValue는 parse에 실패했을경우 저장된 기본값을 복사해서 넘겨줍니다


그래서 T: Clone이 필요하고요






FailAction은 parse에 실패했을때 저장된 action을 실행하고 다시 반복합니다


이때 action의 반환값이 Some일경우엔 그걸 그대로 반환시켜줍니다




이제 얘들을 편리하게 사용시켜줄 trait를 하나 만들었습니다




YmInputExt입니다 모든 YmInput을 구현한 Sized 타입은 이 타입을 구현하기에 이 맴버 함수들을 쓸수있습니다



이제 기반 타입들을 다 만들었으니 쓰기 편리한 유틸함수를 만들어봅시다






btns와 timeout으로 YmInput을 만들어주는 함수입니다


YmBaseInput은




별거없고 그냥 클로저랑 Request 래핑해놓은 타입입니다





이제 구조가 대강 완성됐으니 실제로 써보겠습니다



먼저 유틸함수와 validator로 ValidInput을 만듭니다




그리고 await 매크로에 넣으면 뿅