| 
									
										
										
										
											2024-08-13 12:42:06 -06:00
										 |  |  | # typed: strict | 
					
						
							| 
									
										
										
										
											2019-04-19 15:38:03 +09:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-06-09 19:06:16 +01:00
										 |  |  | class ReadlineNonblock | 
					
						
							|  |  |  |   sig { params(io: IO).returns(String) } | 
					
						
							|  |  |  |   def self.read(io) | 
					
						
							| 
									
										
										
										
											2019-04-18 17:33:02 +09:00
										 |  |  |     line = +"" | 
					
						
							|  |  |  |     buffer = +"" | 
					
						
							| 
									
										
										
										
											2017-04-20 04:47:03 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-30 15:04:25 -07:00
										 |  |  |     begin | 
					
						
							|  |  |  |       loop do | 
					
						
							| 
									
										
										
										
											2025-06-09 19:06:16 +01:00
										 |  |  |         break if buffer == $INPUT_RECORD_SEPARATOR | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-06-09 19:06:16 +01:00
										 |  |  |         io.read_nonblock(1, buffer) | 
					
						
							| 
									
										
										
										
											2023-03-30 15:04:25 -07:00
										 |  |  |         line.concat(buffer) | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2017-04-20 04:47:03 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-30 15:04:25 -07:00
										 |  |  |       line.freeze | 
					
						
							|  |  |  |     rescue IO::WaitReadable, EOFError | 
					
						
							|  |  |  |       raise if line.empty? | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-30 15:04:25 -07:00
										 |  |  |       line.freeze | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |   end | 
					
						
							|  |  |  | end |